RPC简介
一、为什么要有RPC
????随着项目业务越来越复杂,业务量越来越大,单个应用或者一台机器的资源肯定是背负不起的。那现在应该怎么做?将核心业务抽取出来,作为独立的服务,放到其他服务器上或者形成集群。这个时候就会请出RPC,系统演变为分布式的架构。
二、什么是RPC
????RPC,Remote Procedure Call,远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络的技术。
三、一次完整的RPC同步调用流程
????(1)服务消费方(client)以本地调用的方式调用客户端存根 ????????客户端存根就是远程方法在本地的模拟对象,一样也有方法名,方法参数。client stub接收到调用后负责将方法名、方法参数等包装,并将包装后的消息通过网络发送到服务端。 ????(2)服务端收到消息后,交给代理存根在服务器的部分后进行解码为实际的方法名和参数。 ????(3)server stub根据解码结果调用服务器上本地的实际服务。 ????(4)本地服务执行并将结果返回给server stub。 ????(5)server stub将返回结果打包成消息并发送至消费方。 ????(6)client stub接收到消息,并进行解码。 ????(7)服务消费方得到最终结果。 ????RPC框架的目标是要将中间步骤都封装起来,让我们进行远程方法调用的时候感觉到就像在本地调用一样。
四、RPC和HTTP
????rpc字面意思就是远程过程调用,只是对不同应用间相互调用的一种描述,一种思想。 ????实现方式可以是最直接的tcp通信,也可以是http方式,甚至可以是消息中间件。例如:dubbo是基于tcp的,gRPC是基于http2.0的。 ????所以,RPC和HTTP完全是两个不同层级的东西,他们之间并不具有可比性。
五、实现RPC框架需要解决的问题
1、代理问题
????代理要解决的是被调用服务本质上是远程的服务,但是调用者不知道也不关心,调用者只要结果,具体的事情由代理的那个对象来负责这件事。在RPC使用代理要添加的额外功能就是通过网络访问远程服务。
2、序列化问题
????序列化问题在计算机里具体是什么?我们的方法调用,有方法名,方法参数,这些可能是字符串,可能是我们自己定义的java类,但是在网络上传输或者保存在硬盘的时候,网络或者硬盘并不认得什么字符串或者javabean,它只认得二进制的01串,怎么办?要进行序列化,网络传输后要进行实际调用,就要把二进制的01串变回我们实际的java类,叫反序列化。java里为我们提供了相关的机制:Serializable。
3、通信问题
????将内容序列化后如何在网络中传输,BIO、NIO等。
4、登记的服务实例化
????登记的服务有可能在我们系统中就是一个名字,怎样变成实际执行的对象实例,反射机制。 ????反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能调用它的任意一个方法和属性;这种动态获取信息以及动态调用对象的方法的功能称为java语言的反射机制。
|