什么是RPC
RPC - Remote Procedure Call,远程过程调用。它是一个计算机通信协议,允许像调用本地服务一样调用远程服务。
假设Computer1在调用sayHi()方法,对于Computer1而言调用sayHi()方法就像调用本地方法一样,调用 –>返回。但其实Computer1调用的是Computer2中的sayHi()方法,RPC屏蔽了底层的实现细节,让调用者无需关注网络通信,数据传输等细节。
分析
我们从以下几个方面考虑实现:
- 通信模型:假设通信的为A机器与B机器,A与B之间有通信模型,在Java中一般基于BIO或NIO。
- 过程(服务)定位:使用给定的通信方式,与确定IP与端口及方法名称确定具体的过程或方法。
- 远程代理对象:本地调用的方法(服务)其实是远程方法的本地代理,因此可能需要一个远程代理对象,对于Java而言,远程代理对象可以使用Java的动态对象实现,封装了调用远程方法调用。
- 序列化:将对象名称、方法名称、参数等对象信息进行网络传输需要转换成二进制传输,这里可能需要不同的序列化技术方案。如:protobuf,Arvo等。
实现
技术方案
对于以上几点,我们采用Socket通信、动态代理与反射与Java原生的序列化来实现。
框架架构
RPC架构分为三部分:
- 服务提供者,运行在服务器端,提供服务接口定义与服务实现类。
- 服务中心,运行在服务器端,负责将本地服务发布成远程服务,管理远程服务,提供给服务消费者使用。
- 服务消费者,运行在客户端,通过远程代理对象调用远程服务。
具体实现
我们首先定义需要调用的接口及其实现类,此处为 ServerService 和 ServerServiceImpl
public interface ServerService {
void doSome(String name);