# T_RPC_Framework **Repository Path**: bing-dong/t-rpc-framework ## Basic Information - **Project Name**: T_RPC_Framework - **Description**: 一个基于Netty的,Spring注解驱动的RPC框架,支持多种序列化机制、服务注册发现功能、多种负载均衡机制。 - **Primary Language**: Java - **License**: MulanPSL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 4 - **Created**: 2020-11-26 - **Last Updated**: 2023-03-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # T_RPC_Framework 一个rpc远程过程调用的框架。 ## 使用方法 > 见项目 : **[T_RPC_Framework_Demo](https://gitee.com/TicsmycL/t_rpc_framework_demo)** 步骤(基于3.7版本): 1. 引入依赖 ``` fun.ticsmyc.rpc t-rpc-all 3.7 ``` 2. 在resources目录下,放入trpc.properties 配置文件 (可选) ```properties port=8999 # 作为服务提供方,使用的端口号 (默认是8888) loadbalancer=round # 作为服务消费方,使用的负载均衡机制,可选random(随机)和round(轮询),默认是随机 serializer=json # 作为服务消费方,发送rpc请求时使用的负载均衡器,可选kryo(默认)、json、protobuf、hessian networkIO=netty #可用netty和socket 。 亲测netty更快 ``` 3. 在配置类声明 ``` @EnableTRPC ``` 4. 提供服务: 在想要提供的服务接口上声明 ```java @TRPCInterface //这一步是为了解决某个实现类实现了多个接口的情况 ``` 在想要提供的服务实现类上声明 ```java @TRPCService(group="t") // group属性是为了处理一个接口想要注册多个实现类的情况消费服务 ``` 5. 消费服务: 通过@RpcClient注解即可注入rpc服务 ``` @RpcClient(group = "t") private HelloService helloService; ``` ### 原理图 ![image-20201109152554001](pic/image-20201109152554001.png) ## 目录说明 ``` └─src └─main ├─java │ └─fun │ └─ticsmyc │ └─rpc │ ├─client :客户端 │ │ ├─proxy :动态代理 │ │ └─transport :网络传输层 │ │ ├─bio :基于socket实现的传输 │ │ └─netty :基于netty实现的传输 │ │ ├─codec :编码、解码器 │ │ └─handler :自定义的处理器 │ ├─common :通用 │ │ ├─entity :网络通信使用的实体类 │ │ ├─enumeration :枚举类 │ │ ├─exception :异常类 │ │ ├─factory :工厂 │ │ └─serializer :序列化器 │ │ └─impl │ ├─nacos │ │ ├─loadbalance 负载均衡 │ │ │ └─impl │ │ └─registry 注册中心 │ │ └─impl │ ├─server :服务端 │ │ ├─handler :业务:根据收到的信息调用相应服务 │ │ ├─registry :服务注册:供服务端使用 │ │ │ └─impl │ │ └─transport :网络传输层 │ │ ├─bio │ │ └─netty │ │ ├─codec │ │ └─handler │ └─test :用于开发时测试 │ ├─bio │ ├─netty │ └─service │ └─impl └─resources ``` ## 版本说明 ### 版本历史 #### v1.0 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/bda7ef2e27a48c5d99c6e70a44a8151288b26204) - 使用BIO+线程池实现网络通信 - 使用Java原生的序列化/反序列化机制 #### v2.0 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/e95864f7cb01ece5fa5ba465625152d2108f3273) - 使用Netty实现网络通信 - 使用Jackson作为序列化工具 #### v2.1 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/d0b0d7444c858cf1cd715fbffa25202329c4e301) - 添加二进制的Kryo序列化器,效率更高 #### v2.2 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/084725aac52de1f31973ba396e9342d90e6d7876) - 添加Hession序列化器 #### v2.3 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/bbf5ba78f9321e76232bba3c52928b248def61f7) - 重新定义协议 ![image-20201028112849326](./pic/image-20201028112849326.png) - 魔数: 致敬JVM ,为`0xCAFEBABE` - 协议版本号:用于判断接收方能否兼容这个数据包的格式 - 序列化器类型: 标识序列化数据包使用的序列化器 - 数据长度 - 真实数据 - 修改序列化器为懒汉单例、增加序列化器编号。解码器使用的序列化器改为由收到的数据包指定 - 增加协议版本号、魔数 - 增加一些错误类型、枚举类型 #### v2.4 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/859b5d0975f71730d34530f5f4506c75d7e0dbcb) - 增加netty客户端连接失败重试机制 - 增加Protobuf序列化器 - 优化Serializer枚举类 和 SerializerCode枚举类 - 序列化器改为单例懒加载模式,减少不必要的内存消耗 #### v3.0 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/af254187e94558110e4295d2b16e306f442f5dcc) - 合并server、client、common三个工程 #### v3.1 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/3b5e6e1e2f3fad245b1dacc63b3bf87d5dd5061b) - 增加木兰license - 增加Nacos注册中心,可以直接根据服务名称调用服务,不需要ip地址 - 更新BIO通信协议,与Netty兼容 - 优化代码,处理滥用的static #### v3.2 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/d8721cc97e1effc680edc03ad8ac1f8b94084120) - 增加rpc请求号和请求号校验机制 - 优化客户端和服务端的构造器,提供多种默认机制 - 新增客户端和服务端之间的心跳机制 - 新增服务端负载均衡+两种负载均衡机制 - 优化RpcRequestSender,在创建对象时就创建连接,发送请求后不关闭连接。 #### v3.3 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/6c2fcb8ea74c17506916941ae553eac40601e6d6) - 优化网络通信,增加channel复用机制; - 心跳功能可以正常使用了 - 使用CompletableFuture优化客户端RpcResponse的接收 - 客户端做成单例,增加客户端全局配置和一些初始化异常类 #### v3.4 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/0acadba2c40d05436849c973cfbd64647d32f682) - 服务端增加基于注解的服务自动注册机制(自己实现的注解扫描,效率低、不稳定) - 优化客户端的失败重试机制 #### v3.5 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/17e8a8e0c402b3726c85eab21e591b6e7d63e538) - 删除3.4中自定义的注解机制 - 使用Spring提供的applicationContext.getBeansWithAnnotation实现基于注解的服务注册功能。 - 服务端全面容器化,使用ServerProperties进行配置 - 在NettyRpcServer中不再使用applicationContext实现自动服务注册,改为BeanPostProcessor。在Bean初始化时进行注册。优化了调用getBeansWithAnnotation方法,遍历容器中所有Bean的时间开销。 - 删除测试代码 #### v3.6 [对应git版本](https://gitee.com/TicsmycL/t-rpc-framework/commit/0b853230754aa1edc2a7db45eab37e9634a6d731) - 服务端注册服务时增加group属性,解决一个接口有多个实现时,不知调用哪个的情况。 - 增加nacos中服务的注销功能(还未找到合适的使用方法,没有应用) - 增加客户端的基于注解消费服务功能,并且支持消费实现了同一个接口但不同组的服务(但只支持Netty方式,不支持BIO方式)。 #### v3.7 - 优化代码结构 - 使用 Runtime.getRuntime().addShutdownHook 机制 和DisposableBean机制来保证系统正常退出时,从nacos中注销服务 - 修改nacos中注销服务的方法为线程安全 - 优化了使用方式,用户只需要在配置类中声明@EnableTRPC,即可自动注册发布服务、自动为接口注入实现类 - 可以使用trpc.properties配置文件来配置端口、覆盖均衡器、序列化器 - 修复:bootstrap.connect().sync()监听器线程同步错误,导致多次连接重试,最终与同一个服务器建立多个连接的情况。 - 修复:json序列化器对心跳包进行序列化时的空指针问题