第一章
RPC
概述
RPC
(
Remote Procedure Call
)——
远程过程调用
,它是一种通过
网络
从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。例如有两台服务器分别部署了
A
,
B
两个服务,
A
要调用
B
服务的某个方法或者函数,由于两个服务不在同一个内存空间,所以不能直接调用,这样就必须通过网络的请求来达到调用的目的。
那么我们在尝试自己写
RPC
框架时,需要考虑哪几点问题:
l
远程调用类似于我们使用的网络请求(
http
,
socket
)调用其他的服务,所以我们最开始就要解决通讯问题,包括建立
tcp
连接,数据交换,传入参数序列化,接受返回参数序列化,调用完成以后就释放占用资源。市场上知名度很广的
dubbo
(
RPC
框架),默认使用的
socket
长连接,多个调用过程共享一个连接。
l
消费者寻找调用的服务提供者,这里我们需要一个注册中心来完成,把所有的内容提供者注册到注册中心中,然后消费者在寻找调用的内容提供者时直接去注册中心去获取调用的服务的
ip
,端口,调用方法等等信息。例如我要去吃饭,我就要找饭店,这里注册中心会告诉我们具体去哪个饭店是最适合我的。如果我要去取钱,我就要去银行,这里注册中心会告诉我哪个银行取钱是最适合我的。(
PS
后续我会详细讲解注册中心)
l
在
A
服务器尝试调用
B
服务器时,方法跟所有的参数都需要通过底层的网络协议传输到
B
服务器,由于网络传输是基于二进制的,内存中所有的参数都需要被序列化(
java
中比较方便的是实现
Serializable
接口,进行序列化,我们在后续的代码实践中会介绍多种相对来说高效率的序列化方式)
l
在
B
服务器收到
tcp
请求后,需要对传入的参数,需要调用的方法,调用源等信息进行反序列化,然后进行本地调用得到返回值,返回到消费者端。
RPC
解决了哪些痛点:
l
可以比较优雅的解决无法在一个进程内,甚至一个计算机内通过本地调用的方式完成的需求,比如比如不同的系统间的通讯,甚至不同的组织间的通讯。
l
透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没有任何
API
侵入。
l
软负载均衡及容错机制,可在内网替代
F5
等硬件负载均衡器,降低成本,减少单点。
l
服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的
IP
地址,并且能够平滑添加或删除服务提供者
l
系统极大程度上的解耦,解决各个业务的耦合程度。
调用流程图如下: