本项目旨在从零开始实现一个简化版的 Dubbo RPC 框架,帮助深入理解 RPC 框架的核心原理和设计思想。
- 配置管理 (Config): 服务配置、应用配置、注册中心配置等
- SPI 扩展机制 (SPI): 类似 Java SPI,支持扩展点加载
- 公共工具类 (Common): 字符串处理、反射工具、网络工具等
- 序列化接口定义: 统一的序列化/反序列化接口
- 多种序列化实现:
- Hessian2 序列化
- JSON 序列化(Fastjson/Jackson)
- Protobuf 序列化
- Java 原生序列化
- 传输层抽象: 统一的网络传输接口
- 基于 Netty 的实现:
- Client 端实现
- Server 端实现
- 编解码器 (Codec)
- 心跳机制
- 连接池管理
- 协议抽象: 定义统一的协议接口
- Dubbo 协议实现:
- 协议头设计(魔数、版本、消息类型等)
- 请求/响应模型
- 协议编解码
- HTTP 协议支持 (可选)
- 注册中心抽象: 统一的注册中心接口
- 多种实现:
- Zookeeper 注册中心
- Redis 注册中心
- Nacos 注册中心
- 内存注册中心(用于测试)
- 服务注册与发现
- 服务订阅与通知
- 负载均衡 (LoadBalance):
- 随机负载均衡
- 轮询负载均衡
- 最少活跃调用
- 一致性哈希
- 容错策略 (Fault Tolerance):
- Failover (失败重试)
- Failfast (快速失败)
- Failsafe (失败安全)
- Failback (失败恢复)
- Forking (并行调用)
- Broadcast (广播调用)
- 路由规则 (Router):
- 条件路由
- 标签路由
- 脚本路由
- 代理工厂: 创建服务代理
- JDK 动态代理实现
- Javassist 字节码生成 (可选)
- CGLIB 代理 (可选)
- 服务暴露 (Export):
- 本地暴露
- 远程暴露
- 注册到注册中心
- 服务引用 (Reference):
- 从注册中心订阅服务
- 创建服务代理
- 建立网络连接
- 过滤器接口定义
- 内置过滤器:
- 超时控制过滤器
- 监控统计过滤器
- 异常处理过滤器
- 日志过滤器
- 限流过滤器
- 调用统计: QPS、RT、成功率等
- 链路追踪: 调用链路记录
- 服务降级: 熔断机制
- 限流控制: 令牌桶、漏桶算法
目标: 理解 RPC 基本原理,搭建项目骨架
-
RPC 基础概念
- 什么是 RPC
- RPC 调用流程
- 序列化与反序列化
- 网络通信基础
-
技术选型
- Java 8+ (使用最新的 LTS 版本)
- Netty 4.x (网络通信)
- Zookeeper/Nacos (注册中心)
- Maven/Gradle (构建工具)
-
项目结构搭建
- 多模块 Maven 项目
- 模块划分
- 依赖管理
- 创建多模块 Maven 项目
- 定义核心接口和数据模型
- 实现简单的 Java 序列化
学习产出: 完成项目骨架和基础工具类
目标: 实现一个最小可用的点对点 RPC 调用
-
网络通信
- Socket 编程基础
- Netty 入门
- 编解码器实现
-
动态代理
- JDK 动态代理原理
- InvocationHandler 使用
-
协议设计
- 自定义协议格式
- 协议编解码
- 实现基于 Socket 的简单 RPC (可选,作为过渡)
- 使用 Netty 实现 Client 和 Server
- 设计并实现简单的 Dubbo 协议
- 实现 JDK 动态代理
- 完成点对点 RPC 调用
学习产出: 能够实现简单的 RPC 调用(Provider 和 Consumer 硬编码)
目标: 引入注册中心,实现服务的自动发现
-
注册中心原理
- 服务注册与发现机制
- 服务订阅与通知
- 临时节点与持久节点
-
Zookeeper 基础
- Zookeeper 安装与配置
- Zookeeper API 使用
- 监听机制 (Watcher)
-
设计模式
- 观察者模式
- 工厂模式
- 模板方法模式
- 定义注册中心接口
- 实现 Zookeeper 注册中心
- 实现内存注册中心(用于测试)
- 服务提供者启动时注册服务
- 服务消费者启动时订阅服务
- 实现服务变更通知机制
学习产出: 支持服务自动注册与发现,Provider 和 Consumer 无需硬编码地址
目标: 支持服务集群部署和负载均衡
-
负载均衡算法
- 随机算法
- 轮询算法
- 加权轮询
- 最少活跃调用
- 一致性哈希
-
集群容错策略
- 失败重试
- 快速失败
- 失败安全
- 定义 LoadBalance 接口
- 实现随机负载均衡
- 实现轮询负载均衡
- 实现加权负载均衡
- 实现一致性哈希负载均衡
- 实现 Failover 容错策略
- 实现 Failfast 容错策略
- 测试多 Provider 场景
学习产出: 支持多个 Provider,Consumer 能够根据负载均衡策略选择调用
目标: 实现 SPI 扩展机制和过滤器链
-
SPI 机制
- Java SPI 原理
- Dubbo SPI 设计
- 扩展点加载机制
-
责任链模式
- 过滤器链设计
- 拦截器模式
- 实现自定义 SPI 机制
- 定义 Filter 接口
- 实现过滤器链调用
- 实现常用过滤器:
- 超时控制
- 异常处理
- 日志记录
- 监控统计
- 支持通过 SPI 扩展各种组件
学习产出: 完善的扩展机制,支持用户自定义扩展
目标: 实现服务治理相关特性
-
服务治理
- 服务降级
- 熔断机制
- 限流算法(令牌桶、漏桶)
-
监控与追踪
- 调用统计
- 链路追踪
- 性能监控
-
路由规则
- 条件路由
- 标签路由
- 实现超时机制
- 实现异步调用
- 实现服务降级
- 实现简单的熔断器
- 实现限流过滤器
- 实现调用统计
- 实现条件路由
- 实现标签路由
学习产出: 具备基本的服务治理能力
目标: 性能优化和功能完善
-
性能优化
- 连接池优化
- 序列化优化
- 线程模型优化
-
测试与文档
- 单元测试
- 集成测试
- 压力测试
- 实现连接池管理
- 实现心跳机制
- 优化序列化性能
- 编写单元测试
- 编写集成测试
- 性能压测与优化
- 完善文档
学习产出: 性能优化的完整 RPC 框架
目标: 支持更多特性,实战应用
-
多协议支持
- HTTP 协议
- gRPC 协议(可选)
-
多序列化支持
- Hessian2
- Protobuf
- Kryo
-
实战项目
- 构建微服务应用
- 服务拆分
- 服务部署
- 实现 Hessian2 序列化
- 实现 HTTP 协议支持
- 实现泛化调用
- 实现参数回调
- 构建一个完整的微服务示例项目
- 部署到生产环境
学习产出: 功能完善的 RPC 框架 + 实战项目经验
- Java 8+: Lambda、Stream API、CompletableFuture
- Netty 4.x: 网络通信框架
- Zookeeper: 服务注册中心
- Maven/Gradle: 项目构建
- Spring Boot: 简化配置和集成
- Nacos: 替代 Zookeeper 作为注册中心
- Curator: Zookeeper 客户端封装
- Javassist/CGLIB: 字节码生成
- Hessian2/Protobuf/Kryo: 序列化框架
- Micrometer: 监控指标
- SLF4J + Logback: 日志框架
dubbo/
├── dubbo-common/ # 公共模块
│ ├── src/main/java/
│ │ └── com/study/dubbo/common/
│ │ ├── constants/ # 常量定义
│ │ ├── exception/ # 异常定义
│ │ ├── utils/ # 工具类
│ │ └── extension/ # SPI 扩展
│ └── pom.xml
│
├── dubbo-serialize/ # 序列化模块
│ ├── dubbo-serialize-api/ # 序列化接口
│ ├── dubbo-serialize-java/ # Java 序列化
│ ├── dubbo-serialize-json/ # JSON 序列化
│ └── dubbo-serialize-hessian/ # Hessian 序列化
│
├── dubbo-remoting/ # 网络通信模块
│ ├── dubbo-remoting-api/ # 通信接口
│ └── dubbo-remoting-netty/ # Netty 实现
│
├── dubbo-protocol/ # 协议模块
│ ├── dubbo-protocol-api/ # 协议接口
│ └── dubbo-protocol-dubbo/ # Dubbo 协议
│
├── dubbo-registry/ # 注册中心模块
│ ├── dubbo-registry-api/ # 注册中心接口
│ ├── dubbo-registry-zookeeper/ # Zookeeper 实现
│ └── dubbo-registry-memory/ # 内存实现
│
├── dubbo-cluster/ # 集群模块
│ ├── loadbalance/ # 负载均衡
│ ├── fault/ # 容错策略
│ └── router/ # 路由规则
│
├── dubbo-proxy/ # 代理模块
│ └── src/main/java/
│ └── com/study/dubbo/proxy/
│ ├── ProxyFactory.java
│ └── jdk/ # JDK 代理实现
│
├── dubbo-rpc/ # RPC 核心模块
│ ├── export/ # 服务暴露
│ ├── reference/ # 服务引用
│ └── filter/ # 过滤器
│
├── dubbo-config/ # 配置模块
│ └── src/main/java/
│ └── com/study/dubbo/config/
│ ├── ServiceConfig.java # 服务配置
│ ├── ReferenceConfig.java # 引用配置
│ └── RegistryConfig.java # 注册中心配置
│
├── dubbo-monitor/ # 监控模块
│ ├── statistics/ # 统计
│ └── trace/ # 链路追踪
│
├── dubbo-spring-boot-starter/ # Spring Boot 集成
│ └── src/main/java/
│ └── com/study/dubbo/spring/
│
├── dubbo-examples/ # 示例项目
│ ├── example-api/ # 接口定义
│ ├── example-provider/ # 服务提供者
│ └── example-consumer/ # 服务消费者
│
├── docs/ # 文档
│ ├── design/ # 设计文档
│ ├── api/ # API 文档
│ └── tutorial/ # 教程
│
├── pom.xml # 父 POM
└── README.md
- 工厂模式: ProxyFactory、ProtocolFactory
- 代理模式: 服务代理生成
- 责任链模式: Filter 过滤器链
- 观察者模式: 服务变更通知
- 模板方法模式: AbstractRegistry
- 策略模式: LoadBalance、Serialization
- 装饰器模式: Protocol 包装
- 单例模式: ExtensionLoader
- 加载服务配置 (ServiceConfig)
- 创建服务实现实例
- 启动 Netty Server,监听端口
- 向注册中心注册服务信息
- 等待消费者调用
- 加载引用配置 (ReferenceConfig)
- 从注册中心订阅服务
- 创建服务代理对象
- 建立与 Provider 的网络连接
- 返回代理对象给用户
- Consumer 调用代理对象的方法
- 经过 Filter 链处理
- 负载均衡选择一个 Provider
- 序列化请求参数
- 通过网络发送请求
- Provider 接收请求
- 反序列化参数
- 经过 Filter 链处理
- 反射调用真实服务
- 序列化返回结果
- 通过网络返回响应
- Consumer 反序列化结果
- 返回给调用方
- 循序渐进: 按照学习路径一步步实现,不要跳过基础阶段
- 理解原理: 不仅要会用,更要理解为什么这样设计
- 参考源码: 遇到问题可以参考 Apache Dubbo 源码
- 动手实践: 每个阶段都要有代码产出,不要只看不练
- 编写测试: 为每个模块编写测试用例,保证代码质量
- 写文档: 记录设计思路和实现细节,帮助理解和回顾
- 性能优化: 后期要关注性能,学习优化技巧
- 《深入理解Apache Dubbo与实战》
- 《Netty权威指南》
- 《从Paxos到Zookeeper:分布式一致性原理与实践》
通过完成这个项目,你将:
- 深入理解 RPC 原理: 从底层网络通信到上层服务治理
- 掌握分布式系统核心概念: 服务注册发现、负载均衡、容错等
- 提升 Java 编程能力: 反射、动态代理、并发编程、网络编程
- 学会设计模式应用: 在实际项目中灵活运用各种设计模式
- 具备架构设计能力: 模块划分、接口设计、扩展性设计
- 积累实战经验: 完整的项目开发经验,面试加分项
- 阅读本 README,理解整体架构
- 查看
docs/01-getting-started.md,开始第一阶段学习 - 创建项目骨架,搭建多模块 Maven 项目
- 完成基础工具类和接口定义
祝学习顺利!🚀