# 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
- 支持链路追踪
- 服务安全保证,支持白名单功能
- 多源配置解析