# DLRPC
**Repository Path**: Dlow71/dlrpc
## Basic Information
- **Project Name**: DLRPC
- **Description**: DLRPC 是一款基于 微内核 + 插件化架构 的高性能 RPC 框架,支持服务注册发现、负载均衡、容错、拦截器链等核心能力,采用 SPI 动态扩展机制 实现组件解耦与灵活扩展。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2025-10-31
- **Last Updated**: 2025-10-31
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
🚀 DLRPC
轻量级、高性能的分布式 RPC 框架
[](https://www.oracle.com/java/)
[](https://spring.io/projects/spring-boot)
[](https://netty.io/)
[](LICENSE)
[](https://maven.apache.org/)
特性 •
快速开始 •
架构设计 •
配置 •
扩展
---
## 📖 项目简介
**DLRPC** 是一个基于 Spring Boot 和 Netty 构建的轻量级、高性能 RPC 框架,旨在为分布式系统提供简单易用、功能完善的远程服务调用能力。
### 💡 设计理念
- **开箱即用**:基于 Spring Boot Starter,零配置快速启动
- **简单优雅**:注解驱动,学习成本低,开发效率高
- **高性能**:Netty 异步非阻塞 I/O,支持多种高效序列化方式
- **可扩展**:基于 SPI 机制,所有核心组件均可自定义扩展
- **生产就绪**:支持服务注册发现、负载均衡、容错机制等企业级特性
### 🎯 适用场景
- 微服务架构中的服务间通信
- 分布式系统的远程方法调用
- 高并发场景下的服务调用
- 需要定制化 RPC 功能的业务系统
## ✨ 核心特性
### 🎯 简单易用
- **🚀 零配置启动**:基于 Spring Boot Starter,添加依赖即可使用,无需复杂配置
- **📝 注解驱动**:通过 `@ServiceExport` 和 `@RemoteService` 注解轻松发布和调用服务
- **🔧 自动装配**:利用 Spring Boot 自动配置机制,自动注册和发现服务
### ⚡ 高性能
- **异步非阻塞**:基于 Netty 的高性能网络通信,支持异步调用
- **高效序列化**:支持 Kryo、Hessian、FastJson 等多种高效序列化方式
- **零拷贝技术**:利用 Netty 的零拷贝特性,减少数据传输开销
- **连接池复用**:复用 TCP 连接,减少连接建立和销毁的开销
### 🌐 分布式特性
- **📊 服务注册与发现**:集成 Zookeeper,自动注册和发现服务节点
- **🔄 负载均衡**:支持多种负载均衡策略(轮询、随机、一致性哈希等)
- **🛡️ 容错机制**:提供故障转移(FailOver)、快速失败(FailFast)等容错策略
- **⏱️ 超时控制**:支持调用超时设置,防止长时间阻塞
- **🔍 服务过滤**:支持客户端和服务端过滤器,实现日志、鉴权等横切关注点
### 🔌 可扩展性
- **SPI 机制**:所有核心组件均基于 SPI 设计,支持自定义扩展
- **插件化架构**:代理、序列化、注册中心、负载均衡等组件均可替换
- **灵活配置**:支持通过配置文件或注解灵活配置框架行为
## 快速开始
### 环境要求
- JDK 8+
- Maven 3.x
- Zookeeper 3.x(服务注册中心)
### Maven依赖
```xml
org.dlow
dlrpc
0.0.1-SNAPSHOT
```
### 服务提供者
**1. 定义服务接口**
```java
public interface UserService {
User getUserById(Long id);
}
```
**2. 实现服务接口并发布**
```java
@ServiceExport(version = "1.0")
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Long id) {
// 业务逻辑
return new User(id, "张三");
}
}
```
**3. 启用RPC服务端**
```java
@SpringBootApplication
@EnableProviderRpc
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
```
**4. 配置文件**
```yaml
rpc:
server:
port: 9090
register:
address: 127.0.0.1:2181
```
### 服务消费者
**1. 引用远程服务**
```java
@RestController
public class UserController {
@RemoteService(version = "1.0")
private UserService userService;
@GetMapping("/user/{id}")
public User getUser(@PathVariable Long id) {
return userService.getUserById(id);
}
}
```
**2. 启用RPC客户端**
```java
@SpringBootApplication
@EnableConsumerRpc
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
```
**3. 配置文件**
```yaml
rpc:
register:
address: 127.0.0.1:2181
```
## 📦 项目结构
```
dlrpc/
├── src/main/java/org/dlow/
│ ├── annotation/ # 核心注解(@ServiceExport、@RemoteService)
│ ├── common/ # 公共组件和常量
│ │ └── constants/ # 常量定义
│ ├── config/ # 配置类和属性绑定
│ ├── event/ # Spring 事件机制
│ ├── filter/ # 过滤器链
│ │ ├── client/ # 客户端过滤器
│ │ └── server/ # 服务端过滤器
│ ├── invoke/ # 方法调用器(反射调用)
│ ├── proxy/ # 代理实现
│ │ └── cglib/ # CGLib 动态代理
│ ├── register/ # 服务注册中心(Zookeeper)
│ ├── router/ # 负载均衡路由
│ ├── socket/ # 网络通信
│ │ ├── client/ # Netty 客户端
│ │ ├── server/ # Netty 服务端
│ │ ├── codec/ # 编解码器
│ │ └── serialization/ # 序列化实现(Kryo、Hessian、FastJson)
│ ├── spi/ # SPI 加载机制
│ ├── tolerant/ # 容错策略
│ └── utils/ # 工具类
└── src/main/resources/
└── META-INF/
└── xrpc/ # SPI 配置文件目录
```
## 🏗️ 架构设计
### 整体架构
```
┌─────────────────────────────────────────────────────────────────┐
│ Client Application │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ @RemoteService │ │
│ │ ↓ │ │
│ │ ServiceProxyProvider (CGLib 动态代理) │ │
│ │ ↓ │ │
│ │ ClientFilter Chain (过滤器链) │ │
│ │ ↓ │ │
│ │ ServiceSelector (负载均衡) │ │
│ │ ↓ │ │
│ │ FailureHandler (容错处理) │ │
│ │ ↓ │ │
│ │ Netty Client (网络通信) │ │
│ └───────────────────────────────────────────────────────────┘ │
└──────────────────────────┬──────────────────────────────────────┘
│
│ TCP/Netty
│
┌─────────────────┴─────────────────┐
│ ServiceRegistry (Zookeeper) │
│ - 服务注册 │
│ - 服务发现 │
│ - 健康检查 │
└─────────────────┬─────────────────┘
│
│
┌──────────────────────────┴──────────────────────────────────────┐
│ Server Application │
│ ┌───────────────────────────────────────────────────────────┐ │
│ │ Netty Server (接收请求) │ │
│ │ ↓ │ │
│ │ ServerFilter Chain (过滤器链) │ │
│ │ ↓ │ │
│ │ MethodExecutor (反射调用) │ │
│ │ ↓ │ │
│ │ @ServiceExport (服务实现) │ │
│ └───────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
```
### 核心组件
| 组件 | 说明 | 扩展接口 |
|------|------|----------|
| **ServiceProxyProvider** | 服务代理提供者,负责生成远程服务的本地代理对象 | `ProxyProvider` |
| **MethodExecutor** | 方法执行器,负责服务端方法的实际调用 | `Executor` |
| **ServiceRegistry** | 服务注册表,提供服务注册、发现、订阅功能 | `Registry` |
| **ServiceSelector** | 服务选择器,实现负载均衡策略 | `Selector` |
| **FailureHandler** | 失败处理器,实现容错机制 | `TolerantHandler` |
| **RpcSerialization** | 序列化组件,支持多种序列化协议 | `Serialization` |
| **ClientFilter/ServerFilter** | 过滤器,实现横切关注点 | `Filter` |
### 调用流程
**客户端调用流程**:
```
用户调用 → 代理对象 → 客户端过滤器 → 负载均衡 → 序列化 → Netty发送 → 等待响应 → 反序列化 → 返回结果
```
**服务端处理流程**:
```
Netty接收 → 反序列化 → 服务端过滤器 → 查找服务实例 → 反射调用 → 获取结果 → 序列化 → Netty返回
```
## 配置说明
### 完整配置示例
```yaml
rpc:
# 服务端配置
server:
port: 9090 # 服务监听端口
# 注册中心配置
register:
address: 127.0.0.1:2181 # Zookeeper地址
name: zookeeper # 注册中心类型
# 序列化配置
serialization: kryo # 序列化方式:kryo/hessian/fastjson
# 调用方式
invoke: reflection # 调用方式:reflection
# 代理方式
proxy: cglib # 代理方式:cglib
```
### 注解配置
**@ServiceExport** - 服务发布注解
```java
@ServiceExport(
version = "1.0", // 服务版本号
interfaceClass = UserService.class // 指定发布的接口
)
```
**@RemoteService** - 服务引用注解
```java
@RemoteService(
version = "1.0", // 服务版本号
loadBalance = LoadBalance.ROUND, // 负载均衡策略
faultTolerant = FaultTolerant.FAILOVER, // 容错策略
time = 3000, // 超时时间(ms)
timeUnit = TimeUnit.MILLISECONDS // 时间单位
)
```
## 扩展机制
框架基于SPI机制提供了良好的扩展性,支持自定义以下组件:
- **ServiceProxyProvider** - 自定义代理实现
- **MethodExecutor** - 自定义执行器
- **ServiceRegistry** - 自定义注册中心
- **ServiceSelector** - 自定义负载均衡策略
- **FailureHandler** - 自定义容错策略
- **RpcSerialization** - 自定义序列化方式
### 扩展示例
在 `resources/META-INF/xrpc/` 目录下创建SPI配置文件:
```
org.dlow.router.ServiceSelector
```
文件内容:
```
custom=com.example.CustomServiceSelector
```
## 🛠️ 技术栈
| 技术 | 版本 | 说明 |
|------|------|------|
| **Spring Boot** | 2.7.5 | 应用框架,提供自动配置和依赖注入 |
| **Netty** | 4.1.108.Final | 高性能网络通信框架 |
| **Zookeeper** | 3.x | 服务注册中心,通过 Curator 客户端访问 |
| **Kryo** | 5.5.0 | 高性能序列化框架 |
| **Hessian** | 4.0.66 | 二进制序列化协议 |
| **FastJson** | 1.2.78 | JSON 序列化库 |
| **CGLib** | 3.3.0 | 动态代理生成 |
| **Curator** | 4.0.1 | Zookeeper 客户端框架 |
## 📊 性能特点
### 序列化性能对比
| 序列化方式 | 序列化速度 | 反序列化速度 | 序列化大小 | 推荐场景 |
|-----------|----------|------------|----------|---------|
| **Kryo** | ⚡⚡⚡⚡⚡ | ⚡⚡⚡⚡⚡ | 🔥最小 | 高性能场景(推荐) |
| **Hessian** | ⚡⚡⚡⚡ | ⚡⚡⚡⚡ | 🔥较小 | 跨语言场景 |
| **FastJson** | ⚡⚡⚡ | ⚡⚡⚡ | 📦较大 | 调试和可读性场景 |
### 负载均衡策略
- **轮询(Round Robin)**:依次选择服务提供者,适用于服务性能均衡的场景
- **随机(Random)**:随机选择服务提供者,简单高效
- **一致性哈希(Consistent Hash)**:适用于有状态服务,保证相同请求路由到同一节点
### 容错策略
- **快速失败(FailFast)**:调用失败立即抛出异常,适用于非幂等操作
- **故障转移(FailOver)**:调用失败后自动切换到其他节点重试,适用于幂等操作
## 🚧 开发指南
### 本地开发
**1. 克隆项目**
```bash
git clone https://github.com/yourusername/dlrpc.git
cd dlrpc
```
**2. 启动 Zookeeper**
```bash
# 使用 Docker 快速启动
docker run -d --name zookeeper -p 2181:2181 zookeeper:3.8
```
**3. 构建项目**
```bash
mvn clean install -DskipTests
```
**4. 运行示例**
```bash
# 启动服务提供者
cd example-provider
mvn spring-boot:run
# 启动服务消费者(新终端)
cd example-consumer
mvn spring-boot:run
```
### 自定义扩展示例
**自定义负载均衡策略**
1. 实现 `ServiceSelector` 接口
```java
public class WeightedSelector implements ServiceSelector {
@Override
public ServiceURL select(List urls) {
// 实现加权轮询逻辑
return urls.get(0);
}
}
```
2. 在 `META-INF/xrpc/org.dlow.router.ServiceSelector` 中注册
```
weighted=com.example.WeightedSelector
```
3. 配置使用
```yaml
rpc:
selector: weighted
```
## ❓ 常见问题
如何配置多个注册中心?
目前版本仅支持单个 Zookeeper 集群,但可以配置 Zookeeper 集群地址:
```yaml
rpc:
register:
address: zk1:2181,zk2:2181,zk3:2181
```
如何实现服务版本控制?
通过 `@ServiceExport` 和 `@RemoteService` 的 `version` 属性:
```java
@ServiceExport(version = "2.0")
public class UserServiceV2 implements UserService {
// 新版本实现
}
@RemoteService(version = "2.0")
private UserService userService;
```
如何处理超时?
在 `@RemoteService` 注解中配置超时时间:
```java
@RemoteService(
version = "1.0",
time = 5000, // 5秒超时
timeUnit = TimeUnit.MILLISECONDS
)
private UserService userService;
```
生产环境建议
- ✅ 使用 Kryo 序列化提升性能
- ✅ 配置合理的超时时间(建议 3-5 秒)
- ✅ 对于幂等操作使用 FailOver 容错策略
- ✅ 部署独立的 Zookeeper 集群(至少 3 节点)
- ✅ 启用服务端和客户端过滤器进行日志记录
- ✅ 监控 Netty 线程池和连接数
## 📝 版本历史
### v0.0.1-SNAPSHOT (当前版本)
- ✅ 基于 Netty 的网络通信
- ✅ 基于 Zookeeper 的服务注册与发现
- ✅ 支持多种序列化方式(Kryo、Hessian、FastJson)
- ✅ 支持负载均衡(轮询、随机)
- ✅ 支持容错机制(FailOver、FailFast)
- ✅ 基于 SPI 的扩展机制
- ✅ 过滤器链支持
## 🤝 贡献指南
欢迎贡献代码、提出问题和建议!
1. Fork 本仓库
2. 创建你的特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交你的改动 (`git commit -m '添加某个很棒的特性'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 开启一个 Pull Request
### 代码规范
- 遵循阿里巴巴 Java 开发手册
- 使用 4 个空格缩进
- 添加必要的注释和文档
- 确保所有测试通过
## 📄 开源协议
本项目采用 [Apache License 2.0](LICENSE) 开源协议。
## 🙏 致谢
感谢以下优秀的开源项目:
- [Dubbo](https://dubbo.apache.org/) - 提供了优秀的 RPC 框架设计思路
- [Spring Boot](https://spring.io/projects/spring-boot) - 简化了应用开发
- [Netty](https://netty.io/) - 提供了高性能的网络通信框架
- [Apache Zookeeper](https://zookeeper.apache.org/) - 提供了可靠的服务注册中心
---
⭐ 如果这个项目对你有帮助,请给个 Star ⭐
注意:本项目主要用于学习交流,生产环境使用请谨慎评估