Skip to content

xtyooo/My-RPC

Repository files navigation

xty-rpc

一个轻量级、高性能的 RPC 框架,支持多种序列化方式和服务注册中心。

项目介绍

基于 Java + Etcd + Vert.x + 自定义协议实现。开发者可以引入 Spring Boot Starter,通过注解和配置文件快速使用框架,像调用本地方法一样轻松调用远程服务;还支持通过 SPI 机制动态扩展序列化器、负载均衡器、重试和容错策略等。

特性

  • 🚀 基于 Vert.x 的高性能网络通信
  • 🔄 支持多种序列化方式(JDK、JSON、Hessian、Kryo)
  • 🔍 支持多种服务注册中心(etcd)
  • ⚖️ 支持多种负载均衡策略
  • 🔄 支持服务重试机制
  • 🌱 支持 Spring Boot 快速集成
  • 🛡️ 支持心跳检测和服务健康检查
  • 📦 支持服务版本管理

核心架构

1. 消费方调用

  • 基于 JDK 动态代理 + 工厂模式实现
  • 为指定服务接口类生成可发送 HTTP 请求的代理对象
  • 实现远程方法的无感知调用

2. 序列化器

  • 定义通用的序列化器接口
  • 支持多种序列化方式:JDK、JSON、Hessian、Kryo
  • 使用 ThreadLocal 解决 Kryo 序列化器的线程安全问题
  • 通过 SPI 机制支持自定义扩展

3. 网络服务器

  • 基于 Vert.x 的 HTTP 服务器
  • 实现服务提供者和消费者的高性能网络通信
  • 自定义协议解决 HTTP 协议头信息过多的问题
  • 基于 Vert.x TCP 服务器 + 紧凑型消息结构提升性能

4. 请求处理器

  • 基于 Vert.x 的 Handler 接口实现异步处理
  • 支持请求数据的序列化和反序列化
  • 通过反射机制调用服务实现类

5. 注册中心

  • 基于 Etcd 实现高可用的分布式注册中心
  • 利用层级结构和 Jetcd 的 KvClient 存储服务信息
  • 支持服务心跳检测和自动续期
  • 通过 SPI 机制支持扩展

6. 负载均衡器

  • 支持一致性 Hash、轮询、随机等算法
  • 通过 SPI 机制支持自定义扩展
  • 提高服务提供者集群处理能力

7. 重试机制

  • 基于 Guava Retrying 实现多种重试策略
  • 支持固定间隔、指数退避等策略
  • 通过 SPI 机制支持自定义扩展

8. 其他特性

  • 全局配置加载:使用双检锁单例模式维护配置
  • 接口 Mock:支持返回模拟数据
  • 消费者服务缓存:提高性能
  • 注解驱动:降低使用成本

技术亮点

1. 自定义 RPC 协议

  • 基于 Vert.x TCP 服务器设计实现
  • 自主设计紧凑型消息结构
  • 解决 TCP 半包粘包问题
  • 相比 HTTP 协议性能提升显著

2. 可扩展性设计

  • 基于 SPI 机制实现模块动态扩展
  • 支持自定义序列化器、负载均衡器、重试策略等
  • 工厂模式 + 单例模式简化对象创建

3. 高可用注册中心

  • 基于 Etcd 实现分布式注册中心
  • 支持服务心跳检测和自动续期
  • 利用 Watch 机制实现服务缓存更新
  • 支持服务节点自动下线

4. 负载均衡策略

  • 支持轮询、随机、一致性 Hash 等算法
  • 通过一致性 Hash 解决节点下线和倾斜问题
  • 支持自定义负载均衡策略

5. 重试和容错机制

  • 基于 Guava Retrying 实现多种重试策略
  • 支持故障转移、失败自动恢复等容错策略
  • 通过 SPI 机制支持自定义扩展

6. 注解驱动开发

  • 支持 Spring Boot 快速集成
  • 通过注解简化服务注册和调用
  • 降低开发者使用成本

快速开始

1. 添加依赖

<dependency>
    <groupId>com.xty</groupId>
    <artifactId>xty-rpc-spring-boot-starter</artifactId>
    <version>1.0-SNAPSHOT</version>
</dependency>

2. 配置注册中心

application.yml 中配置:

rpc:
  registry:
    registry: etcd
    address: http://localhost:2379
    timeout: 10000

3. 服务提供者

  1. 在启动类上添加 @EnableRpc 注解:
@SpringBootApplication
@EnableRpc
public class ProviderApplication {
    public static void main(String[] args) {
        SpringApplication.run(ProviderApplication.class, args);
    }
}
  1. 实现服务接口并添加 @RpcService 注解:
@RpcService
public class UserServiceImpl implements UserService {
    @Override
    public User getUser(Long id) {
        return new User(id, "test");
    }
}

4. 服务消费者

  1. 在启动类上添加 @EnableRpc 注解:
@SpringBootApplication
@EnableRpc
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
    }
}
  1. 注入服务接口:
@RestController
public class UserController {
    @RpcReference
    private UserService userService;

    @GetMapping("/user/{id}")
    public User getUser(@PathVariable Long id) {
        return userService.getUser(id);
    }
}

常见问题

1. RPC 和 HTTP 有什么区别?

  • RPC 是应用层协议,用于实现远程方法调用
  • HTTP 是 RPC 框架网络传输的一种可选方式
  • RPC 通常基于 TCP 和自定义协议头实现,性能更高
  • HTTP 采用文本格式,可读性好但性能较低

2. 为什么选择 Etcd 作为注册中心?

  • 高性能:基于 Go 语言实现
  • 强一致性:采用 Raft 一致性算法
  • 简单易用:提供简单的 API 和丰富的功能
  • 云原生:被 k8s 等主流系统使用

3. 如何解决 TCP 半包粘包问题?

  • 在消息头中设置请求体长度
  • 使用 Vert.x 的 RecordParser 处理
  • 将消息读取拆分为两次:先读固定长度头部,再读变长消息体

4. 一致性 Hash 算法有什么优势?

  • 解决节点下线问题:负载被平均分摊到其他节点
  • 解决倾斜问题:通过虚拟节点使分布更均匀
  • 提高系统稳定性:只有部分请求会受到影响

5. 为什么要使用重试机制?

  • 提高系统可用性
  • 处理临时性故障(如网络波动)
  • 支持多种重试策略(固定间隔、指数退避等)

开发计划

  • 支持更多服务注册中心(Zookeeper、Nacos)
  • 支持服务熔断和限流
  • 支持服务监控和链路追踪
  • 支持服务分组和灰度发布
  • 支持异步调用和回调
  • 支持泛化调用

贡献指南

  1. Fork 本仓库
  2. 创建您的特性分支 (git checkout -b feature/AmazingFeature)
  3. 提交您的更改 (git commit -m 'Add some AmazingFeature')
  4. 推送到分支 (git push origin feature/AmazingFeature)
  5. 打开一个 Pull Request

许可证

MIT

About

手写rpc框架

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages