{"id":15138453,"url":"https://github.com/insist-youself/linger-rpc","last_synced_at":"2026-02-26T08:09:54.981Z","repository":{"id":235456268,"uuid":"775430737","full_name":"insist-youself/linger-rpc","owner":"insist-youself","description":"Linger RPC框架 —— 基于 Java + Etcd + Vert.x 实现的轻量级 RPC 框架","archived":false,"fork":false,"pushed_at":"2024-07-27T04:18:55.000Z","size":100,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-30T08:50:47.392Z","etag":null,"topics":["etcd","guava-retrying","hessio","hutool","json","junit","kryo","logback","lombok","spi","springbootstarter","vertx","zookeeper"],"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/insist-youself.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":"2024-03-21T11:28:51.000Z","updated_at":"2024-07-27T04:18:57.000Z","dependencies_parsed_at":null,"dependency_job_id":"3459cf1f-c859-4cd1-9782-077c3d02a389","html_url":"https://github.com/insist-youself/linger-rpc","commit_stats":null,"previous_names":["insist-youself/linger-rpc"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/insist-youself/linger-rpc","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/insist-youself%2Flinger-rpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/insist-youself%2Flinger-rpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/insist-youself%2Flinger-rpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/insist-youself%2Flinger-rpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/insist-youself","download_url":"https://codeload.github.com/insist-youself/linger-rpc/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/insist-youself%2Flinger-rpc/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":283113559,"owners_count":26781474,"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-11-07T02:00:06.343Z","response_time":61,"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":["etcd","guava-retrying","hessio","hutool","json","junit","kryo","logback","lombok","spi","springbootstarter","vertx","zookeeper"],"created_at":"2024-09-26T07:24:08.035Z","updated_at":"2025-11-07T02:03:50.016Z","avatar_url":"https://github.com/insist-youself.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Linger PRC框架 \n\n## 项目介绍🎉\n一款基于 Java + Etcd + Vert.x 实现的轻量级 RPC 框架。提供服务注册，发现，负载均衡，重试和容错策略，支持API调用，Spring集成和Spring Boot starter使用。是一个学习RPC工作原理的良好示例。\n\n通过这个简易项目的学习，可以让你从零开始实现一个类似 Dubbo 服务框架 mini 版RPC，学到 RPC 的底层原理以及各种 Java 底层原理技术的编码实践。下面看一下RPC的基本调用流程：\n\n\u003cimg src=\"https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-26%20231407.jpg\" width=\"600px\"\u003e\n\n\n## 结构 \u0026 功能🌍\n### 目录结构\n````\nlinger-rpc框架\n├─linger-rpc-core\t            -- rpc 核心代码\n├─linger-rpc-easy\t            -- rpc 简易实现\n├─example-common                    -- 示例代码公用模块\n├─example-consumer\t            -- 示例服务消费者\n├─example-provider                  -- 示例服务提供者\t \n├─example-springboot-consumer       -- 示例服务消费者（Spring Boot 框架）\n├─example-springboot-provider       -- 示例服务提供者（Spring Boot 框架）\n└─linger-rpc-spring-boot-starter    -- 注解驱动 (实现在 Spring Boot 项目中快速使用)\n````\n\n### 核心模块结构\n````\n├── bootstrap                      -\u003e 服务提供者/消费者启动器\n├── config                         -\u003e 项目配置（注册中心、框架属性配置）\n├── constant                       -\u003e 相关常量\n├── fault                          -\u003e 故障保障措施（重试、容错）\n├── loadbalancer                   -\u003e 负载均衡策略\n├── model                          -\u003e 基本模版类 (请求、处理、元数据等类)\n├── protocol                       -\u003e 协议底层实现\n├── proxy                          -\u003e 全局异常\n├── filter                         -\u003e 责任链模式过滤请求\n├── proxy                          -\u003e 服务代理\n├── registry                       -\u003e 注册中心\n├── serialize                      -\u003e 序列化与反序列化策略\n├── server                         -\u003e 服务端协议配置\n├── spi                            -\u003e SPI自定义加载类\n└── utils                          -\u003e 项目工具包\n````\n\n### 功能\n- 简单易学的代码和框架，在代码中含有大量注解 \n- 基于 Vert.x 实现长连接通信，包括心跳检测、解决粘包半包等 \n- 基于 Etcd、Zookeeper 实现分布式服务注册与发现 \n- 实现了接口 Mock 服务方便接口的测试、开发和调试\n- 实现了轮询、随机、加权随机等负载均衡算法 \n- 实现了重试机制、容错机制，保证可靠性和可用性 \n- 实现自定义协议（底层使用TCP）替代 HTTP，保证高效远程的网络传输\n- 支持 JDK 动态代理方式 \n- 支持 JSON、Hessian、Kryo、protobuf 的序列化方式\n- 加入了 Spring Boot Starter, 方便快速使用\n\n## 快速开始 🚀\n### 环境准备\n- Java17 及其以上版本\n- Maven 3\n- Etcd 单机或者集群实例\n\n### 启动示例\n#### 方式一：使用本项目中的测试用例\n1. 将项目克隆到本地\n````\ngit clone https://github.com/insist-youself/linger-rpc.git\n````\n2. IDEA打开项目\n\n使用 IDEA 打开，等待项目初始化完成。\n\n3. 运行 Etcd\n\n如果没有安装的过需要先去下载。（本地使用可参考最后FQA）\n\n4. 修改配置文件\n\n修改 linger-rpc-core 中 config 目录下RegistryConfig配置文件中注册中心的地址(配置文件中 Etcd 默认的地址为localhost:2380)\n![image](https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20003235.png)\n\n\n4. 启动项目（按照图中顺序）\n\nPS：启动项目前，必须要确保 Etcd 已启动.\n\n\u003cimg src=\"https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20004208%281%29.png\" width=\"500px\"\u003e\n\n- 最后，执行服务消费者的单元测试，验证能否跑通整个流程。\n![img.png](https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20110812%281%29.png)\n\n- 如下图，调用成功：\n![img_1.png](https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20111142.jpg)\n\n#### 方式二：将该rpc框架运用到自己项目中\n1. 下载源码\n````\ngit clone https://github.com/insist-youself/linger-rpc.git\n````\n2.  编译安装 jar 包到本地仓库（注意如果是服务器上面，需要上传到私服仓库）\n````\nmvn clean install\n````\n3. 新建Spring Boot Maven工程\n\n在本地新建两个工程，用于模拟客户端和服务端。（这里以之前使用到的example为例）\n\u003cimg src=\"https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20114910.jpg\" width=\"450px\"\u003e\n\n\n4. 引入入依赖\n\n在项目中的pom引入刚刚安装的依赖（客户端、服务端都需要引入）\n``` xml\n\u003cdependency\u003e\n    \u003cgroupId\u003ecom.linger\u003c/groupId\u003e\n    \u003cartifactId\u003elinger-rpc-spring-boot-starter\u003c/artifactId\u003e\n    \u003cversion\u003e0.0.1-SNAPSHOT\u003c/version\u003e\n\u003c/dependency\u003e\n```\n\n5. 定义服务接口\n```java\npublic interface UserService {\n\n    /**\n     * 获取用户\n     *\n     * @param user\n     * @return\n     */\n    User getUser(User user);\n    \n}\n```\n6. 实现接口，使用自定义注解`@RpcService`暴露一个服务接口\n```java\n@RpcService\npublic class UserServiceImpl implements UserService {\n\n    public User getUser(User user) {\n        System.out.println(\"用户名：\" + user.getName());\n        return user;\n    }\n}\n```\n7. 服务端启动类也要加上注解`@EnableRpc`\n```java\n@SpringBootApplication\n@EnableRpc\npublic class ExampleSpringbootProviderApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(ExampleSpringbootProviderApplication.class, args);\n    }\n\n}\n```\n8. 客户端启动类加上注解`@EnableRpc(needServer = false)`\n```java\n@SpringBootApplication\n@EnableRpc(needServer = false)\npublic class ExampleSpringbootConsumerApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(ExampleSpringbootConsumerApplication.class, args);\n    }\n\n}\n```\n\n9. 使用自定义注解`@RpcReference`自动注入服务端暴露的接口服务\n```java\n@Service\npublic class ExampleServiceImpl{\n\n    @RpcReference\n    private UserService userService;\n\n    public void test(){\n        User user = new User();\n        user.setName(\"Hello linger~~\");\n        User resultUser = userService.getUser(user);\n        System.out.println(resultUser.getName());\n    }\n\n}\n```\n10. 启动项目 \n\n启动服务端（服务提供者），再启动客户端（服务消费者）。\n\n11. 测试结果\n\n\u003cimg src=\"https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20114541%281%29.png\" width=\"1000px\"\u003e\n\n\n\n## FAQ🔎\n### Etcd的安装和可视化\n#### 安装\n\n进入Etcd官方的下载页：[https:/github.com/etcd-io/etcd/releases](https:/github.com/etcd-io/etcd/releases)\n\n也可以在这里下载：[https:/etcd.io/docs/v3.2/install/](https:/etcd.io/docs/v3.2/install/)\n\n找到自己操作系统的版本执行即可\n\n安装完成后，会得到3个脚本：\n\n- etcd: etcd服务本身\n\n- etcdctl: 客户端，用于操作etcd,比如读写数据\n\n- etcdutl: 备份恢复工具\n\n执行etcd脚本后，可以启动etcd服务，服务默认占用2379和2380端口，作用分别如下：\n\n- 2379:提供HTTP API服务，和etcdct交互\n\n- 2380:集群中节点间通讯\n\nwindow下执行成功显示如下：\n\n\u003cimg src=\"https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20120231.jpg\" width=\"800px\"\u003e\n\n#### Etcd可视化工具\n\n一般情况下，我们使用数据存储中间件时，一定要有一个可视化工具，能够更直观清地管理已经存储的数据。比如\nRedis Redis Desktop Manager.\n\n同样的，Etcd也有一些可视化工具，比如：\n\netcdkeeper: https://github.com/evildecay/etcdkeeper/\n\nkstone: https://github.com/kstone-io/kstone/tree/master/charts\n\n安装后，执行命令，可以在指定端口启动可视化界面（默认是8080端口）。\n```\n./etcdkeeper -p 8080\n```\n\n安装后，访问本地 [http:/127.0.0.1:8080/etcdkeeper/](http:/127.0.0.1:8080/etcdkeeper/) ,就能看到可视化页面了，如图：\n\n\u003cimg src=\"https://webs-tlias-plus.oss-cn-hangzhou.aliyuncs.com/%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE%202024-07-27%20120705.jpg\" width=\"900px\"\u003e","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finsist-youself%2Flinger-rpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finsist-youself%2Flinger-rpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finsist-youself%2Flinger-rpc/lists"}