# 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 框架

[![Java](https://img.shields.io/badge/Java-8+-orange.svg)](https://www.oracle.com/java/) [![Spring Boot](https://img.shields.io/badge/Spring%20Boot-2.7.5-brightgreen.svg)](https://spring.io/projects/spring-boot) [![Netty](https://img.shields.io/badge/Netty-4.1.108-blue.svg)](https://netty.io/) [![License](https://img.shields.io/badge/license-Apache%202.0-blue.svg)](LICENSE) [![Maven](https://img.shields.io/badge/Maven-3.x-red.svg)](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 ⭐

注意:本项目主要用于学习交流,生产环境使用请谨慎评估