当前位置:首页 > > 架构师社区
[导读]这篇继续之前提到的 Dubbo SPI 来讲讲扩展点自适应机制(这篇文末会画个 Dubbo SPI 完整的流程图,来帮助大家理解)。

Hola,我是 yes。

这篇继续之前提到的 Dubbo SPI 来讲讲扩展点自适应机制(这篇文末会画个 Dubbo SPI 完整的流程图,来帮助大家理解)。

这个名词听起来好像很高级,其实就是一个扩展代理类,通过参数返回对应的扩展实现类。

我写个代码看看应该就对扩展自适应一目了然了。

面试官问我什么是扩展自适应机制

代码中的 AdaptiveYes 就是代理类,实现同样的接口,然后根据调用时候的参数去选取对应的实现类进行调用,这就是扩展自适应。

例如拿到的yesName 是“yesA”则返回YesA这个实现类,是“yesB”则返回YesB这个实现类

是不是没什么花头?就简单加了一层,可以根据请求的参数来动态选择对应的扩展实现类,让扩展更加灵活

理解了什么是扩展自适应之后,我们再来具体看看 Dubbo 中的实现。

Dubbo 中的 Adaptive 注解

面试官问我什么是扩展自适应机制

从代码中可以看到 Adaptive 可以注解到类上或方法上。

注解到类上的话表明这个类就是要用的代理类,所以 Dubbo 不需要用字节码工具为这个扩展生成代理类。

注解在方法上表明 Dubbo 需要为这个方法生成代理逻辑。

拿上面提到的 AdaptiveYes 类来说,如果这个类上被标注了@Adaptive 那么说明这个类就是 Yes 这个扩展要用的代理类,框架就不用动态生成了。

面试官问我什么是扩展自适应机制

如果 @Adaptive 被标记在接口 Yes 的 sayHi 这个方法上,那 Dubbo 就需要用字节码工具来生成 AdaptiveYes 这个代理类。

面试官问我什么是扩展自适应机制

在 Dubbo 中,类上被修饰 @Adaptive 只有两个,分别是AdaptiveCompiler(自适应选编译器实现)AdaptiveExtensionFactory(自适应选择扩展工厂)

还记得之前提到的 Dubbo 自动注入功能的代码嘛?就是通过 SPI 找到的扩展实现类内部需要注入对象的功能。

面试官问我什么是扩展自适应机制

当时留了个坑,现在填上。

这行代码是要通过扩展实现类 set 方法上的参数找到扩展点要注入的对象,而这个 objectFactory 就是自适应扩展代理类。

面试官问我什么是扩展自适应机制

Dubbo 中的注入相对 Spring 而言比较复杂,因为有可能需要注入的是 Dubbo 中其它自适应扩展对象,也有可能注入的是 Spring Bean,或者是我们自行定义的容器里面的对象等等。

所以依赖注入的对象需要去多处查找,因此加了一层,搞了个自适应代理扩展类。

在 Dubbo 中的 ExtensionFactory (扩展工厂,从工厂中查找要注入的对象)有三个实现:

面试官问我什么是扩展自适应机制
  • SpringExtensionFactory:从 Spring 容器中去加载 Extension
  • SpiExtensionFactory:Dubbo 自己的SPI 去加载 Extension
  • AdaptiveExtensionFactory: 自适应的 AdaptiveExtensionLoader,也就是我们上面提到的代理类,由人工编写的。

ExtensionLoader 中的 objectFactory 用的就是 AdaptiveExtensionFactory 这个实现类了,咱们跑起来打个断点看看。

面试官问我什么是扩展自适应机制

嗯,确实是,还能看到 AdaptiveExtensionFactory 的成员变量 factories 还保存了另外两个工厂。

我们来简单地看下 AdaptiveExtensionFactory 。

这个工厂会先去加载所有 ExtensionFactory 的扩展类,然后查找 Extension 的时候会遍历每个 ExtensionFactory 实现类去找要注入的对象,找到了就返回。

面试官问我什么是扩展自适应机制

所以 Dubbo 就是通过这种方式来实现 IOC 的注入,很粗暴简单,每个工厂遍历过去查找需要注入的对象。

好了,填了之前文章 Dubbo IOC 的坑,也讲了下 @Adaptive 修饰类的情况(就是直接把这个类作为代理类)。

接下来要讲讲修饰方法的情况,相对而言比修饰类要复杂。

不过也不难,无非就是多了几步,要用字节码工具生成代理类的源码,然后编译成 Java 字节码,然后加载到 JVM 中,就是这样。

我们来看看源码,入口就是 getAdaptiveExtension 方法。

面试官问我什么是扩展自适应机制

那个 cachedApaptiveClass 就是 SPI 扫描对应文件夹加载类的时候记录的。

面试官问我什么是扩展自适应机制

结合上面两个代码图就知晓为什么类上标注 @Adaptive 的时候直接就用那个类,不然就需要框架生成代理类了。

我们再来看看框架生成的代码是怎样的。

面试官问我什么是扩展自适应机制

我们看的是 Protocol (协议接口,Dubbo 支持很多协议,默认dubbo协议)的自适应扩展代码,我们先看下 Protocol 这个接口的定义,然后再看看生成的代码。

面试官问我什么是扩展自适应机制 面试官问我什么是扩展自适应机制

如何生成上面 code 内容的方法我就不分析了,反正就是各种判断然后字符串拼接而成的,至于编译之前也提到了,Dubbo 默认选的是 javassist。

至此整个自适应逻辑扩展已经很清晰了,然后上完整 SPI 的图,相信看了图之后整个流程就了然于心了!

面试官问我什么是扩展自适应机制

Dubbo 中的 Activate

再提一提 @Activate ,这个就不进行源码分析了,此注解是用来实现自动激活特性的。

面试官问我什么是扩展自适应机制

主要的参数是:

  • group:表明类得在 Provider 端被激活还是在 Consumer 端被激活。
  • value:URL 参数上出现指定的值被激活。
  • order:扩展激活类之间的排序。

简单地说就是标注了这个注解的扩展会被记录,然后调用的时候根据参数来选取合适的扩展实现类。

比如参数的 group 和当前扩展类的 group 匹配,出现了指定的 key ,然后就会被激活。

对于 Filter 或者一些 Listener 来说比较有用,用来同时加载多个实现类,再看下官网的例子已经就比较清楚了。

面试官问我什么是扩展自适应机制

最后

Dubbo SPI 内容算完结了,源码分析其实不适合在公众号看,所以建议摸鱼的时候偷偷在电脑上打开看。

为了能让大家更好的理解,我已经做了标红的注释和画图了,不知道效果如何。

反正源码肯定是枯燥的,但是不管是为了深入学习还是为了应付面试,看源码这一步是一定要走的。

等 Dubbo 系列写完之后我再整理成 pdf,基本上看来下对 Dubbo 内部还是会有一定的了解的。


免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭