# uwrpc **Repository Path**: unit-wisdom/uwrpc ## Basic Information - **Project Name**: uwrpc - **Description**: 手写 RPC。 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-03-07 - **Last Updated**: 2024-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # UW rpc 框架 ## 项目介绍 基于 Spring 实现一个 rpc 调用核心包。 ## 模块介绍 ### [uwrpc-core](uwrpc-core) | 包名 | 作用 | |------------|---------------| | annotation | rpc 注解 | | api | rpc 通用api | | cluster | 集群处理 | | config | 配置处理 | | constant | 常量管理 | | consumer | 服务消费者核心处理 | | exception | 异常处理 | | filter | 过滤器 api 实现 | | meta | 元信息定义 | | provider | 服务提供者核心处理 | | registry | 注册中心 api 实现 | | test | 用于单元测试 | | traffic | 流控 api 实现 | | transport | RPC 调用过程通信方式 | | util | 工具类 | ### uwrpc-demo-* uwrpc 生产者,消费者使用示例。 ## 实现思路 消费端启动时,[ConsumerBootstrap](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fconsumer%2FConsumerBootstrap.java) 扫描所有 Spring Bean 中带有注解 [UWReference](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fannotation%2FUWReference.java)的属性, 通过反射将生成的代理 [UWInvocationHandler](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fconsumer%2FUWInvocationHandler.java) 注入属性中。[UWInvocationHandler](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fconsumer%2FUWInvocationHandler.java) 实现 RPC 消费者远程调用核心处理。 生产者启动时,[ProviderBootstrap](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fprovider%2FProviderBootstrap.java) 扫描所有 Spring Bean 中带有注解 [UWService](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fannotation%2FUWService.java) 的 bean,将相关信息注册到 skeleton 中。Spring 容器初始化完成后,将服务元信息通过 [RegistryCenter](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fapi%2FRegistryCenter) 注册至注册中心。 生产者通过 [SpringBootTransport](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Ftransport%2FSpringBootTransport.java) ![img1.png](script%2Fimg%2Fimg1.png) ## 设计思考问题列表 > 代理方式 1. 动态代理:JDK 动态代理, CGLib 动态代理 2. Spring AOP 3. 相关类库: ByteBuddy(字节码,高性能), Javassist(字节码,相对性能低), Enhancer(动态代理,CGLib的) 本次采用 JDK 动态代理实现 > 通信协议设计 1. 网络通信协议设计。 (传输层:UDP, TCP。应用层: HTTP) 2. 应用通信协议设计。指如何识别请求内容,如何确定请求字段信息。请求头,请求体设计。 3. 序列化方式。(JSON, 二进制,Protobuf) 本次采用 Http 方式,生产者借助 Spring 暴露特定 Controller 接口。消费者通过 OkHttp 进行 http 调用。 > 消息体数据结构设计。 设计以下 4 个字段: 1. service:服务类名,指定调用哪一个类。 2. methodSign: 方法签名,指定调用哪一个类的方法。 3. args:参数,指定调用的参数。 4. parameters: 一个Map, 提供可扩展性。如 traceId 透传,用户信息透传。 > 服务端如何注册发布,客户端如何发现服务。 设计 [RegistryCenter](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fapi%2FRegistryCenter.java) 接口。 可基于静态配置,zk, uwregistry 进行服务的注册和发现。 > 客户端调用服务端负载均衡处理。 设计两个接口 [Router](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fapi%2FRouter.java) ,[LoadBalancer](uwrpc-core%2Fsrc%2Fmain%2Fjava%2Fcom%2Fuw%2Fuwrpc%2Fcore%2Fapi%2FLoadBalancer.java)。 Router 用于将一批服务端提供者筛选出一批提供者供 LoadBalancer 进行挑选最终调用的服务提供者。