一个轻量级、高性能的 RPC 框架,支持多种序列化方式和服务注册中心。
基于 Java + Etcd + Vert.x + 自定义协议实现。开发者可以引入 Spring Boot Starter,通过注解和配置文件快速使用框架,像调用本地方法一样轻松调用远程服务;还支持通过 SPI 机制动态扩展序列化器、负载均衡器、重试和容错策略等。
- 🚀 基于 Vert.x 的高性能网络通信
- 🔄 支持多种序列化方式(JDK、JSON、Hessian、Kryo)
- 🔍 支持多种服务注册中心(etcd)
- ⚖️ 支持多种负载均衡策略
- 🔄 支持服务重试机制
- 🌱 支持 Spring Boot 快速集成
- 🛡️ 支持心跳检测和服务健康检查
- 📦 支持服务版本管理
- 基于 JDK 动态代理 + 工厂模式实现
- 为指定服务接口类生成可发送 HTTP 请求的代理对象
- 实现远程方法的无感知调用
- 定义通用的序列化器接口
- 支持多种序列化方式:JDK、JSON、Hessian、Kryo
- 使用 ThreadLocal 解决 Kryo 序列化器的线程安全问题
- 通过 SPI 机制支持自定义扩展
- 基于 Vert.x 的 HTTP 服务器
- 实现服务提供者和消费者的高性能网络通信
- 自定义协议解决 HTTP 协议头信息过多的问题
- 基于 Vert.x TCP 服务器 + 紧凑型消息结构提升性能
- 基于 Vert.x 的 Handler 接口实现异步处理
- 支持请求数据的序列化和反序列化
- 通过反射机制调用服务实现类
- 基于 Etcd 实现高可用的分布式注册中心
- 利用层级结构和 Jetcd 的 KvClient 存储服务信息
- 支持服务心跳检测和自动续期
- 通过 SPI 机制支持扩展
- 支持一致性 Hash、轮询、随机等算法
- 通过 SPI 机制支持自定义扩展
- 提高服务提供者集群处理能力
- 基于 Guava Retrying 实现多种重试策略
- 支持固定间隔、指数退避等策略
- 通过 SPI 机制支持自定义扩展
- 全局配置加载:使用双检锁单例模式维护配置
- 接口 Mock:支持返回模拟数据
- 消费者服务缓存:提高性能
- 注解驱动:降低使用成本
- 基于 Vert.x TCP 服务器设计实现
- 自主设计紧凑型消息结构
- 解决 TCP 半包粘包问题
- 相比 HTTP 协议性能提升显著
- 基于 SPI 机制实现模块动态扩展
- 支持自定义序列化器、负载均衡器、重试策略等
- 工厂模式 + 单例模式简化对象创建
- 基于 Etcd 实现分布式注册中心
- 支持服务心跳检测和自动续期
- 利用 Watch 机制实现服务缓存更新
- 支持服务节点自动下线
- 支持轮询、随机、一致性 Hash 等算法
- 通过一致性 Hash 解决节点下线和倾斜问题
- 支持自定义负载均衡策略
- 基于 Guava Retrying 实现多种重试策略
- 支持故障转移、失败自动恢复等容错策略
- 通过 SPI 机制支持自定义扩展
- 支持 Spring Boot 快速集成
- 通过注解简化服务注册和调用
- 降低开发者使用成本
<dependency>
<groupId>com.xty</groupId>
<artifactId>xty-rpc-spring-boot-starter</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>在 application.yml 中配置:
rpc:
registry:
registry: etcd
address: http://localhost:2379
timeout: 10000- 在启动类上添加
@EnableRpc注解:
@SpringBootApplication
@EnableRpc
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}- 实现服务接口并添加
@RpcService注解:
@RpcService
public class UserServiceImpl implements UserService {
@Override
public User getUser(Long id) {
return new User(id, "test");
}
}- 在启动类上添加
@EnableRpc注解:
@SpringBootApplication
@EnableRpc
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}- 注入服务接口:
@RestController
public class UserController {
@RpcReference
private UserService userService;
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUser(id);
}
}- RPC 是应用层协议,用于实现远程方法调用
- HTTP 是 RPC 框架网络传输的一种可选方式
- RPC 通常基于 TCP 和自定义协议头实现,性能更高
- HTTP 采用文本格式,可读性好但性能较低
- 高性能:基于 Go 语言实现
- 强一致性:采用 Raft 一致性算法
- 简单易用:提供简单的 API 和丰富的功能
- 云原生:被 k8s 等主流系统使用
- 在消息头中设置请求体长度
- 使用 Vert.x 的 RecordParser 处理
- 将消息读取拆分为两次:先读固定长度头部,再读变长消息体
- 解决节点下线问题:负载被平均分摊到其他节点
- 解决倾斜问题:通过虚拟节点使分布更均匀
- 提高系统稳定性:只有部分请求会受到影响
- 提高系统可用性
- 处理临时性故障(如网络波动)
- 支持多种重试策略(固定间隔、指数退避等)
- 支持更多服务注册中心(Zookeeper、Nacos)
- 支持服务熔断和限流
- 支持服务监控和链路追踪
- 支持服务分组和灰度发布
- 支持异步调用和回调
- 支持泛化调用
- Fork 本仓库
- 创建您的特性分支 (
git checkout -b feature/AmazingFeature) - 提交您的更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 打开一个 Pull Request