# pRPC **Repository Path**: p1utowu/pRPC ## Basic Information - **Project Name**: pRPC - **Description**: 手撸RPC框架,实现了最精简的RPC功能 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 2 - **Forks**: 0 - **Created**: 2021-04-25 - **Last Updated**: 2021-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # pluto-rpc-frame #### 介绍 手撸RPC框架,实现了最精简的RPC功能 #### 项目主要技术栈 - **Netty** **网络传输组件(基于NIO并优于原生NIO)** - **Kyro** **序列化工具(替代JDK原生序列化)** - **Zookeeper** **注册中心(负责服务地址的注册与查找)** - **SPI** **服务提供发现机制(解耦)** - **Spring** **提供注解服务用于注册消费** RPC框架图如下 ![image-20210424095856335](https://plutowu-blogimgs.oss-cn-guangzhou.aliyuncs.com/img/image-20210424095856335.png) 服务提供端Server向注册中心注册服务,服务消费端Client通过注册中心获取服务相关信息,然后再通过网络请求服务端Server 设计RPC框架的大体思路: 1. **注册中心**:注册中心使用Zookeeper。注册中心负责服务地址的注册与查找,相当于目录服务。服务端启动时将服务名称与相对应的地址即 `IP+port`注册到注册中心,服务消费端(即客户端)根据服务名称查找对应的服务地址后,通过网络请求服务端。 2. **网络传输**:网络传输组件使用基于NIO的Netty框架。在调用远程方法时,调用Netty的对应接口以实现网络传输。 3. **序列化**:涉及到网络传输一定会涉及到序列化,而JDK自带的序列化存在效率低下以及安全性不足的缺点,我们需要用例如Hession2、Kyro、ProtoStuff。综合优缺点,我们在此框架中采用Kyro。 4. **动态代理**:RPC 的主要目的就是要在调用远程方法像调用本地方法一样简单,使用动态代理可以屏蔽远程方法调用的细节比如网络传输。 5. **负载均衡**:如果某个服务器负载过大会导致该服务器宕机等严重后果,所以需要将访问量大的服务同时部署在多个服务器上,当客户端发起请求时,需要负载均衡分配任务,使各服务器得到充分且合理的利用。