# peng-rpc-framework **Repository Path**: wonderson/peng-rpc-framework ## Basic Information - **Project Name**: peng-rpc-framework - **Description**: A simple Rpc Framework! - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2022-02-27 - **Last Updated**: 2022-06-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # peng-rpc-framework 参考开源项目:[guide-rpc-framework](https://github.com/Snailclimb/guide-rpc-framework) 以及其他大佬的实现仿照的rpc框架,希望通过重复造轮子来帮助了解`rpc的底层原理和网络编程、设计模式`等基础知识。 ## 项目特性 1. 自定义传输协议,解决粘包、拆包问题; 2. 两种服务器实现:Socket BIO/Netty NIO,且由于都支持公共协议因此可以消息互通; 3. 基于Nacos实现服务的注册与发现; 4. 支持Json、Protobuf、Hessian、Kryo四种序列化方式; 5. 支持轮询与随机、一致性哈希三种负载均衡策略; 6. 注解扫描实现服务的自动注册; 7. 基于多种设计模式的实现,极大降低模块耦合度,分工明确、代码复用性强。 ## 模块介绍 1. rpc-api: 定义了客户端和服务器都可以感知到的公共访问接口,客户端通过接口来生成代理,调用服务器的实现; 2. rpc-common: 定义了客户端好服务器共用的工具类与枚举、异常等; 3. rpc-core: 实现rpc功能的核心模块,包括客户端如何生成代理、服务器如何感知服务、客户端和服务器的通信io实现等; 4. test-client: 客户端启动模块,用户需要在这里编写一下调用的方法和参数; 5. test-server: 服务器启动模块,包含了接口服务的实现和一个启动类。 ## 自定义传输协议 ```text +---------------+---------------+-----------------+-------------+ | Magic Number | Package Type | Serializer Type | Data Length | | 4 bytes | 4 bytes | 4 bytes | 4 bytes | +---------------+---------------+-----------------+-------------+ | Data Bytes | | Length: ${Data Length} | +---------------------------------------------------------------+ ``` 解释: 1. Magic Number: 魔数,用来检测有效的数据包,固定为16进制CAFEBABE; 2. Package Type:数据包的类型,分为请求包和响应包; 3. Serializer Type: 序列化方式,支持四种序列化方式:Json,Kryo, Hessian, Protobuf; 4. Data Length: 数据部分的字节数组长度; 5. Data Bytes: 数据部分,以字节数组方式存储。 ## 使用方式 1. 在rpc-api模块中注册服务接口,在rpc-server启动类所标注的包路径下定义接口实现类,并使用@Service注解标注实现类; 2. 开启Nacos; 3. 选择NettyTestServer或者SocketTestServer其中之一启动,需要配置一个通过@ServiceScan指定实现类所在的包路径; 4. 选择NettyTestClient或者SocketTestClient其中之一启动,需要通过RpcProxy获取代理对象,并参照实例传递调用参数,即可看到服务调用的结果。 ## 项目中使用的设计模式 1. 代理模式 1. RPC客户端只能感知到接口实现,却没有接口对应的实现,通过代理模式,提供接口的代理对象,在客户端调用服务方法时发送网络请求,将结果解析返回,看上去就好像客户端自己实现的一样, 2. 单例模式 1. 使用单例工厂生产单例实例,利用单例实例的静态成员集合来提供服务注册信息等共享资源; 3. 策略模式 1. 提供序列化器接口、负载均衡接口等,以多种方式实现接口,让服务器在启动类中提供配置,以达到灵活配置组件的目的; 4. 模板方法模式 1. 利用AbstractRpcServer来实现RpcServer接口,提供通用的成员变量以及包扫描等方法,并将start()继续抽象留给子类实现,提高了代码复用性; 5. 责任链模式 1. netty的服务器实现中,利用pipeline的责任链,将数据的解码、编码、请求响应处理、日志记录等放在各自的Handler中,分工清晰,职责单一。