Skip to content

概念卡片:Dubbo SPI扩展机制

一句话机制:Dubbo 是「微内核 + SPI 扩展」设计——内核只负责把「接口 → 实现类」的映射做成可插拔,协议、集群、路由、序列化全是扩展点;它把 Java SPI 增强为按 key 延迟加载 + IOC/AOP + 自适应扩展,让二次开发不改源码、零侵入。

SPI 是什么

SPI(Service Provider Interface)是一种服务发现机制:把接口实现类的全限定名写进配置文件,加载时读配置、动态为接口替换实现类。Dubbo 的协议、集群、路由、序列化等全部通过 SPI 实现可插拔。

三类配置文件目录

目录用途
META-INF/services/兼容 Java SPI 的配置
META-INF/dubbo/用户自定义 SPI 配置(key=com.xxx.xxx
META-INF/dubbo/internal/Dubbo 内部 SPI 配置

通过 ExtensionLoader.getExtensionLoader(Xxx.class).getExtension("key") 按 key 加载指定实现。

Java SPI vs Dubbo SPI

维度Java SPIDubbo SPI
加载方式一次性全量实例化所有实现延迟加载,按 key 只加载需要的
扩展成本需改源码/全量加载不改源码,classpath 加文件即可
依赖注入IOC:扩展点可用 setter 注入其他扩展点
增强能力AOP:扩展点可被包装/代理增强
自适应自适应扩展(Adaptive):调用时按 URL 参数动态决定实现类
容器集成兼容第三方 IoC 容器(默认支持 Spring Bean)

自适应扩展(Adaptive)

ExtensionLoader 生成动态代理类(createAdaptiveExtensionClassCode),调用时从 URL 参数取值作为 key 决定实际实现类——这就是"运行时按配置自动选实现"的底层机制。代价:动态代理让调试变难,需分析出实际调用的实现类。

分层架构(微内核的骨架)

大三层:Business(业务,自写接口实现)→ RPC(调用核心:负载均衡/集群容错/代理)→ Remoting(网络传输与数据转换);Service/Config 属 API 层(给使用者),其余层属 SPI 层(给扩展者做二次开发)。

细分 10 层:Service → Config → Proxy → Registry → Cluster → Monitor → Protocol → Exchange → Transport → Serialize(由上至下依赖)。

设计模式在 Dubbo 中的运用

模式位置
责任链Filter 链(ProtocolFilterWrapper 串起所有 Filter),Dubbo 骨架——监控/日志/缓存/安全都是 Filter
装饰器ProtocolFilterWrapper 修饰 Protocol;ListenerInvokerWrapper/InvokerWrapper 等
观察者Registry 订阅:Consumer subscribe 注册观察者,地址变化经 NotifyListener 通知
代理ProxyFactory 生成本地代理,屏蔽网络细节(JDK Proxy / Javassist)
工厂方法CacheFactory(AbstractCacheFactory 抽象 + 子类 createCache)
抽象工厂ProxyFactory(生产 Proxy 与 Invoker)
适配器日志组件适配(jcl/jdk/log4j/slf4j)

不变量(必须成立的约束)

  • 一切皆扩展点:协议/集群/路由/序列化/负载均衡/Filter 都可 SPI 替换,内核不写死。
  • 延迟加载:只实例化被使用的扩展,避免 Java SPI 全量加载的资源浪费。
  • Adaptive 实现由动态代理生成,具体调哪个实现在运行时由 URL 参数决定。

常见误解

  • 以为 Dubbo SPI 就是 Java SPI → Dubbo 是对 Java SPI 的增强(延迟加载 + IOC/AOP + 自适应),不是原样使用。
  • 以为扩展 Dubbo 要改源码 → 在 classpath 加 META-INF/dubbo/ 配置文件 + 实现类即可,代码零侵入。
  • 以为 Filter 只是过滤 → Filter 是责任链,承载监控、日志、缓存、限流、安全等横切能力。

关联

最近更新