# momo-rpc **Repository Path**: AthenaDev/momo-rpc ## Basic Information - **Project Name**: momo-rpc - **Description**: 一款轻量级、高可用、可扩展的分布式RPC框架 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2025-01-27 - **Last Updated**: 2025-04-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: component, rpc ## README # Momo-RPC 一款轻量级、高可用、可扩展的分布式RPC框架 ## 基本功能说明 当前版本: v1.0.1 - 实现基本的RPC调用 - 调用方基于JDK动态代理,反射形成RPC请求 - 提供方根据RPC请求反射获取指定服务并调用,封装RPC响应 - 自定义RPC通信协议,支持JSON/Hessien等多种序列化方式 - 基于Netty异步高性能通信框架进行服务调用方与提供方之间的通信 - 引入Zookeeper作为注册中心,支持服务注册与发现,并引入Zookeeper动态监听功能 - 支持Spring Boot接入,相对原生Java实现非侵入式对接 - 可扩展性支持 - 基于SPI插件机制,用户可以根据接口自定义负载均衡、超时重试、熔断限流等功能的实现策略,扩展框架的功能 - 高可用保障 - 提供三种负载均衡策略:随机、轮询、一致性哈希 - 提供三种超时策略:固定间隔、线性退避、指数退避 - 提供熔断策略 - 提供三种限流策略:固定窗口、滑动窗口、令牌桶 ## 项目模块说明 - rpc-api:接口说明 - rpc-consumer-demo: 消费者示例(原生Java接入) - rpc-provider-demo: 提供者示例(原生Java接入) - rpc-consumer-springboot-demo: 消费者示例(Springboot接入) - rpc-provider-springboot-demo: 提供者示例(Springboot接入) - rpc-core: 实现RPC调用的代码 ## 接入说明 ### 原生Java 参考 rpc-consumer-demo、rpc-provider-demo 前提:JDK 8、Zookeeper 3.5(本框架使用Curator4.x作为Zookeeper客户端) 步骤: 1、在`rpc-api`中定义接口 2、服务调用方和提供方均需使用Maven引入`rpc-core`、`rpc-api`依赖 ```xml org.momo rpc-api 1.0-SNAPSHOT org.momo rpc-core 1.0-SNAPSHOT ``` 3、服务调用方 1. 引入`ConsumerBootstrap`类并调用`init`方法,启动RPC服务调用方所需组件 2. 创建`ReferenceInfo`对象并填写代理信息,包括调用服务的名称、版本、方法级负载均衡策略 3. 调用`ServiceProxyFactory`类获取调用代理对象 ```java public class ConsumerExample { public static void main(String[] args) throws InterruptedException { ConsumerBootstrap.init(); ReferenceInfo userInfo = new ReferenceInfo(UserService.class, "user", "v1.0", null); UserService userService = ServiceProxyFactory.getProxy(userInfo); ReferenceInfo orderInfo = new ReferenceInfo(OrderService.class, "order", "v1.0", null); OrderService orderService = ServiceProxyFactory.getProxy(orderInfo); } } ``` 4、服务提供方: 1. 2. 创建`ProviderMetaInfo`对象并填写服务组件信息,包括服务名称、版本 3. 引入`ProviderBootstrap`类并调用`init`方法,启动RPC服务提供方所需组件,并注册服务 ```java public class ProviderExample { public static void main(String[] args) { List providerMetaInfos = new ArrayList<>(); ProviderMetaInfo userServiceMetaInfo = new ProviderMetaInfo(UserServiceImpl.class, "user", "v1.0"); ProviderMetaInfo orderServiceMetaInfo = new ProviderMetaInfo(OrderServiceImpl.class, "order", "v1.0"); providerMetaInfos.add(userServiceMetaInfo); providerMetaInfos.add(orderServiceMetaInfo); ProviderBootstrap.init(providerMetaInfos); } } ``` ### 基于Springboot 参考 rpc-consumer-springboot-demo、rpc-provider-springboot-demo 前提:JDK 8、Zookeeper3.5(本框架使用Curator4.x作为Zookeeper客户端)、Spring Boot 2.6 步骤: 1、在`rpc-api`中定义接口 2、服务调用方和提供方均需使用Maven引入`rpc-springboot-starter`、`rpc-api`依赖 ```xml org.momo rpc-api 1.0-SNAPSHOT org.momo rpc-springboot-starter 1.0-SNAPSHOT ``` 3、服务提供方 1. 提供服务的类,使用`@RpcService`注解声明服务名和服务版本 2. 对于每一个方法,使用`@RateLimit`注解声明该方法所用的限流策略及其参数,使用`@Retry`注解声明是否支持重试(一般只有幂等方法支持重试,非幂等方法需要进一步处理才可以使用重试) ```java @Service @RpcService(serviceName = "user", serviceVersion = "v1.0") public class UserServiceImpl implements UserService { @Override @RateLimit(type = RateLimitKey.TOKEN) @Retry public User queryUserById(Long id) { return new User(id, "test"); } } ``` 3. Spring Boot启动类添加`@EnableRpcProvider`注解 ```java @SpringBootApplication @EnableRpcProvider public class ConsumerSpringbootApplication { public static void main(String[] args) { SpringApplication.run(ConsumerSpringbootApplication.class, args); } } ``` 4、服务调用方 1. 使用`@RpcReference`注解声明所调用服务的名称和版本 2. 使用`@RpcMethod`注解声明所调用方法的负载均衡策略 ```java @Slf4j @Service public class MyUserService { @RpcReference( serviceName = "user", serviceVersion = "v1.0", methodConfigs = { @RpcMethod(methodName = "queryUserById", loadBalancer = LoadBalanceKey.POLLING) } ) public UserService userService; public User getUser(Long id) { return userService.queryUserById(id); } } ``` 3. Spring Boot启动类添加`@EnableRpcConsumer`注解 ```java @SpringBootApplication @EnableRpcConsumer public class ConsumerSpringbootApplication { public static void main(String[] args) { SpringApplication.run(ConsumerSpringbootApplication.class, args); } } ``` ## 版本说明 ### v1.0.1 - 实现基本的RPC调用 - 调用方基于JDK动态代理,反射形成RPC请求 - 提供方根据RPC请求反射获取指定服务并调用,封装RPC响应 - 自定义RPC通信协议,支持JSON/Hessien等多种序列化方式 - 基于Netty异步高性能通信框架进行服务调用方与提供方之间的通信 - 引入Zookeeper作为注册中心,支持服务注册与发现,并引入Zookeeper动态监听功能 - 支持Spring Boot接入,相对原生Java实现非侵入式对接 - 可扩展性支持 - 基于SPI插件机制,用户可以根据接口自定义负载均衡、超时重试、熔断限流等功能的实现策略,扩展框架的功能 - 高可用保障 - 提供三种负载均衡策略:随机、轮询、一致性哈希 - 提供三种超时策略:固定间隔、线性退避、指数退避 - 提供熔断策略 - 提供三种限流策略:固定窗口、滑动窗口、令牌桶 ## 后续待实现功能 - 支持多种注册中心,nacos/redis - 支持链路追踪 - 服务安全保证,支持白名单功能 - 多源配置解析