{"id":22140838,"url":"https://github.com/flowers-bloom/srpc","last_synced_at":"2025-03-24T11:18:37.441Z","repository":{"id":183216981,"uuid":"311586141","full_name":"flowers-bloom/srpc","owner":"flowers-bloom","description":"SRPC 是一个基于 Netty 实现网络通信，Zookeeper 实现服务暴露和发现，并实现了序列化、负载均衡、重连机制的远程调用框架。","archived":false,"fork":false,"pushed_at":"2022-05-15T09:01:53.000Z","size":101,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-01-29T16:28:04.338Z","etag":null,"topics":["java","netty","rpc","zookeeper"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/flowers-bloom.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,"governance":null}},"created_at":"2020-11-10T08:00:25.000Z","updated_at":"2022-05-15T09:01:56.000Z","dependencies_parsed_at":"2023-07-23T13:48:58.683Z","dependency_job_id":null,"html_url":"https://github.com/flowers-bloom/srpc","commit_stats":null,"previous_names":["flowers-bloom/srpc"],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowers-bloom%2Fsrpc","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowers-bloom%2Fsrpc/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowers-bloom%2Fsrpc/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/flowers-bloom%2Fsrpc/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/flowers-bloom","download_url":"https://codeload.github.com/flowers-bloom/srpc/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245258214,"owners_count":20585977,"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":["java","netty","rpc","zookeeper"],"created_at":"2024-12-01T21:07:58.584Z","updated_at":"2025-03-24T11:18:37.419Z","avatar_url":"https://github.com/flowers-bloom.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# SRPC\n![build](https://img.shields.io/badge/build-passing-brightgreen) ![oraclejdk](https://img.shields.io/badge/oraclejdk-1.8-red) ![version](https://img.shields.io/badge/version-2.0-blue)  \n\nSRPC 是一个基于 Netty 实现网络通信，Zookeeper 实现服务暴露和发现，并实现了序列化、负载均衡、重连机制的远程调用框架。其中部分设计思路借鉴于 Dubbo 框架。  \n\n## 特性 \n1. 基于 Netty 实现高性能网络通信，并增加了客户端重连的容错机制  \n2. 使用 Zookeeper 实现服务暴露和发现  \n3. 实现的序列化方式：fastjson、hessian、kryo   \n4. 实现的负载均衡算法：随机负载均衡、加权随机负载均衡、一致性哈希负载均衡   \n5. RPC 提供直连方式和注册中心方式  \n6. 自定义 SPI 注解，实现 ExtensionLoader 代替 JDK ServiceLoader 方式来加载实现类，并实现依赖注入    \n7. 接口抽象良好，模块耦合度低  \n\n\n## 模块\n- srpc-common 公用模块  \n- srpc-serialization 序列化模块  \n- srpc-transport 网络通信模块  \n- srpc-core 核心模块  \n- srpc-api 接口模块  \n- srpc-demo 示例模块  \n\n\n## 日志\n项目开始于2020.11.01，以下是目前已实现的功能点  \n\n|        功能点       |  完成时间   |  备注  |\n| :----------------: | :--------: | :------------------: | \n| 实现基本的 RPC 通信 | 2020.11.10 | 网络通信接口，使用 Netty 进行实现，并借助 CompletableFuture 实现线程间通信；序列化接口，使用 FastJson 进行实现；远程方法调用，使用 JDK Proxy 类实现动态代理 |\n| 实现 Netty 心跳检测及处理；实现 zookeeper 服务注册和发现，以及客户端随机负载均衡 | 2020.11.11 | 使用 Netty 自带心跳检测实现方式；在结点上注册 watcher 实现服务列表的动态更新 |  \n| 实现 Netty 断线重连 | 2020.11.13 | 实现自定义有限次数重连策略；实现重连 handler ，采用异步方式连接远程主机，但会造成初始时客户端无法主动发送消息，因为 channel 虽然实例化了，但还未连接上远程主机 |\n| 项目拆分成多个模块，实现解耦 | 2020.11.27 | 无 |\n| 新增 hessian、kryo 序列化方式；新增加权随机、一致性哈希负载均衡算法；provider 和 consumer 使用建造者方式创建 | 2020.11.28 | 无 |\n| 新增 SPI 注解声明默认实现类，采用 ExtensionLoader 的方式加载实现类 | 2020.12.2 | 借鉴 Dubbo SPI 设计 |\n| 新增加载扩展类时依赖注入和对类进行包装 | 2020.12.4 | 无 |\n\n## 使用\n### 服务提供者\n**1. 定义服务接口**  \n```java\npublic interface HelloService {\n    String sayHello(String s);\n}\n```\n\n**2. 在服务提供方实现接口**  \n```java\npublic class HelloServiceImpl implements HelloService {\n    @Override\n    public String sayHello(String s) {\n        return \"hello, \" + s;\n    }\n}\n```\n\n**3. 实现类声明**  \n在 resource 目录下创建 META-INF/services 目录，并创建以接口全限定类名为文件名的文件，文件内声明标识和实现类名的映射   \n\neg：文件名 xjh.rpc.api.GreetService   \nhello = xjh.rpc.api.impl.HelloServiceImpl  \nhi = xjh.rpc.api.impl.HiServiceImpl  \n\n**4. 启动服务提供者**  \n```java\npublic class Server {\n    public static void main(String[] args) {\n        /*\n        1. api 直接调用（注册中心方式）\n         */\n        Endpoint endpoint = new Endpoint(\"127.0.0.1:9002\");\n        \n        Provider provider = new Provider();\n        provider.address(endpoint)\n                .serviceName(\"test2\")\n                .weight(6)\n                .registry(\"127.0.0.1:2181\")\n                .build();\n\n        /*\n        2. xml 配置文件调用\n         */\n\n//        ClassPathXmlApplicationContext context =\n//                new ClassPathXmlApplicationContext(\"META-INF/spring/provider.xml\");\n//        context.start();\n    }\n}\n```\n\n### 服务消费者\n**1. 调用远程服务**  \n```java\npublic class Client {\n\n    public static void main(String[] args) {\n        /*\n        1. api 直接调用（注册中心方式）\n         */\n        Consumer consumer = new Consumer();\n        Endpoint remoteAddress = new Endpoint(\"127.0.0.1:9004\");\n        \n        consumer.registry(\"127.0.0.1:2181\")\n                //.remoteAddress(remoteAddress)\n                .name(\"test1\")\n                .loadBalance(new ConsistentHashLoadBalance())\n                .build();\n\n        HelloService greetService = consumer.getProxy(HelloService.class);\n        String hello = greetService.sayHello(\"i am consumer.\");\n        System.out.println(hello);\n\n        /*\n        2. xml 配置文件调用 暂无法使用\n         */\n//        ClassPathXmlApplicationContext context =\n//                new ClassPathXmlApplicationContext(\"consumer.xml\");\n//        context.start();\n//\n//        HelloService greetService = (HelloService) context.getBean(\"greetService\");\n//        String hello = greetService.sayHello(\"i am consumer\");\n//        System.out.println(hello);\n    }\n}\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflowers-bloom%2Fsrpc","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fflowers-bloom%2Fsrpc","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fflowers-bloom%2Fsrpc/lists"}