一个基于 Java 21 的 RPC 学习项目,目标是从零实现一个可运行、可扩展、可集成 Spring Boot 的 RPC 框架。
项目目前包含三条主线:
rpc-easy:最小可用版,便于理解一次 RPC 调用的基础链路zyro-rpc-core:完整框架版,支持协议编解码、注册中心、负载均衡、重试与容错zyro-rpc-springboot-starter:Spring Boot Starter,支持注解式服务暴露与引用
.
├── example-common
├── example-consumer
├── example-provider
├── example-springboot-consumer
├── example-springboot-provider
├── rpc-easy
├── zyro-rpc-core
└── zyro-rpc-springboot-starter
各模块职责:
example-common:公共模型与服务接口example-provider:Java 原生 Provider 示例example-consumer:Java 原生 Consumer 示例example-springboot-provider:Spring Boot Provider 示例example-springboot-consumer:Spring Boot Consumer 示例rpc-easy:HTTP + JDK 序列化的简化版 RPC 实现zyro-rpc-core:核心框架实现zyro-rpc-springboot-starter:Starter 与注解集成层
- JDK 21
- Maven 3.9+
- Vert.x
- SPI 扩展加载
- Etcd / ZooKeeper 注册中心
- Spring Boot Starter(注解式接入)
rpc-easy 提供:
- 请求 / 响应模型
- 本地服务注册
- HTTP 通信
- 动态代理调用
- JDK 序列化
zyro-rpc-core 提供:
- 自定义 RPC 协议与编解码
- 基于 Vert.x 的 TCP 通信
- 多序列化实现:
jdk、json、kryo、hessian - 注册中心扩展:
etcd、zookeeper - 负载均衡:
roundRobin、random、consistentHash - 重试策略:
noRetry、fixedInterval - 容错策略:
failFast、failOver、failSafe、failBack - SPI 扩展点加载机制
zyro-rpc-springboot-starter 提供:
@EnableRpc@RpcService@RpcReference
zyro-rpc-core 默认配置以 RpcConfig / RegistryConfig 为准:
rpc.name:默认zyro-rpcrpc.version:默认1.0.0rpc.serverHost:默认localhostrpc.serverPort:默认8081rpc.serializer:默认jdkrpc.loadBalancer:默认roundRobinrpc.retryStrategy:默认noRetryrpc.tolerantStrategy:默认failFastrpc.registryConfig.registry:默认etcdrpc.registryConfig.address:默认http://localhost:2379
示例项目中的配置文件位于:
example-provider/src/main/resources/application.propertiesexample-consumer/src/main/resources/application.propertiesexample-springboot-provider/src/main/resources/application.propertiesexample-springboot-consumer/src/main/resources/application.properties
- 安装 JDK 21
- 安装 Maven 3.9+
- 如果运行
zyro-rpc-core或 Spring Boot 示例,准备 Etcd,默认地址为http://localhost:2379
在项目根目录执行:
mvn -DskipTests package不依赖注册中心,适合先跑通基础调用流程。
启动 Provider:
- 主类:
io.dangzitou.example.provider.EasyProviderExample
启动 Consumer:
- 主类:
io.dangzitou.example.consumer.EasyConsumerExample
默认使用 TCP + Etcd。
启动 Provider:
- 主类:
io.dangzitou.example.provider.ProviderExample
启动 Consumer:
- 主类:
io.dangzitou.example.consumer.ConsumerExample
基于 Starter,通过注解完成服务发布与引用。
启动 Provider:
- 主类:
io.dangzitou.examplespringbootprovider.ExampleSpringbootProviderApplication
启动 Consumer:
- 主类:
io.dangzitou.examplespringbootconsumer.ExampleSpringbootConsumerApplication
对应注解:
@EnableRpc:开启 RPC 自动装配,可通过needServer控制是否启动服务端@RpcService:标记服务提供者@RpcReference:注入远程代理,并可单独指定负载均衡、重试、容错与 mock
如果你是按源码学习,建议顺序如下:
- 先看
rpc-easy,理解请求模型、序列化、代理调用和服务端处理流程 - 再看
zyro-rpc-core,重点关注协议编解码、注册发现、负载均衡和容错设计 - 最后看
zyro-rpc-springboot-starter,理解框架如何接入 Spring 容器
当前仓库已包含部分单元测试,主要覆盖:
- 协议编解码
- 注册中心
- 负载均衡
- 重试策略
可在根目录执行:
mvn test