Skip to content

survivorff/frme-rpc-framework

Repository files navigation

FRME高性能RPC框架

Java Spring Boot Netty License

📖 项目简介

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+ (可选)

1. 添加依赖

<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>

2. 定义服务接口

public interface UserService {
    User getUserById(Long id);
    List<User> getAllUsers();
    boolean saveUser(User user);
}

3. 实现服务提供者

@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;
    }
}

4. 启动服务提供者

@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));
    }
}

5. 创建服务消费者

@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

访问地址:http://localhost:8090

功能特性

  • 📈 实时监控面板
  • 🔍 服务实例管理
  • 📊 性能统计报表
  • ⚙️ 配置管理
  • 🚨 告警通知

🐛 故障排查

常见问题

  1. 连接超时

    原因:网络不通或服务端未启动
    解决:检查网络连接和服务端状态
    
  2. 序列化异常

    原因:客户端和服务端序列化协议不一致
    解决:统一序列化协议配置
    
  3. 服务发现失败

    原因:注册中心连接失败或服务未注册
    解决:检查注册中心配置和服务注册状态
    

日志配置

<!-- 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>

🤝 贡献指南

我们欢迎任何形式的贡献!

  1. Fork 项目
  2. 创建特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 创建 Pull Request

📄 许可证

本项目采用 Apache License 2.0 许可证。详情请参阅 LICENSE 文件。

📞 联系我们

🙏 致谢

感谢以下开源项目的支持:


⭐ 如果这个项目对你有帮助,请给我们一个星标!

About

a java rpc framework

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages