{"id":20716328,"url":"https://github.com/tohodog/qsrpc-starter","last_synced_at":"2026-05-18T15:31:19.576Z","repository":{"id":57728788,"uuid":"313577963","full_name":"tohodog/QSRPC-starter","owner":"tohodog","description":"一个基于QSRPC,结合spring-boot实现远程调用的轻量级高性能RPC框架 ","archived":false,"fork":false,"pushed_at":"2021-11-25T10:36:08.000Z","size":466,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-03-11T07:26:08.619Z","etag":null,"topics":["rpc","springboot","starter","zookeeper"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tohodog.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-11-17T10:04:43.000Z","updated_at":"2021-11-25T10:14:32.000Z","dependencies_parsed_at":"2022-09-09T09:31:04.748Z","dependency_job_id":null,"html_url":"https://github.com/tohodog/QSRPC-starter","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"purl":"pkg:github/tohodog/QSRPC-starter","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tohodog%2FQSRPC-starter","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tohodog%2FQSRPC-starter/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tohodog%2FQSRPC-starter/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tohodog%2FQSRPC-starter/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tohodog","download_url":"https://codeload.github.com/tohodog/QSRPC-starter/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tohodog%2FQSRPC-starter/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268330914,"owners_count":24233152,"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","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"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":["rpc","springboot","starter","zookeeper"],"created_at":"2024-11-17T03:05:29.176Z","updated_at":"2026-05-18T15:31:19.528Z","avatar_url":"https://github.com/tohodog.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"![logo][logopng]\n\u003cbr/\u003e\n\u003cbr/\u003e\n---\n一个基于[QSRPC][QSRPC], 结合 spring-boot 实现远程调用的轻量级高性能RPC框架\n\u003cbr/\u003e\n\n[![star][QSRPCstarter-svg]][star] [![QSRPC][QSRPCsvg]][QSRPC]  [![License][licensesvg]][license]\n\n  * 使用 nacos(2.0) / zookeeper 服务发现, 自动注册扩展服务\n  * 使用长连接TCP池, netty 作为网络IO, 支持全双工通信, 高性能\n  * 支持异步调用,提升qps上限\n  * 默认使用 Protostuff 序列化\n  * 支持压缩snappy, gzip\n  * 支持针对整个服务/单个接口进行qps限制, 超时等设置\n  * 支持权重调用服务负载均衡\n  * 欢迎学习交流~\n\n## Maven\n```\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.github.tohodog\u003c/groupId\u003e\n    \u003cartifactId\u003eqsrpc-starter\u003c/artifactId\u003e\n    \u003cversion\u003e1.1.1\u003c/version\u003e\n\u003c/dependency\u003e\n\n\u003c!--导入如有问题,可尝试添加jitpack源--\u003e\n\u003crepositories\u003e\n  \u003crepository\u003e\n      \u003cid\u003ejitpack.io\u003c/id\u003e\n      \u003curl\u003ehttps://jitpack.io\u003c/url\u003e\n  \u003c/repository\u003e\n\u003c/repositories\u003e\n``` \n\n## Demo(4step)\nFirst configured \n[nacos](https://nacos.io/zh-cn/docs/deployment.html)\n/\n[zookeeper](http://mirrors.hust.edu.cn/apache/zookeeper/)\n\n### 1.application.properties(yml)\n```\n#nacos \nqsrpc.nacos.addr=192.168.0.100:8848\n\n#zookeeper \n#qsrpc.zk.ips=127.0.0.1:2181\n\n#节点IP\nqsrpc.node.ip=192.168.0.100 (请配置为内(外)网IP,不配置自动获取)\nqsrpc.node.port=19980\n\n#option\n#请求权重(1-127) 默认平均1\n#qsrpc.node.weight=1\n#压缩,带宽不足可选\n#qsrpc.node.zip=snappy/gzip\n#全局请求超时时间\n#qsrpc.connect.timeout=60000\n```\n### 2.SpringBootApplication\n```\n@EnableQSRpc//add this\n//@EnableQSRpc(qps = 100000) 限制整个服务qps\n@SpringBootApplication\npublic class RPCApplication {\n    public static void main(String[] args) {\n        SpringApplication.run(RPCApplication.class, args);\n    }\n}\n```\n\n### 3.public api\n```\npublic interface IRPCServer {\n    String hello(String name);\n    RPCFuture\u003cString\u003e future(String name);//异步\n}\n```\n### 4.1 server\n```\n@QSRpcService\n//@QSRpcService(value = \"2.0\", qps = 1f) 设置版本号及该服务qps\npublic class RPCServer implements IRPCServer {\n    @Override\n    public String hello(String name) {\n        return \"hello:\" + name;\n    }\n\n    @Override\n    public RPCFuture\u003cString\u003e future(String name) {\n        return RPCFuture.Ok(name);\n        //服务端如需异步处理,可创建RPCFuture rpc=new RPCFuture();\n        //先行返回rpc,后续异步调用rpc.handleResult(t)返回结果\n    }\n\n}\n```\n### 4.2 client\n```\n@QSRpcReference\n//@QSRpcReference(version = \"2.0\",timeout = 10000) 配置版本号及超时\nIRPCServer rpcServer;\n\n//同步调用\n@ResponseBody\n@GetMapping(\"/hello\")\npublic String hello() {\n    return rpcServer.hello(\"QSPRC\");\n}\n\n//异步调用\n@GetMapping(\"/future\")\npublic String future() {\n    RPCFuture\u003cString\u003e future = rpcServer.future(\"QSPRC\");\n    future.setCallback(new Callback\u003cString\u003e() {\n        @Override\n         public void handleResult(String result) {\n            System.out.println(\"result:\" + result);\n        }\n       @Override\n        public void handleError(Throwable error) {\n            System.err.println(\"error:\" + error);\n        }\n    });\n    return \"ok\";\n}\n```\n\n## Future\n * ~~服务调用支持异步~~\n * 断路器策略\n * 服务统计治理\n * ...\n \n## Test\n 4-core自发自收的情况下2.3万/秒的并发数,实际会更高 [Test截图][testpng] [截图2][testpng2]\n \u003cbr/\u003e异步调用可达10w+,可拉取test分支测试\n \n |  CPU   | request  | time  | qps  | qps(异步) |\n |  ----  | ----  |----  |----  |----  |\n| i3-8100(4-core/4-thread)| 10w(8-thread) | 4331ms | 23089  | 10w+  |\n| i7-8700(6-core/12-thread) | 30w(24-thread) | 6878ms | 43617  | 20w+  |\n\n\n\n## QSRPC项目技术选型及简介\n### 1.TCP通信\n#### 1.1 连接模式:\n　本项目tcp通信使用长连接+全双工通信(两边可以同时收/发消息),可以保证更大的吞吐量/更少的连接数资源占用,理论上使用一个tcp连接即可满足通信(详见pool),如果使用http/1.1协议的请求-响应模式,同一个连接在同一个时刻只能有一个消息进行传输,如果有大量请求将会阻塞或者需要开更多tcp连接来解决\n#### 1.2 协议:\n|TCP|长度|消息ID|协议号|加密/压缩|内容|包尾|\n|:----:|:----:|:----:|:----:|:----:|:----:|:----:|\n| Byte | 4 | 4 | 1 | 1(4bit+4bit)  | n | 2 |\n\n　首先,使用长连接那就需要解决tcp粘包问题,常见的两种方式:  \n * 包头长度:优点最简单,也是最高效的,缺点是无法感知数据包错误,会导致后续所有包错乱\n * 特定包尾:优点能感知包错误,不影响后续包,缺点需要遍历所有字节,且不能与包内容冲突\n \u003cbr/\u003e\n　综上,本框架使用的是包头长度+特定包尾,结合了两者优点,避免了缺点,高效实用,检测到包错误会自动断开.\n没有使用校检码转码等,因为需要考虑实际情况,内网里出错概率非常低,出错了也能重连,对于RPC框架追求性能来说是合适的,即使是外网,后续有需求可以增加校验加密协议\n\u003cbr/\u003e\n　其次,因为支持全双工那就需要解决消息回调问题,本协议使用了一个消息ID,由客户端生成,服务端返回消息带上;由于发送和接收是非连续的,所以客户端需要维护一个回调池,以ID为key,value为此次请求的context(callback),因为是异步的,请求有可能没有响应,所以池需要有超时机制\n\n#### 1.3 压缩/加密:\n　当出现带宽不足而CPU性能有余时,压缩就派上用场了,用时间换空间。目前支持了snappy/gzip两种压缩,snappy应用于google的rpc上,具有高速压缩速度和合理的压缩率,gzip速度次于snappy,但压缩率较高,根据实际情况配置,前提必须是带宽出现瓶颈/要求,否则不需要开启压缩\n\u003cbr/\u003e　加密功能计划中(加盐位算法)\n#### 1.4 IO框架:\n网络IO目前是基于netty搭建的,支持nio,zero-copy等特性,由于本框架连接模式使用长连接,连接数固定且较少,所以本框架性能对于IO模式(BIO/NIO/AIO)并不是很敏感,netty对于http,iot服务这种有大量连接数的优势就很大了\n\n\n### 2. Tcp pool\n　前面说了一个tcp连接即可支撑通信,为啥又用pool了呢,原因有两个:1. netty工作线程对于同一个连接使用同一个线程来处理的,所以如果客户端发送大量请求时,服务端只有一个线程在处理导致性能问题,起初是想服务端再把消息分发到线程池,但后续测试发现此操作在高并发下会导致延迟增大,因为又把消息放回线程池排队了。2. 相对于一条tcp链接,使用pool会更加灵活,且连接数也很少,并没有性能影响; 本框架还基于pool实现了一个[请求-响应]的通信模式*\n\u003cbr\u003e\n　客户端Pool的maxIdle(maxActive)=服务节点配置的CPU线程数*2=服务节点netty的工作线程数,pool采用FIFO先行先出的策略,可以保证在高并发下均匀的使用tcp连接,服务端就不用再次分发消息了\n### 3. 服务注册发现\n　分布式系统中都需要一个配置/服务中心,才能进行统一管理.本框架目前使用zookeeper(已支持nacos)进行服务注册,zookeeper是使用类似文件目录的结构,每个目录都可以存一个data\n\u003cbr\u003e　节点注册是使用[IP:PROT_TIME]作为目录名,data存了节点的json数据,创建模式为EPHEMERAL_SEQUENTIAL(断开后会删除该目录),这样就达到了自动监听节点上下线的效果,加入时间戳是为了解决当节点快速重启时,注册了两个目录,便于进行区分处理\n\u003cbr\u003e　客户端通过watch目录变化信息,从而获取到所有服务节点信息,同步一个副本到本地Map里(需加上读写锁),客户端就可以实现高效调用对应的服务了\n\n\n \n## Log\n### v1.1.1(2021-11-25)\n  * 支持异步调用,提升框架qps上限\n  * 升级依赖\n  * 其他优化...\n### v1.0.3(2021-04-16)\n  * 支持Nacos 2.0\n  * 支持yml,自动获取node ip\n  * 其他优化...\n### v1.0.2(2020-11-26)\n  * 客户端支持选择调用指定节点\n  * 异常处理优化\n### v1.0.1(2020-11-23)\n  * Upgrade dependencies\n### v0.1.0(2020-11-16)\n  * open source\n## Other\n  * 有问题请Add [issues](https://github.com/tohodog/QSRPC-starter/issues)\n  * 如果项目对你有帮助的话欢迎[star][star]\n  \n[logopng]: https://gitee.com/sakaue/QSRPC/raw/master/logo.png\n[testpng]: https://gitee.com/sakaue/QSRPC-starter/raw/develop/test.png\n[testpng2]: https://gitee.com/sakaue/QSRPC-starter/raw/develop/test2.png\n\n\n[licensesvg]: https://img.shields.io/badge/License-Apache--2.0-red.svg\n[license]: https://github.com/tohodog/QSRPC-starter/raw/master/LICENSE\n\n[starsvg]: https://img.shields.io/github/stars/tohodog/QSRPC-starter.svg?style=social\u0026label=Stars\n[star]: https://github.com/tohodog/QSRPC-starter\n\n[QSRPCsvg]: https://img.shields.io/badge/QSRPC-1.3.0-blue.svg\n[QSRPC]: https://github.com/tohodog/QSRPC\n\n[nacossvg]: https://img.shields.io/badge/nacos-2.0.3-2EBBFB.svg\n[nacos]: https://github.com/alibaba/nacos\n\n[QSRPCstarter-svg]: https://img.shields.io/badge/QSRPC%20starter-1.1.1-origen.svg\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftohodog%2Fqsrpc-starter","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftohodog%2Fqsrpc-starter","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftohodog%2Fqsrpc-starter/lists"}