我们聊的分布式系统的核心是RPC框架,它主要涉及到网络通信、序列化、传输协议、服务调用等功能。
RPC框架的发展
java的RPC很久就有,随着互联网的发展逐渐发展到举足轻重的地位。
在java服务于大多数企业家应用的时候,单体的应用架构成为主流,将所有业务部署在一起减少部署的成本。
这个时候我们研究的方向主要是ORM框架、设计模式的大量应用,简化增删改查的工作量。
随着互联网的发展和互联网用户的不断增加,之前的单体应用在增加部署节点的带来的收益越来越小,这个时候我们把整体的应用架构拆分成多个应用,以提升程序运行的效率。
随着技术的不断的演变分布式服务框架开始出现,这个时候用于提高业务服用及整合的分布式框架(RPC)用于提供统一的服务成为关键
RPC框架的实现原理
有这样一个场景,有两台服务器A和B,分别部署2个不同的服务,A服务器上的服务想调用B服务器上的服务,因为不在同一个进程空间中,需要通过网络进行调用。RPC框架对于这种场景主要经历以下几个步骤:
1.服务的寻址
A机器的进程需要调用B机器上的服务,首先A机器的进程需要到注册中心找到B机器的IP地址和端口号信息,注册中心提供提供一个可靠的寻址方式。比如采用zookeeper来注册服务等。A机器通过注册中心拿到B机器的IP地址和端口号,对部署在B机器上的服务进行访问。注册中心主要的功能如下:
服务的提供者在启动服务的时候需要注册到注册中心。
当服务停止时,需要在注册中心注销掉服务。
服务的提供者需要定时往注册中心发送心跳,一段时间未发送心跳则注册中心任务该服务已经停止
调用者在启动时需要订阅注册中心的服务,并从注册中心获取到服务提供者的地址
当服务提供者注销服务时,注册中心需要告知调用方
调用者下线时,取消订阅服务
2.建立通信
A机器可以和B机器建立http连接或者TCP/IP连接。建立http连接之后获取到B机器的服务后断开连接,如果建立tcp/ip连接则多次远程调用使用同一个连接。
3.网络传输
服务的调用方,发起远程方法调用,把调用的参数信息序列化,再从注册中心拿到服务的提供者的地址,把调用转换成方法发起通信,
服务提供方拿到序列化的数据,对数据进行反序列化,并进行相关的业务处理
当服务的提供者处理完成相关的业务后返回数据前需要对返回的数据进行序列化处理,因为数据在网络传输中是二进制的数据,然后将序列化后的数据传输给调用方。
服务调用方在接收到数据时,需要对传输过来的二进制数据进行反序列化,然后解析成自己想要的数据。
RPC调用的整个过程如下图所示:
RPC框架的主要组成
客户端:服务的调用方
客户端存根:存放服务端的地址信息,(一般在我们的架构师设计中,特别是基于标准的DDD领域建模的是feigen和服务方的调用接口,以后在我们的实战案例中会讲到)。通过这些把调用转换为网络消息发送出去
服务端存根:在服务端接受到调用方的消息时候,反序列化后然后调用本地的业务处理,并返回消息
服务端:服务的提供者