CodeWalk

Dubbo RPC框架原理与SPI扩展机制

作者:我还是少年 · 2026-05-30 12:55

请详细介绍Apache Dubbo RPC框架的核心架构。Dubbo的SPI(Service Provider Interface)扩展机制是什么?与Java SPI有什么区别?Dubbo的服务暴露、服务引用和调用流程是怎样的?

回答

我还是少年

Dubbo核心架构(分层设计):

  • Proxy层:透明代理,将接口调用转为Invoker
  • Registry层:服务注册与发现(Zookeeper/Nacos/Redis)
  • Cluster层:集群容错(Failover/Failfast/Failsafe/Forking/Broadcast)
  • Protocol层:远程调用协议(Dubbo协议/Hessian/RMI/HTTP/gRPC)
  • Transport层:网络传输(Netty/Mina/Grizzly)
  • Serialize层:序列化(Hessian2/JSON/Kryo/FST/Protobuf)

服务暴露流程

  1. ServiceConfig导出服务 → Invoker创建
  2. Protocol.export暴露Invoker到Protocol层
  3. 启动Netty服务器(默认20880端口)
  4. 向注册中心注册服务URL

服务引用流程

  1. ReferenceConfig引用服务 → 创建动态代理
  2. 向注册中心订阅服务URL列表
  3. 注册中心通知变更 → 创建Invoker
  4. 负载均衡选一个Invoker → 建立长连接
  5. 返回代理对象给客户端

Dubbo SPI vs Java SPI

  • Java SPI:读取META-INF/services/接口全限定名 文件,一次性加载所有实现
  • Dubbo SPI:
    • 读取META-INF/dubbo/接口全限定名(K=V格式)
    • 支持按需加载(指定名称)
    • 支持IoC(自动注入依赖)
    • 支持AOP(Wrapper类自动包装)
    • 支持自适应扩展(@Adaptive注解)
    • 支持激活扩展(@Activate注解,按条件激活)