Skip to content

Winniekun/mini-dubbo

Repository files navigation

从零实现 Dubbo RPC 框架

项目简介

本项目旨在从零开始实现一个简化版的 Dubbo RPC 框架,帮助深入理解 RPC 框架的核心原理和设计思想。

核心功能模块

1. 基础模块 (Foundation)

  • 配置管理 (Config): 服务配置、应用配置、注册中心配置等
  • SPI 扩展机制 (SPI): 类似 Java SPI,支持扩展点加载
  • 公共工具类 (Common): 字符串处理、反射工具、网络工具等

2. 序列化模块 (Serialize)

  • 序列化接口定义: 统一的序列化/反序列化接口
  • 多种序列化实现:
    • Hessian2 序列化
    • JSON 序列化(Fastjson/Jackson)
    • Protobuf 序列化
    • Java 原生序列化

3. 网络通信模块 (Remoting)

  • 传输层抽象: 统一的网络传输接口
  • 基于 Netty 的实现:
    • Client 端实现
    • Server 端实现
    • 编解码器 (Codec)
    • 心跳机制
    • 连接池管理

4. 协议模块 (Protocol)

  • 协议抽象: 定义统一的协议接口
  • Dubbo 协议实现:
    • 协议头设计(魔数、版本、消息类型等)
    • 请求/响应模型
    • 协议编解码
  • HTTP 协议支持 (可选)

5. 注册中心模块 (Registry)

  • 注册中心抽象: 统一的注册中心接口
  • 多种实现:
    • Zookeeper 注册中心
    • Redis 注册中心
    • Nacos 注册中心
    • 内存注册中心(用于测试)
  • 服务注册与发现
  • 服务订阅与通知

6. 集群容错模块 (Cluster)

  • 负载均衡 (LoadBalance):
    • 随机负载均衡
    • 轮询负载均衡
    • 最少活跃调用
    • 一致性哈希
  • 容错策略 (Fault Tolerance):
    • Failover (失败重试)
    • Failfast (快速失败)
    • Failsafe (失败安全)
    • Failback (失败恢复)
    • Forking (并行调用)
    • Broadcast (广播调用)
  • 路由规则 (Router):
    • 条件路由
    • 标签路由
    • 脚本路由

7. 代理模块 (Proxy)

  • 代理工厂: 创建服务代理
  • JDK 动态代理实现
  • Javassist 字节码生成 (可选)
  • CGLIB 代理 (可选)

8. 服务暴露与引用 (Export & Reference)

  • 服务暴露 (Export):
    • 本地暴露
    • 远程暴露
    • 注册到注册中心
  • 服务引用 (Reference):
    • 从注册中心订阅服务
    • 创建服务代理
    • 建立网络连接

9. 过滤器链模块 (Filter)

  • 过滤器接口定义
  • 内置过滤器:
    • 超时控制过滤器
    • 监控统计过滤器
    • 异常处理过滤器
    • 日志过滤器
    • 限流过滤器

10. 监控与治理 (Monitor & Governance)

  • 调用统计: QPS、RT、成功率等
  • 链路追踪: 调用链路记录
  • 服务降级: 熔断机制
  • 限流控制: 令牌桶、漏桶算法

学习路径

阶段一:基础准备 (第 1-2 周)

目标: 理解 RPC 基本原理,搭建项目骨架

学习内容

  1. RPC 基础概念

    • 什么是 RPC
    • RPC 调用流程
    • 序列化与反序列化
    • 网络通信基础
  2. 技术选型

    • Java 8+ (使用最新的 LTS 版本)
    • Netty 4.x (网络通信)
    • Zookeeper/Nacos (注册中心)
    • Maven/Gradle (构建工具)
  3. 项目结构搭建

    • 多模块 Maven 项目
    • 模块划分
    • 依赖管理

实践任务

  • 创建多模块 Maven 项目
  • 定义核心接口和数据模型
  • 实现简单的 Java 序列化

学习产出: 完成项目骨架和基础工具类


阶段二:实现简单 RPC (第 3-4 周)

目标: 实现一个最小可用的点对点 RPC 调用

学习内容

  1. 网络通信

    • Socket 编程基础
    • Netty 入门
    • 编解码器实现
  2. 动态代理

    • JDK 动态代理原理
    • InvocationHandler 使用
  3. 协议设计

    • 自定义协议格式
    • 协议编解码

实践任务

  • 实现基于 Socket 的简单 RPC (可选,作为过渡)
  • 使用 Netty 实现 Client 和 Server
  • 设计并实现简单的 Dubbo 协议
  • 实现 JDK 动态代理
  • 完成点对点 RPC 调用

学习产出: 能够实现简单的 RPC 调用(Provider 和 Consumer 硬编码)


阶段三:服务注册与发现 (第 5-6 周)

目标: 引入注册中心,实现服务的自动发现

学习内容

  1. 注册中心原理

    • 服务注册与发现机制
    • 服务订阅与通知
    • 临时节点与持久节点
  2. Zookeeper 基础

    • Zookeeper 安装与配置
    • Zookeeper API 使用
    • 监听机制 (Watcher)
  3. 设计模式

    • 观察者模式
    • 工厂模式
    • 模板方法模式

实践任务

  • 定义注册中心接口
  • 实现 Zookeeper 注册中心
  • 实现内存注册中心(用于测试)
  • 服务提供者启动时注册服务
  • 服务消费者启动时订阅服务
  • 实现服务变更通知机制

学习产出: 支持服务自动注册与发现,Provider 和 Consumer 无需硬编码地址


阶段四:集群与负载均衡 (第 7-8 周)

目标: 支持服务集群部署和负载均衡

学习内容

  1. 负载均衡算法

    • 随机算法
    • 轮询算法
    • 加权轮询
    • 最少活跃调用
    • 一致性哈希
  2. 集群容错策略

    • 失败重试
    • 快速失败
    • 失败安全

实践任务

  • 定义 LoadBalance 接口
  • 实现随机负载均衡
  • 实现轮询负载均衡
  • 实现加权负载均衡
  • 实现一致性哈希负载均衡
  • 实现 Failover 容错策略
  • 实现 Failfast 容错策略
  • 测试多 Provider 场景

学习产出: 支持多个 Provider,Consumer 能够根据负载均衡策略选择调用


阶段五:过滤器与扩展机制 (第 9-10 周)

目标: 实现 SPI 扩展机制和过滤器链

学习内容

  1. SPI 机制

    • Java SPI 原理
    • Dubbo SPI 设计
    • 扩展点加载机制
  2. 责任链模式

    • 过滤器链设计
    • 拦截器模式

实践任务

  • 实现自定义 SPI 机制
  • 定义 Filter 接口
  • 实现过滤器链调用
  • 实现常用过滤器:
    • 超时控制
    • 异常处理
    • 日志记录
    • 监控统计
  • 支持通过 SPI 扩展各种组件

学习产出: 完善的扩展机制,支持用户自定义扩展


阶段六:高级特性 (第 11-12 周)

目标: 实现服务治理相关特性

学习内容

  1. 服务治理

    • 服务降级
    • 熔断机制
    • 限流算法(令牌桶、漏桶)
  2. 监控与追踪

    • 调用统计
    • 链路追踪
    • 性能监控
  3. 路由规则

    • 条件路由
    • 标签路由

实践任务

  • 实现超时机制
  • 实现异步调用
  • 实现服务降级
  • 实现简单的熔断器
  • 实现限流过滤器
  • 实现调用统计
  • 实现条件路由
  • 实现标签路由

学习产出: 具备基本的服务治理能力


阶段七:优化与完善 (第 13-14 周)

目标: 性能优化和功能完善

学习内容

  1. 性能优化

    • 连接池优化
    • 序列化优化
    • 线程模型优化
  2. 测试与文档

    • 单元测试
    • 集成测试
    • 压力测试

实践任务

  • 实现连接池管理
  • 实现心跳机制
  • 优化序列化性能
  • 编写单元测试
  • 编写集成测试
  • 性能压测与优化
  • 完善文档

学习产出: 性能优化的完整 RPC 框架


阶段八:扩展与实战 (第 15-16 周)

目标: 支持更多特性,实战应用

学习内容

  1. 多协议支持

    • HTTP 协议
    • gRPC 协议(可选)
  2. 多序列化支持

    • Hessian2
    • Protobuf
    • Kryo
  3. 实战项目

    • 构建微服务应用
    • 服务拆分
    • 服务部署

实践任务

  • 实现 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

关键设计模式

  1. 工厂模式: ProxyFactory、ProtocolFactory
  2. 代理模式: 服务代理生成
  3. 责任链模式: Filter 过滤器链
  4. 观察者模式: 服务变更通知
  5. 模板方法模式: AbstractRegistry
  6. 策略模式: LoadBalance、Serialization
  7. 装饰器模式: Protocol 包装
  8. 单例模式: ExtensionLoader

核心流程

服务暴露流程

  1. 加载服务配置 (ServiceConfig)
  2. 创建服务实现实例
  3. 启动 Netty Server,监听端口
  4. 向注册中心注册服务信息
  5. 等待消费者调用

服务引用流程

  1. 加载引用配置 (ReferenceConfig)
  2. 从注册中心订阅服务
  3. 创建服务代理对象
  4. 建立与 Provider 的网络连接
  5. 返回代理对象给用户

服务调用流程

  1. Consumer 调用代理对象的方法
  2. 经过 Filter 链处理
  3. 负载均衡选择一个 Provider
  4. 序列化请求参数
  5. 通过网络发送请求
  6. Provider 接收请求
  7. 反序列化参数
  8. 经过 Filter 链处理
  9. 反射调用真实服务
  10. 序列化返回结果
  11. 通过网络返回响应
  12. Consumer 反序列化结果
  13. 返回给调用方

学习建议

  1. 循序渐进: 按照学习路径一步步实现,不要跳过基础阶段
  2. 理解原理: 不仅要会用,更要理解为什么这样设计
  3. 参考源码: 遇到问题可以参考 Apache Dubbo 源码
  4. 动手实践: 每个阶段都要有代码产出,不要只看不练
  5. 编写测试: 为每个模块编写测试用例,保证代码质量
  6. 写文档: 记录设计思路和实现细节,帮助理解和回顾
  7. 性能优化: 后期要关注性能,学习优化技巧

参考资料

官方文档

推荐书籍

  • 《深入理解Apache Dubbo与实战》
  • 《Netty权威指南》
  • 《从Paxos到Zookeeper:分布式一致性原理与实践》

开源项目

预期收获

通过完成这个项目,你将:

  1. 深入理解 RPC 原理: 从底层网络通信到上层服务治理
  2. 掌握分布式系统核心概念: 服务注册发现、负载均衡、容错等
  3. 提升 Java 编程能力: 反射、动态代理、并发编程、网络编程
  4. 学会设计模式应用: 在实际项目中灵活运用各种设计模式
  5. 具备架构设计能力: 模块划分、接口设计、扩展性设计
  6. 积累实战经验: 完整的项目开发经验,面试加分项

下一步行动

  1. 阅读本 README,理解整体架构
  2. 查看 docs/01-getting-started.md,开始第一阶段学习
  3. 创建项目骨架,搭建多模块 Maven 项目
  4. 完成基础工具类和接口定义

祝学习顺利!🚀

About

learn dubbo

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages