Dubbo SPI机制之三Adaptive自适应功能
JDK标准中SPI机制的一个问题就是其一次性实例化扩展点所有实现,如果有扩展实现初始化很耗时,但如果没用上也加载,会很浪费资源;扩展点加载失败,其他扩展点都用不了了。Dubbo是如何解决该问题动态的选择具体的扩展点呢?使用@Adaptive。
Dubbo中的Adaptive功能,主要解决的问题是如何动态的选择具体的扩展点。通过getAdaptiveExtension同一对知道接口对于的所有扩展点进行封装,同时通过URL的方式对扩展点来进行动态选择(dubbo中所有的注册信息都是通过URL的形式进行处理的。)
查看@Adaptive注解源码及其注释,如下:

通过上面注释分析自适应功能执行流程如下:
1、如果不使用@Adaptive,使用@SPI标记的所有扩展均被默认加载;
2、使用@Adaptive的扩展被选择加载,可以加载整个扩展点也可以加载该扩展点中某个功能点(根据URL和@Adaptive中参数同时决定)。
下面具体应用@Adaptive验证上述功能:
1、创建接口
增加传入URL参数的方法: 
2、创建实现类
实现有参数URL的方法:

3、编写主程序

红框部分为自适应加载扩展点比默认加载所有扩展需要明确注意的:1)URL参数;2)明确地使用getAdaptiveE'xtension加载自适应扩展。
在第一步接口中,需要增加@Adaptive。下面验证不直接添加,而是通过测试验证注解功能一步步添加。增加配置文件内容

首先测试@Adaptive无参固定,@SPI与URL之间参数变化的场景,如下:
1)修改@SPI注解为@SPI("hello")或者其他任意字符,执行DubboSPI机制二之Dubbo中SPI初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中的主程序

执行结果:

对于非自适应的加载,@SPI有无指定默认加载都无效,默认加载所有。
2)同上,但是执行此文中主程序(使用了getAdaptiveExtension方法,以下测试均使用)。结果如下:

失败:提示在此扩展中没有自适应的方法,进而拒绝创建自适应实例。
3)方法上增加自适应标签@Adaptive

执行主程序,结果如下:

URL中有dog,执行的时候找到的是扩展名为dog的扩展实现。如果改为human呢?应该是hello 加url了。验证确实如此:

如果URL中扩展名为空呢?


失败:提示无name为hello的扩展实现。配置文件中确实没有名为hello的扩展实现。说明对于URL中没有扩展名的自适应,默认使用@SPI中指定的扩展实现。
4)提供默认扩展名为human

执行结果为:

如果无默认扩展名呢?

执行结果为:

失败:提示扩展名为null
其次测试测试@Adaptive有参数时,其与URL是如何共同控制自适应扩展点加载:
1)此案例@Adaptive设置参数hello.service:

如果URL中无扩展名,执行主程序结果:

可以看到如果使用了正确参数XX的@Adptive,如果URL中使用没有为XX赋值,使用@SPI指定扩展实现。
2)如果URL中扩展名为dog,执行主程序及结果:

说明使用URL中提供扩展名扩展实现。
综合上述@SPI,@Adaptive, URL三者配合使用如下:
URL中提供扩展名:
1)如果没有使用getAdaptiveExtension方法,有无@Adaptive无所谓,@SPI有无扩展名也无影响,直接加载所有扩展实现;
2)如果使用getAdaptiveExtension方法,没有@Adaptive参数,交易失败;提供@Adaptiveh参数,加载URL中符合接口参数的扩展实现;如果无符合接口参数的,加载@SPI中指定扩展实现。
URL中无扩展名信息:无论@Adaptive中是否提供参数,均加载@SPI中指定扩展实现。
对于@Adaptive中参数,此例中为什么是hello.service?这个可以看最开始注释部分其默认参数名规则:

Dubbo SPI机制之三Adaptive自适应功能的更多相关文章
- 【Dubbo源码阅读系列】之 Dubbo SPI 机制
最近抽空开始了 Dubbo 源码的阅读之旅,希望可以通过写文章的方式记录和分享自己对 Dubbo 的理解.如果在本文出现一些纰漏或者错误之处,也希望大家不吝指出. Dubbo SPI 介绍 Java ...
- Dubbo SPI 机制源码分析(基于2.7.7)
Dubbo SPI 机制涉及到 @SPI.@Adaptive.@Activate 三个注解,ExtensionLoader 作为 Dubbo SPI 机制的核心负责加载和管理扩展点及其实现.本文以 E ...
- Dubbo SPI机制之一JDK中的SPI
首先简单阐述下什么是SPI:SPI 全称为 (Service Provider Interface) ,是JDK内置的一种服务提供发现机制.目前有不少框架用它来做服务的扩展发现,简单来说,就是一种动态 ...
- dubbo SPI机制
源码分析: /** * 获取扩展类 */ @SuppressWarnings("unchecked") public T getExtension(String name) { i ...
- Dubbo 源码分析 - SPI 机制
1.简介 SPI 全称为 Service Provider Interface,是 Java 提供的一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加 ...
- 面试常问的dubbo的spi机制到底是什么?
前言 dubbo是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力.作为spring cloud alibaba体系中重要的一部分,随着spring cloud alibaba在 ...
- SPI 机制-插件化扩展功能
SPI(Service Provider Interfaces),中文直译服务提供者接口,一种服务发现机制.可能很多人都不太熟悉这个机制,但是平常或多或少都用到了这个机制,比如我们使用 JDBC 连接 ...
- Dubbo SPI源码解析①
目录 0.Java SPI示例 1.Dubbo SPI示例 2.Dubbo SPI源码分析 SPI英文全称为Service Provider Interface.它的作用就是将接口实现类的全限定名 ...
- Dubbo源码学习之-Adaptive自适应扩展
前言 最近三周基本处于9-10-6与9-10-7之间,忙碌的节奏机会丢失了自己.除了之前干施工的那段经历,只看参加软件开发以来,前段时间是最繁忙的了.忙的原因,不是要完成的工作量大,而是各种环境问题, ...
随机推荐
- vue2.0点击其他任何地方隐藏dom
methods: { handleBodyClick(){ if (绿色区域出来了,要判断点击其他地方就要关闭,这样可以避免绿色区域已经关闭还在操作) { let _con = $(目标区域) if ...
- Mybatis实现分包定义数据库
Mybatis实现分包定义数据库 背景 业务需求中需要连接两个数据库处理数据,需要用动态数据源.通过了解mybatis的框架,计划 使用分包的方式进行数据源的区分. 原理 前提: 我们使用mybati ...
- 刨根问底: Kafka 到底会不会丢数据?
大家好,我是 华仔, 又跟大家见面了. 上一篇作为专题系列的第二篇,从演进的角度带你深度剖析了关于 Kafka 请求处理全流程以及超高并发的网络架构设计的实现细节,今天开启第三篇,我们来聊聊 Kafk ...
- 《剑指offer》面试题53 - II. 0~n-1中缺失的数字
问题描述 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0-n-1之内.在范围0-n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. 示例 1: 输入: [ ...
- JS调用堆栈
调用栈 JavaScript 是一门单线程的语言,这意味着它只有一个调用栈,因此,它同一时间只能做一件事.如果我们运行到一个函数,它就会将其放置到栈顶.当从这个函数返回的时候,就会将这个函数从栈顶弹出 ...
- Pod:Kubernetes最小执行单元
Pod基本概念理解 Pod是什么 Pod 是 Kubernetes 应用程序的基本执行单元,它是 Kubernetes 对象模型中创建或部署的最小和最简单的单元. 一个Pod可以包括一个或者多个容器. ...
- eclipse导入项目jdk版本不一样
一:eclipse导入项目jdk版本不一样解决方案 参考博文: https://www.cnblogs.com/chenmingjun/p/8472885.html 选中项目右键 --> Pro ...
- 【笔记】thanos ruler组件
阅读官网文档后的笔记:https://thanos.io/tip/components/rule.md/ 感受 官网第一个话就强调风险,看来坑很多,能不用尽量不用 recording rule &am ...
- 【转载】ASP.NET 内联代码、内联表达式、数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号)
ASP.NET 内联代码.内联表达式.数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号) 今天在做渭南电脑维修网的一个小功能时遇到了一些问题,因此特别列出,以备他日之用. 首先对 ...
- 使用 ES Module 的正确姿势
前面我们在深入理解 ES Module 中详细介绍过 ES Module 的工作原理.目前,ES Module 已经在逐步得到各大浏览器厂商以及 NodeJS 的原生支持.像 vite 等新一代的构建 ...