FRME RPC Framework 是一个高性能、低延迟的Java RPC框架,专为分布式系统设计。框架采用模块化架构,支持多种序列化协议、负载均衡算法和容错机制,为企业级应用提供可靠的服务间通信解决方案。
- 基于Netty NIO:采用高性能网络通信框架
- 零拷贝技术:减少数据复制次数,提升传输效率
- 连接池复用:减少连接建立开销
- 批量处理:支持请求批量处理,提高吞吐量
- 序列化协议:Protobuf、Kryo、Hessian、JSON、Java原生
- 注册中心:Zookeeper、Nacos、Consul
- 负载均衡:轮询、随机、加权随机、一致性哈希
- 健康检查:自动检测服务可用性
- 熔断降级:防止服务雪崩
- 超时重试:自动重试机制
- 限流保护:防止服务过载
- 性能指标:完整的调用统计和性能监控
- 管理控制台:Web界面管理和监控
- 链路追踪:支持分布式链路追踪
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ 客户端应用 │ │ 注册中心 │ │ 服务端应用 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ RPC客户端代理 │◄──►│ 服务注册发现 │◄──►│ RPC服务端处理 │
└─────────────────┘ └─────────────────┘ └─────────────────┘
│ │
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ 负载均衡器 │ │ 业务服务实现 │
└─────────────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ 网络通信层 │◄──────────────────────────────────────────────┘
└─────────────────┘
│
▼
┌─────────────────┐
│ 序列化层 │
└─────────────────┘
frme-rpc-framework/
├── frme-rpc-core/ # 核心模块
│ ├── ServiceInstance # 服务实例模型
│ ├── RpcRequest/Response # RPC请求响应模型
│ └── 核心接口定义
├── frme-rpc-registry/ # 服务注册发现
│ ├── Zookeeper支持
│ ├── Nacos支持
│ └── Consul支持
├── frme-rpc-transport/ # 网络传输层
│ ├── Netty实现
│ ├── 编解码器
│ └── 连接管理
├── frme-rpc-serialization/ # 序列化层
│ ├── Protobuf序列化
│ ├── Kryo序列化
│ ├── Hessian序列化
│ └── JSON序列化
├── frme-rpc-loadbalancer/ # 负载均衡
│ ├── 轮询算法
│ ├── 随机算法
│ ├── 加权随机
│ └── 一致性哈希
├── frme-rpc-fault-tolerance/ # 容错机制
│ ├── 熔断器
│ ├── 重试机制
│ └── 限流器
├── frme-rpc-admin/ # 管理控制台
│ ├── Web界面
│ ├── 监控面板
│ └── 配置管理
└── frme-rpc-examples/ # 示例项目
├── 服务提供者示例
└── 服务消费者示例
- Java 8+
- Maven 3.6+
- Zookeeper 3.6+ (可选)
<dependency>
<groupId>com.frme.rpc</groupId>
<artifactId>frme-rpc-core</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.frme.rpc</groupId>
<artifactId>frme-rpc-registry</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.frme.rpc</groupId>
<artifactId>frme-rpc-transport</artifactId>
<version>1.0.0</version>
</dependency>public interface UserService {
User getUserById(Long id);
List<User> getAllUsers();
boolean saveUser(User user);
}@Component
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Long id) {
// 业务逻辑实现
return new User(id, "张三", "zhangsan@example.com");
}
@Override
public List<User> getAllUsers() {
// 业务逻辑实现
return Arrays.asList(
new User(1L, "张三", "zhangsan@example.com"),
new User(2L, "李四", "lisi@example.com")
);
}
@Override
public boolean saveUser(User user) {
// 业务逻辑实现
System.out.println("保存用户: " + user);
return true;
}
}@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
// 创建服务端配置
RpcServerConfig config = new RpcServerConfig();
config.setHost("localhost");
config.setPort(8080);
config.setRegistryAddress("localhost:2181");
config.setRegistryType("zookeeper");
// 创建并启动RPC服务端
RpcServer rpcServer = new DefaultRpcServer(config);
// 注册服务
UserService userService = new UserServiceImpl();
rpcServer.registerService(UserService.class, userService);
// 启动服务
rpcServer.start();
System.out.println("RPC服务端启动成功,监听端口: " + config.getPort());
// 添加关闭钩子
Runtime.getRuntime().addShutdownHook(new Thread(rpcServer::stop));
}
}@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
// 创建客户端配置
RpcClientConfig config = new RpcClientConfig();
config.setRegistryAddress("localhost:2181");
config.setRegistryType("zookeeper");
config.setLoadBalanceType("round_robin");
// 创建RPC客户端
RpcClient rpcClient = new DefaultRpcClient(config);
rpcClient.start();
// 创建服务代理
UserService userService = rpcClient.createProxy(UserService.class);
// 调用远程服务
User user = userService.getUserById(1L);
System.out.println("获取用户信息: " + user);
List<User> users = userService.getAllUsers();
System.out.println("获取所有用户: " + users);
boolean result = userService.saveUser(new User(3L, "王五", "wangwu@example.com"));
System.out.println("保存用户结果: " + result);
// 关闭客户端
rpcClient.stop();
}
}RpcServerConfig config = new RpcServerConfig();
config.setApplicationName("user-service"); // 应用名称
config.setHost("localhost"); // 服务主机
config.setPort(8080); // 服务端口
config.setRegistryAddress("localhost:2181"); // 注册中心地址
config.setRegistryType("zookeeper"); // 注册中心类型
config.setSerializationType("kryo"); // 序列化类型
config.setServiceVersion("1.0.0"); // 服务版本
config.setServiceWeight(100); // 服务权重
config.setHeartbeatInterval(30000); // 心跳间隔
config.setIoThreads(4); // IO线程数
config.setWorkerThreads(8); // 工作线程数RpcClientConfig config = new RpcClientConfig();
config.setApplicationName("user-client"); // 应用名称
config.setRegistryAddress("localhost:2181"); // 注册中心地址
config.setRegistryType("zookeeper"); // 注册中心类型
config.setSerializationType("kryo"); // 序列化类型
config.setLoadBalanceType("round_robin"); // 负载均衡算法
config.setConnectTimeout(3000); // 连接超时
config.setRequestTimeout(5000); // 请求超时
config.setRetryTimes(3); // 重试次数
config.setCircuitBreakerEnabled(true); // 启用熔断器- CPU: Intel i7-8700K 6核12线程
- 内存: 32GB DDR4
- 网络: 千兆以太网
- JVM: OpenJDK 11
| 序列化协议 | QPS | 平均延迟 | P99延迟 | 内存使用 |
|---|---|---|---|---|
| Kryo | 45000 | 2.1ms | 8.5ms | 低 |
| Protobuf | 42000 | 2.3ms | 9.2ms | 低 |
| Hessian | 38000 | 2.8ms | 11.5ms | 中 |
| JSON | 32000 | 3.5ms | 15.2ms | 中 |
| Java | 28000 | 4.2ms | 18.8ms | 高 |
| 算法类型 | 选择耗时 | 内存占用 | 适用场景 |
|---|---|---|---|
| 轮询 | < 1μs | 极低 | 无状态服务 |
| 随机 | < 1μs | 极低 | 无状态服务 |
| 加权随机 | < 2μs | 低 | 不同性能服务器 |
| 一致性哈希 | < 5μs | 中 | 有状态服务 |
// 异步调用
CompletableFuture<User> future = userService.getUserByIdAsync(1L);
future.thenAccept(user -> {
System.out.println("异步获取用户: " + user);
});// 批量调用
List<Long> userIds = Arrays.asList(1L, 2L, 3L);
List<User> users = userService.getUsersByIds(userIds);// 注册自定义序列化器
SerializerFactory.registerSerializer(SerializationType.CUSTOM, new CustomSerializer());// 实现自定义负载均衡算法
public class CustomLoadBalancer implements LoadBalancer {
@Override
public ServiceInstance select(List<ServiceInstance> instances, Object request) {
// 自定义选择逻辑
return instances.get(0);
}
@Override
public LoadBalanceType getType() {
return LoadBalanceType.CUSTOM;
}
}
// 注册自定义负载均衡器
LoadBalancerFactory.registerLoadBalancer(LoadBalanceType.CUSTOM, new CustomLoadBalancer());启动管理控制台:
java -jar frme-rpc-admin-1.0.0.jar- 📈 实时监控面板
- 🔍 服务实例管理
- 📊 性能统计报表
- ⚙️ 配置管理
- 🚨 告警通知
-
连接超时
原因:网络不通或服务端未启动 解决:检查网络连接和服务端状态 -
序列化异常
原因:客户端和服务端序列化协议不一致 解决:统一序列化协议配置 -
服务发现失败
原因:注册中心连接失败或服务未注册 解决:检查注册中心配置和服务注册状态
<!-- logback-spring.xml -->
<configuration>
<logger name="com.frme.rpc" level="DEBUG"/>
<logger name="com.frme.rpc.transport" level="INFO"/>
<logger name="com.frme.rpc.registry" level="INFO"/>
</configuration>我们欢迎任何形式的贡献!
- Fork 项目
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
本项目采用 Apache License 2.0 许可证。详情请参阅 LICENSE 文件。
- 项目主页: https://github.com/frme/frme-rpc-framework
- 问题反馈: https://github.com/frme/frme-rpc-framework/issues
- 邮箱: support@frme.com
感谢以下开源项目的支持:
- Netty - 高性能网络框架
- Spring Boot - 应用框架
- Apache Zookeeper - 分布式协调服务
- Kryo - 高性能序列化框架
⭐ 如果这个项目对你有帮助,请给我们一个星标!