{"id":49815466,"url":"https://github.com/redvelvets/qrpc","last_synced_at":"2026-05-29T21:00:50.144Z","repository":{"id":182746839,"uuid":"669027037","full_name":"redvelvets/qrpc","owner":"redvelvets","description":"一个关于自定义 RPC 框架的设计和实现","archived":false,"fork":false,"pushed_at":"2023-08-15T14:17:49.000Z","size":1206,"stargazers_count":110,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2024-11-17T01:31:50.292Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/redvelvets.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":"2023-07-21T07:06:50.000Z","updated_at":"2024-10-01T08:47:25.000Z","dependencies_parsed_at":"2024-11-17T02:16:59.171Z","dependency_job_id":null,"html_url":"https://github.com/redvelvets/qrpc","commit_stats":null,"previous_names":["bluebeastmight/qprc","bluebeastmight/qrpc","red-velet/qrpc","redvelvets/qrpc"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/redvelvets/qrpc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redvelvets%2Fqrpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redvelvets%2Fqrpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redvelvets%2Fqrpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redvelvets%2Fqrpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/redvelvets","download_url":"https://codeload.github.com/redvelvets/qrpc/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/redvelvets%2Fqrpc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33670211,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-05-29T02:00:06.066Z","response_time":107,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":"2026-05-13T06:00:43.974Z","updated_at":"2026-05-29T21:00:50.130Z","avatar_url":"https://github.com/redvelvets.png","language":"Java","funding_links":[],"categories":["开发框架"],"sub_categories":["RPC框架"],"readme":"# QPRC\n\n 🚀🚀🚀这是一个手写RPC项目，用于实现远程过程调用（RPC）通信🚀🚀🚀\n\n## 一、项目架构\n\n#### 1、架构和基本流程\n\n![image-20230809134419554](img/image-20230809134419554.png)\n\n\n\n#### 2、分层和模块\n\n![image-20230809134436884](img/image-20230809134436884.png)\n\n\n\n## 二、功能特性\n\n- **简单的RPC框架的实现**：该RPC框架实现了基本的远程过程调用功能，允许客户端通过网络调用远程服务的方法，实现分布式系统之间的通信和协作。\n- **基于Netty的TCP的网络通信基本机制**\n  ：RPC框架使用Netty作为底层通信框架，利用Netty提供的异步非阻塞IO特性，为了提高系统的并发处理能力，使用CompletableFuture等方式处理异步请求和结果。通过异步通信，可以在高并发情况下充分利用系统资源，提高性能和吞吐量。\n- **服务注册与发现**：通过注册中心-ZooKeeper实现：RPC框架支持服务注册与发现功能，将服务提供者的地址注册到ZooKeeper注册中心，并由客户端从注册中心获取可用的服务提供者列表。\n- **多种序列化/反序列化、压缩协议支持**\n  ：RPC框架提供多种序列化和反序列化协议的支持，例如JSON、Hessian等，以适应不同场景下的数据传输需求。同时，还支持数据压缩协议，有效减少网络传输的数据量，提高传输效率。\n- **多种负载均衡策略的实现**：RPC框架支持负载均衡策略，用于在客户端选择合适的服务提供者。目前支持轮询、最少响应时间等负载均衡策略，可以根据实际情况选择最优的策略。\n- **请求超时与重试机制**\n  ：为了保证系统的稳定性和性能，在RPC框架中实现了请求超时和重试机制。当请求超过设定的时间未得到响应时，会进行超时处理，避免长时间的等待。同时，也可以设置重试次数，当请求失败时，自动进行重试，提高请求成功率。\n- **服务治理能力**：RPC框架支持一定程度的服务治理能力，例如心跳检测器用于定期检测服务提供者的存活性，并维护连接池。此外，还支持服务的动态添加和移除，能够在运行时动态调整服务列表。\n  - 限流器：为了保护系统资源，防止过多的请求造成系统过载，RPC框架支持限流器功能。通过限制请求的并发数量或速率，可以有效地控制系统的负载，保持系统的稳定性。\n\n  - 熔断器：当服务提供者出现故障或不可用时，熔断器功能可以避免无效的请求继续发送，而是及时中断对该服务的请求。这样可以减少资源浪费，并保护系统免受故障的影响。\n- **整合Spring Boot**：RPC框架可以与Spring Boot进行了集成，方便在SpringBoot项目中使用RPC功能。可以通过自定义注解或配置来注册和使用RPC服务，并将RPC框架与Spring Boot的其他功能无缝结合。\n- **基于SPI机制动态加载配置**：通过SPI（Service Provider Interface）机制，用户可以动态加载和配置不同的功能模块，定制化RPC框架的行为。用户还可以自定义实现RPC的SPI，从而扩展和定制框架的功能，实现个性化需求的适配。\n\n\n\n## 三、快速开始\n\n#### 1、克隆项目到本地\n\n```bash\nhttps://github.com/red-velet/qrpc.git\n```\n\n\n\n#### 2、打开项目目录\n\n\u003e 根目录-qrpc\n\n- `qrpc-framework`：最原始的qrpc，没有集成springboot，可以根据项目的commit记录，查看每一步的编写过程，从而实现从零了解编写qrpc的过程记录。\n  - `qrpc-core`：核心包，核心代码。\n  - `qrpc-common`：常量、枚举、异常、工具类等存放地。\n- `qrpc-starter/spring-boot-starter-qrpc`：\n  - `qrpc-core`：请单独打开该模块，存放核心代码，如需使用请使用maven进行install，然后导入对应地址即可。\n  - `springboot-qrpc-test`：请单独打开该模块，测试模块，两个springboot的web项目用作提供方和调用方。\n\n\n\n#### 3、项目配置\n\n1. 本地install后，引入maven坐标：\n\n   ```xml\n   \u003cdependency\u003e\n       \u003cgroupId\u003eicu.chiou\u003c/groupId\u003e\n       \u003cartifactId\u003espring-boot-starter-qrpc\u003c/artifactId\u003e\n       \u003cversion\u003e1.0-SNAPSHOT\u003c/version\u003e\n   \u003c/dependency\u003e\n   ```\n\n2. 可以修改配置项：在对应springboot的配置文件，如`application.properties`中进行自定义配置：\n\n   ```properties\n   server.port=8084\n   qrpc.port=8094\n   qrpc.serialize-type=json\n   ```\n\n   ![image-20230811231317705](img/image-20230811231317705.png)\n   \n3. 如果需要自行配置，请参考：\n\n   ```java\n   // 自行配置spi,用户SPI,文件名:接口名,文件内容:key=value\n   private static final String DIY_LOADER = \"META-INF/qrpc-diy/\";\n   \n   // 自行配置参数配置文件\n   qrpc.service-attachments.\n   qrpc.client-attachments.\n   ```\n\n   \n\n#### 4、服务开启\n\n注意：\n\n- 如需使用服务，需要在项目启动类上加上`@EnableQRpcProvider`或者 `@EnableQRpcConsumer`\n- 提供方和调用方都需要实现第三方的一个接口。\n- 具体使用可以参考`qrpc/qrpc-starter/spring-boot-starter-qrpc/springboot-qrpc-test`内的项目模块（需要单独打开）\n  - api：双方都实现的一个接口\n  - provider：服务提供方\n  - comsumer：服务调用方\n\n\n\n\u003e **服务提供方开启配置**：\n\n```java\n@SpringBootApplication\n@EnableQRpcProvider\npublic class ProviderApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(ProviderApplication.class, args);\n    }\n}\n```\n\n\n\n\u003e **服务调用开启配置**：\n\n```java\n@SpringBootApplication\n@EnableQRpcConsumer\npublic class ConsumerApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(ConsumerApplication.class, args);\n    }\n}\n```\n\n\n\n\u003e **服务提供方使用**：\n\n```java\n@QRpcApi\n@RateLimiter(allMaxCapacity = 10, tokensPerReplenish = 10)\n@Component\npublic class HelloServiceImpl implements HelloService {\n    @Override\n    public String say(String msg) {\n        return \"provider has receive your msg is --\u003e\" + msg;\n    }\n}\n```\n\n\n\n\u003e **服务调用方使用**：\n\n```java\n@RestController\npublic class HelloController {\n    @QRpcService(loadBalancer = \"roundRobin\")\n    @CircuitBreaker(allowMaxErrorRequest = 20, allErrorRate = 0.5f)\n    HelloService helloService;\n\n\n    @RequestMapping(\"hello\")\n    public String say() {\n        say = helloService.say(\"hello 😊😊😊\");\n        say += \"!!!\";\n        return say;\n    }\n}\n```\n\n\n\n#### 5、效果图\n\n![image-20230811233349696](img/image-20230811233349696.png)\n\n\n\n## 四、API文档\n\n 暂无\n​ 请参考[API文档](docs/API.md)了解更多关于RPC框架的使用方法与API接口。\n\n\n\n## 五、贡献指南\n\n 欢迎提交Issue或Pull Request，感谢您的贡献！😊😊😊\n\n\n\n## 六、联系交流\n\n 如果您有任何疑问或建议，请发送邮件至bluebeastmight@gmail.com。\n\n 个人博客: www.chiou.icu\n\n\n\n## 七、Star History\n\n\u003ca href=\"https://star-history.com/#red-velet/qrpc\u0026Date\"\u003e\n\n  \u003cpicture\u003e\n    \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=red-velet/qrpc\u0026type=Date\u0026theme=dark\" /\u003e\n    \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=red-velet/qrpc\u0026type=Date\" /\u003e\n    \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=red-velet/qrpc\u0026type=Date\" /\u003e\n  \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredvelvets%2Fqrpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fredvelvets%2Fqrpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fredvelvets%2Fqrpc/lists"}