/pRPC

Custom RPC framework based Netty + Zookeeper

Primary LanguageJavaApache License 2.0Apache-2.0

pRPC

Custom RPC framework based Netty + Zookeeper

介绍

手撸RPC框架,实现了最精简的RPC功能

项目主要技术栈

  • Netty 网络传输组件(基于NIO并优于原生NIO)
  • Kyro 序列化工具(替代JDK原生序列化)
  • Zookeeper 注册中心(负责服务地址的注册与查找)
  • SPI 服务提供发现机制(解耦)
  • Spring 提供注解服务用于注册消费

RPC框架图如下

image-20210424095856335

服务提供端Server向注册中心注册服务,服务消费端Client通过注册中心获取服务相关信息,然后再通过网络请求服务端Server

设计RPC框架的大体思路:

  1. 注册中心:注册中心使用Zookeeper。注册中心负责服务地址的注册与查找,相当于目录服务。服务端启动时将服务名称与相对应的地址即 IP+port注册到注册中心,服务消费端(即客户端)根据服务名称查找对应的服务地址后,通过网络请求服务端。
  2. 网络传输:网络传输组件使用基于NIO的Netty框架。在调用远程方法时,调用Netty的对应接口以实现网络传输。
  3. 序列化:涉及到网络传输一定会涉及到序列化,而JDK自带的序列化存在效率低下以及安全性不足的缺点,我们需要用例如Hession2、Kyro、ProtoStuff。综合优缺点,我们在此框架中采用Kyro。
  4. 动态代理:RPC 的主要目的就是要在调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节比如网络传输。
  5. 负载均衡:如果某个服务器负载过大会导致该服务器宕机等严重后果,所以需要将访问量大的服务同时部署在多个服务器上,当客户端发起请求时,需要负载均衡分配任务,使各服务器得到充分且合理的利用。