{"id":16619533,"url":"https://github.com/java-edge/rpc-framework","last_synced_at":"2025-07-19T06:04:49.815Z","repository":{"id":94726371,"uuid":"221974613","full_name":"Java-Edge/rpc-framework","owner":"Java-Edge","description":"从零开始,实现一个简单的RPC协议框架","archived":false,"fork":false,"pushed_at":"2022-06-17T02:42:03.000Z","size":20,"stargazers_count":3,"open_issues_count":2,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-09T11:24:25.373Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Java-Edge.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-11-15T17:43:55.000Z","updated_at":"2023-03-05T09:14:32.000Z","dependencies_parsed_at":"2023-07-13T13:01:13.303Z","dependency_job_id":null,"html_url":"https://github.com/Java-Edge/rpc-framework","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/Java-Edge/rpc-framework","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2Frpc-framework","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2Frpc-framework/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2Frpc-framework/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2Frpc-framework/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Java-Edge","download_url":"https://codeload.github.com/Java-Edge/rpc-framework/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Java-Edge%2Frpc-framework/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265895968,"owners_count":23845414,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-12T02:42:12.633Z","updated_at":"2025-07-19T06:04:49.804Z","avatar_url":"https://github.com/Java-Edge.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 1 从使用者考虑\n\n用户使用RPC框架开发过程时需要做什么?\n\n- 定义过程接口\n![](https://img-blog.csdnimg.cn/20191114132816733.png)\n- 服务端实现过程\n- 客户端使用生成的stub代理对象\n![](https://img-blog.csdnimg.cn/20191114132906197.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n# 2 设计客户端\n客户端生成过程接口的代理对象\n设计客户端代理工厂，用JDK动态代理即可生成接口的代理对象。\n![](https://img-blog.csdnimg.cn/20191114132958985.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n## 思考\n1、在ClientStubInvocationHandler中 需完成哪些事情?\n![](https://img-blog.csdnimg.cn/2019111413331941.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n2、将请求的内容编组为消息这件事由谁来做?\n![](https://img-blog.csdnimg.cn/20191114133337475.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n3、消息协议是固定不变的吗?它与什么有关?\n看框架对协议的支持广度，如果支持多种协议，就是会灵活变化的，它与具体的服务相关，\nA服务提供者可能选用的是协议1，B服务提供者可能选用协议2。\n\n\n4、某服务是用的什么消息协议这个信息从哪来?\n从获取的服务信息中来，因此需要一个服务信息发现者。\n\n`把发现者设计出来, 要求:可灵活支持多种发现机制`\n\n![](https://img-blog.csdnimg.cn/20191115003249371.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n![](https://img-blog.csdnimg.cn/2019111500530155.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n5、我们想要做到可以支持多种协议，我们的类该如何设计?\n面向接口、策略模式、组合\n![](https://img-blog.csdnimg.cn/20191115005522357.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n- 问题:\n➢ marshalling和unmarshalling方法该定义怎样的参数与返回值?\n➢ 编组、解组的操作对象是请求、响应，请求、响应的内容是不同的。编组、解组两个方法是否满足?\n\n## 设计客户端协议层\n\n6. 定义框架标准的请求, 响应类\n\n![](https://img-blog.csdnimg.cn/20191115005858703.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n7. 将协议层扩展为四个![](https://img-blog.csdnimg.cn/20191115010053143.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n消息协议独立为一层(客户端、服务端均需要)\n\n网络层\n发送请求,获得响应  \n要发起网络请求,则须知道服务地址\n![](https://img-blog.csdnimg.cn/20191115123239178.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n- 客户端完整类图\n![](https://img-blog.csdnimg.cn/20191115123823652.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n实现客户端\n按照类图设计，填码!\n看ClientStubProxyFactory核心类的代码示例!\n\n在实现过程中，协议层涉及一个重要概念\n- 参数序列化、反序列\n\n\n#  3 设计服务端\n## 3.1 RPCServer\n客户端请求过来了，服务端首先需要通过RPCServer接收请求。\n![](https://img-blog.csdnimg.cn/20191115235722470.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n![](https://img-blog.csdnimg.cn/20191115235736165.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n- RPCServer\n![](https://img-blog.csdnimg.cn/20191116001129440.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n## 3.2 思考\nRPCServer接收到客户端请求后，还需要做哪些工作?\n![](https://img-blog.csdnimg.cn/20191115235943756.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_16,color_FFFFFF,t_70)\n\n网络层在RPCServer中提供多线程来处理请求，消息协议层复用客户端设计的。\n(设计一个`请求处理类`，来完成网络层以上的事情。)\n\n## 3.3 RequestHandler\nRPCServer接收到请求后，将请求交给RequestHandler来处理\nRequestHandler调用协议层来解组请求消息为Request对象，然后调用过程!\n![](https://img-blog.csdnimg.cn/20191116000813865.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n### 人性的拷问\n➢ RequestHandler如何得到过程对象?\n➢ Request中有什么?\n➢ 服务名、方法名、参数类型、参数值\n➢ 是否需要一个过程注册模块?\n\n看看之后的设计\n![](https://img-blog.csdnimg.cn/20191116002808402.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n➢ `过程注册模块`:让用户将他们的过程注册到RPC框架\n➢ `过程暴露模块`:想对外发布(暴露)服务注册、暴露可以由同一个类实现\n\n![](https://img-blog.csdnimg.cn/20191116003017951.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n1. RPCServer 中实现网络层: Netty, 使用RequestHandler\n2. ServiceRegister 模块实现服务注册、发布。\n3. RequestHandler 中实现消息协议处理、过程调用\n\n## 代码实现\n- 首先,用户需要设置你的端口和协议哦\n![](https://img-blog.csdnimg.cn/20191116003532999.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)\n\n\n![](https://img-blog.csdnimg.cn/20191116003822920.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9qYXZhZWRnZS5ibG9nLmNzZG4ubmV0,size_1,color_FFFFFF,t_70)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjava-edge%2Frpc-framework","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjava-edge%2Frpc-framework","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjava-edge%2Frpc-framework/lists"}