可扩展性是任何一个系统所追求的,对于 Dubbo 来说是同样适用。
可扩展性是一种设计理念,代表了我们对未来的一种预想,我们希望在现有的架构或设计基础上,当未来某些方面发生变化的时候,我们能够以最小的改动来适应这种变化。
可扩展性的优点主要表现模块之间解耦,它符合开闭原则,对扩展开放,对修改关闭。当系统增加新功能时,不需要对现有系统的结构和代码进行修改,仅仅新增一个扩展即可。
一般来说,系统会采用 Factory、IoC、OSGI 等方式管理扩展(插件)生命周期。考虑到 Dubbo 的适用面,不想强依赖 Spring 等 IoC 容器。
而自己造一个小的 IoC 容器,也觉得有点过度设计,所以选择最简单的 Factory 方式管理扩展(插件)。在 Dubbo 中,所有内部实现和第三方实现都是平等的。
Dubbo 中的扩展能力是从 JDK 标准的 SPI 扩展点发现机制加强而来,它改进了 JDK 标准的 SPI 以下问题:
用户能够基于 Dubbo 提供的扩展能力,很方便基于自身需求扩展其他协议、过滤器、路由等。下面介绍下 Dubbo 扩展能力的特性。
从 Dubbo 扩展的设计目标可以看出,Dubbo 实现的一些例如动态选择扩展实现、IOC、AOP 等特性,能够为用户提供非常灵活的扩展能力。
Dubbo 加载扩展的整个流程如下:
主要步骤为 4 个:
下面以扩展协议为例进行说明如何利用 Dubbo 提供的扩展能力扩展 Triple 协议。
(1) 在协议的实现 jar 包内放置文本文件:META-INF/dubbo/org.apache.dubbo.remoting.api.WireProtocol
tri=org.apache.dubbo.rpc.protocol.tri.TripleHttp2Protocol
(2) 实现类内容
@Activate public class TripleHttp2Protocol extends Http2WireProtocol { // ... }
说明下:Http2WireProtocol 实现了 WireProtocol 接口
(3) Dubbo 配置模块中,扩展点均有对应配置属性或标签,通过配置指定使用哪个扩展实现。比如:
<dubbo:protocol name="tri" />
从上面的扩展步骤可以看出,用户基本在黑盒下就完成了扩展。
Dubbo 的扩展能力非常灵活,在自身功能的实现上无处不在。
Dubbo 扩展能力使得 Dubbo 项目很方便的切分成一个一个的子模块,实现热插拔特性。用户完全可以基于自身需求,替换 Dubbo 原生实现,来满足自身业务需求。
Dubbo 扩展平等的对待内部实现和第三方实现。更多使用场景,参见 SPI 扩展实现
欢迎在 https://github.com/apache/dubbo 给 Dubbo Star。