本文代码请戳:简单RPC-Zeus
一、什么是RPC
假如一个我们有一个电子商城系统,电子商城系统因为业务的拓展水平拆分为不同的子系统,例如库存中心、订单中心、营销中心等等。不同的子系统构成分布在不同的集群上构成一个分布式系统,而这些子系统只能通过网络进行交互,而通过网络进行交互,不同系统之间进行服务的消费以及提供,就是RPC系统。
二、RPC的调用流程
业界的RPC框架非常多,比如阿里巴巴的Dubbo,FaceBook的Thirft等等。RPC的实现非常复杂,但是具体的流程可以简化如下:
- 服务消费方Consumer以本地调用的方式进行服务调用。
- 将需要传输的接口、方法、参数等等进行序列化成网络传输的消息体。
- 发送具体的消息体到服务提供方Provider的地址。
- 服务提供方进行反序列化,调用本地服务。
- 本地服务执行结果进行序列化并返回。
- 服务消费方接受到服务提供方提供的数据进行反序列化,得到结果。
三、如何进行透明远程服务调用
解决方式是通过动态代理,使用动态代理屏蔽网络处理的具体细节。
1 | /** |
四、如何进行服务发布
服务的发布与下线需要一个服务注册表,服务注册表能够跟服务提供方保持心跳,维护服务提供方的上下线状态。并将服务注册表的数据同步给服务消费方。而Zookeeper是一个比较适用的服务注册表的实现方式。当服务上线的时候,服务会生在ZK生成自己的服务目录路径,路径对服务的版本、服务名称、服务地址、服务端口进行创建。同时ZK提供心跳检测,它会定时给服务提供者发送一个请求,如果长期得不到响应,会任务服务提供者已经不存在,将其从服务注册表中剔除。
五、一个简单的RPC实现
1、服务注册中心
服务注册中心,提供服务的注册功能,将服务注册在Map
1 | /** |
具体实现类如下:
将请求转换为一个Runnable,并交给线程池执行,避免请求过多的时候创建与销毁线程的开销。
1 | /** |
2、获取服务注册中心的对应接口,进行服务的反射调用并刷回请求的流中
1 | /** |
3、进行本地透明代理调用远端服务
1 | /** |
4、编写对外服务提供接口
1 | /** |
5、测试
1 | @Test |