# marion-rpc **Repository Path**: miningfull/marion-rpc ## Basic Information - **Project Name**: marion-rpc - **Description**: 手写RPC框架 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 4 - **Created**: 2022-05-22 - **Last Updated**: 2022-05-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## Marion-RPC简介 Marion-RPC是一个手写的轻量级RPC框架,方便学习设计RPC底层原理,对比Feign源码进行改造优化。 ## 目录 1. 简介 2. 规划 3. RPC原理与交互详解 4. 代码设计思路 ## 简介 1. 基础网络协议HTTP短连接 2. 传输编解码使用Jackson 3. 使用Netty作为服务器 4. 简单Servlet路由拦截请求处理 5. 随机选择一个selector连接 ## 规划 1. Web服务器替换成undertow (x) 2. 支持注册中心 (x) 3. 支持客户端负载均衡 (x) 4. 支持多种网络协议 (x) 5. 支持多种编解码配置 (x) 6. 封装成spring-boot-starter (x) ## 图解交互形式 ![img_1.png](img_1.png) ## 现有框架对比 ![img_2.png](img_2.png) ## 整体架构 ![img_3.png](img_3.png) ## 核心原理 ![img_4.png](img_4.png) ## 技术栈 ![img_5.png](img_5.png) ![img_6.png](img_6.png) ## 代码实现 ![img_7.png](img_7.png) ## 类图 ![img_8.png](img_8.png) ## 设计思路 ### 1. 定义模块 1. rpc-common: rpc相关公用使用类 2. rpc-codec: 编解码器 3. rpc-proto:网络协议 4. rpc-transport:传输协议 5. rpc-server:服务端 6. rpc-client:客户端 ### 2. rpc-proto编码思路 1. 定义网络传输端口 2. 定义服务 3. 定义请求 4. 定义返回 ### 3. rpc-common编码思路 1. 创建反射作用工具类 2. 创建反射测试类 ### 4. rpc-codec编码思路 1. 序列化Encoder接口 2. 返序列化Decoder接口 3. 定义JacksonEncoder 4. 定义JacksonDecoder 5. 定义测试序列化方法 ### 5. 定义网络协议 1. 配置pom.xml,创建包com.marion.mrpc.transport 2. 定义客户端网络协议接口 1. 创建链接 2. 发送数据,并且等待响应 3. 关闭连接 3. 定义服务端网络协议接口 1. 启动、监听端口 2. 接受请求 3. 关闭 4. 定义处理网络请求的Handler 5. 定义基于HTTP实现的客户端请求 1. 配置url 2. 使用HttpURLConnection处理请求 6. 定义基于Jetty的服务端 ### 6. 定义RPC服务端 1. 引入pom.xml 1. proto 2. transport 3. codec 4. rpc-common 5. commons-io 2. 定义Server配置 1. 传输协议 2. 加解密 3. 端口 3. 定义Server实例 4. 管理RPC暴露的服务 1. 定义ConcurrentHashMap存储rpc接口方法 2. 定义register方法,将接口方法转换成ServiceInstance 3. 将类属性参数解析成ServerDescriptor 4. 定义lookup方法通过Request查找对应的ServiceInstance 5. 定义测试 6. 定义ServiceInvoker 7. 根据RpcConfig创建RpcServer ### 7. 定义RPC客户端 1. 引入pom.xml 1. proto 2. transport 3. codec 4. rpc-common 5. commons-io 2. 定义哪个server去连接TransportSelector接口 3. 定义实现随机获取网络端点 4. 定义RpcClientConfig 1. 定义HTTPTransportSelector 2. 定义加解码 3. 定义选择器RandomTransportSelector 4. 连接数 5. 服务servers 5. 定义RpcClient 6. 定义RemoteInvoker,动态代理请求,调用远程服务返回 ### 8. 创建测试模块 1. 引入pom.xml,创建com.marion.mrpc.example包名 2. 定义Server 3. 定义Client 4. 定义Rpc接口 ### 总结 ![img.png](img.png) ## 参考资料 [自己动手实现RPC框架](https://www.imooc.com/learn/1158) [OpenFeign](https://github.com/OpenFeign/feign)