一、基本原理
由于网站越来越庞大,在一台机器上进行部署是不太现实的,所以有了分布式架构,把一些核心业务抽离出来。这样就会存在比如一台机器要调用另一台机器的上的服务或者操作,就有了RPC请求。
二、基本过程
1. 建立通信
由于两台机器要调用对方机器上的服务,肯定是需要通信的,所以需要建立TCP连接
2. 服务器寻址
即要得到对方服务器上的IP地址和端口号,调用方法名称,传入返回参数等。
这时我们需要一个注册服务,可以向调用者提供这些信息,服务提供方提供这些信息
- 从服务提供者的角度看:当提供者服务启动时,需要自动向注册中心注册服务;
- 当提供者服务停止时,需要向注册中心注销服务;
- 提供者需要定时向注册中心发送心跳,一段时间未收到来自提供者的心跳后,认为提供者已经停止服务,从注册中心上摘取掉对应的服务。
- 从调用者的角度看:调用者启动时订阅注册中心的消息并从注册中心获取提供者的地址;
- 当有提供者上线或者下线时,注册中心会告知到调用者;
- 调用者下线时,取消订阅。
三、网络传输
主要是序列化、反序列化、网络传输
调用者通过代理生成proxy对象作为中间人,传输给提供者,提供者通过proxy得到对应的对象或者结果,然后再通过序列化之后返回给调用者。
四、分布式组件
- 服务端
- 服务端存根
- 客户端
- 客户端存根
具体调用过程:
1、服务消费者(client客户端)通过调用本地服务的方式调用需要消费的服务;
2、客户端存根(client stub)接收到调用请求后负责将方法、入参等信息序列化(组装)成能够进行网络传输的消息体;
3、客户端存根(client stub)找到远程的服务地址,并且将消息通过网络发送给服务端;
4、服务端存根(server stub)收到消息后进行解码(反序列化操作);
5、服务端存根(server stub)根据解码结果调用本地的服务进行相关处理;
6、本地服务执行具体业务逻辑并将处理结果返回给服务端存根(server stub);
7、服务端存根(server stub)将返回结果重新打包成消息(序列化)并通过网络发送至消费方;
8、客户端存根(client stub)接收到消息,并进行解码(反序列化);
9、服务消费方得到最终结果;
而RPC框架的实现目标则是将上面的第2-10步完好地封装起来,也就是把调用、编码/解码的过程给封装起来,让用户感觉上像调用本地服务一样的调用远程服务。