Dubbo RPC框架原理与SPI扩展机制
请详细介绍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)
服务暴露流程:
- ServiceConfig导出服务 → Invoker创建
- Protocol.export暴露Invoker到Protocol层
- 启动Netty服务器(默认20880端口)
- 向注册中心注册服务URL
服务引用流程:
- ReferenceConfig引用服务 → 创建动态代理
- 向注册中心订阅服务URL列表
- 注册中心通知变更 → 创建Invoker
- 负载均衡选一个Invoker → 建立长连接
- 返回代理对象给客户端
Dubbo SPI vs Java SPI:
- Java SPI:读取META-INF/services/接口全限定名 文件,一次性加载所有实现
- Dubbo SPI:
- 读取META-INF/dubbo/接口全限定名(K=V格式)
- 支持按需加载(指定名称)
- 支持IoC(自动注入依赖)
- 支持AOP(Wrapper类自动包装)
- 支持自适应扩展(@Adaptive注解)
- 支持激活扩展(@Activate注解,按条件激活)