Custom RPC framework based Netty + Zookeeper
手撸RPC框架,实现了最精简的RPC功能
- Netty 网络传输组件(基于NIO并优于原生NIO)
- Kyro 序列化工具(替代JDK原生序列化)
- Zookeeper 注册中心(负责服务地址的注册与查找)
- SPI 服务提供发现机制(解耦)
- Spring 提供注解服务用于注册消费
RPC框架图如下
服务提供端Server向注册中心注册服务,服务消费端Client通过注册中心获取服务相关信息,然后再通过网络请求服务端Server
设计RPC框架的大体思路:
- 注册中心:注册中心使用Zookeeper。注册中心负责服务地址的注册与查找,相当于目录服务。服务端启动时将服务名称与相对应的地址即
IP+port
注册到注册中心,服务消费端(即客户端)根据服务名称查找对应的服务地址后,通过网络请求服务端。 - 网络传输:网络传输组件使用基于NIO的Netty框架。在调用远程方法时,调用Netty的对应接口以实现网络传输。
- 序列化:涉及到网络传输一定会涉及到序列化,而JDK自带的序列化存在效率低下以及安全性不足的缺点,我们需要用例如Hession2、Kyro、ProtoStuff。综合优缺点,我们在此框架中采用Kyro。
- 动态代理:RPC 的主要目的就是要在调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节比如网络传输。
- 负载均衡:如果某个服务器负载过大会导致该服务器宕机等严重后果,所以需要将访问量大的服务同时部署在多个服务器上,当客户端发起请求时,需要负载均衡分配任务,使各服务器得到充分且合理的利用。