当前位置:首页 > 公众号精选 > 架构师社区
[导读]这篇继续之前提到的 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获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

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

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭
关闭