乐趣区

关于后端:Dubbo-可扩展性设计

扩大设计理念

可扩展性是任何一个零碎所谋求的,对于 Dubbo 来说是同样实用。

什么是可扩展性

可扩展性是一种设计理念,代表了咱们对将来的一种料想,咱们心愿在现有的架构或设计根底上,当将来某些方面发生变化的时候,咱们可能以最小的改变来适应这种变动。

可扩展性的长处

可扩展性的长处次要体现模块之间解耦,它合乎开闭准则,对扩大凋谢,对批改敞开。当零碎减少新性能时,不须要对现有零碎的构造和代码进行批改,仅仅新增一个扩大即可。

扩大实现形式

一般来说,零碎会采纳 Factory、IoC、OSGI 等形式治理扩大 (插件) 生命周期。思考到 Dubbo 的实用面,不想强依赖 Spring 等 IoC 容器。
而本人造一个小的 IoC 容器,也感觉有点适度设计,所以抉择最简略的 Factory 形式治理扩大(插件)。在 Dubbo 中,所有外部实现和第三方实现都是平等的。

Dubbo 中的可扩展性

  • 平等看待第三方的实现。在 Dubbo 中,所有外部实现和第三方实现都是平等的,用户能够基于本身业务需要,替换 Dubbo 提供的原生实现。
  • 每个扩大点只封装一个变动因子,最大化复用。每个扩大点的实现者,往往都只是关怀一件事。如果用户有需要须要进行扩大,那么只须要对其关注的扩大点进行扩大就好,极大的缩小用户的工作量。

Dubbo 扩大的个性

Dubbo 中的扩大能力是从 JDK 规范的 SPI 扩大点发现机制增强而来,它改良了 JDK 规范的 SPI 以下问题:

  • JDK 规范的 SPI 会一次性实例化扩大点所有实现,如果有扩大实现初始化很耗时,但如果没用上也加载,会很浪费资源。
  • 如果扩大点加载失败,连扩大点的名称都拿不到了。比方:JDK 规范的 ScriptEngine,通过 getName() 获取脚本类型的名称,但如果 RubyScriptEngine 因为所依赖的 jruby.jar 不存在,导致 RubyScriptEngine 类加载失败,这个失败起因被吃掉了,和 ruby 对应不起来,当用户执行 ruby 脚本时,会报不反对 ruby,而不是真正失败的起因。

用户可能基于 Dubbo 提供的扩大能力,很不便基于本身需要扩大其余协定、过滤器、路由等。上面介绍下 Dubbo 扩大能力的个性。

  • 按需加载。Dubbo 的扩大能力不会一次性实例化所有实现,而是用哪个扩大类则实例化哪个扩大类,缩小资源节约。
  • 减少扩大类的 IOC 能力。Dubbo 的扩大能力并不仅仅只是发现扩大服务实现类,而是在此基础上更进一步,如果该扩大类的属性依赖其余对象,则 Dubbo 会主动的实现该依赖对象的注入性能。
  • 减少扩大类的 AOP 能力。Dubbo 扩大能力会主动的发现扩大类的包装类,实现包装类的结构,加强扩大类的性能。
  • 具备动静抉择扩大实现的能力。Dubbo 扩大会基于参数,在运行时动静抉择对应的扩大类,进步了 Dubbo 的扩大能力。
  • 能够对扩大实现进行排序。可能基于用户需要,指定扩大实现的执行程序。
  • 提供扩大点的 Adaptive 能力。该能力能够使的一些扩大类在 consumer 端失效,一些扩大类在 provider 端失效。

从 Dubbo 扩大的设计指标能够看出,Dubbo 实现的一些例如动静抉择扩大实现、IOC、AOP 等个性,可能为用户提供非常灵活的扩大能力。

Dubbo 扩大加载流程

Dubbo 加载扩大的整个流程如下:

次要步骤为 4 个:

  • 读取并解析配置文件
  • 缓存所有扩大实现
  • 基于用户执行的扩展名,实例化对应的扩大实现
  • 进行扩大实例属性的 IOC 注入以及实例化扩大的包装类,实现 AOP 个性

如何应用 Dubbo 扩大能力进行扩大

上面以扩大协定为例进行阐明如何利用 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 原生实现,来满足本身业务需要。

应用场景

  • 如果你须要自定义负载平衡策略,你能够应用 Dubbo 扩大能力。
  • 如果你须要实现自定义的注册核心,你能够应用 Dubbo 扩大能力。
  • 如果你须要实现自定义的过滤器,你能够应用 Dubbo 扩大能力。

Dubbo 扩大平等的看待外部实现和第三方实现。更多应用场景,参见 SPI 扩大实现

原文首于 Dubbo 官网:https://cn.dubbo.apache.org/z…
欢送在 https://github.com/apache/dubbo 给 Dubbo Star。
搜寻关注官网微信公众号:Apache Dubbo,理解更多业界最新动静,把握大厂面试必备 Dubbo 技能

退出移动版