dubbo源码实践-SPI扩展-自适应扩展机制

news2024/11/18 5:34:13

目录

1 前提必备知识

2 术语定义

3 自适应扩展机制的特点

4 扩展点实践

4.1 用户自定义自适应扩展

4.2 dubbo生成自适应扩展

4 自适应扩展类的用途


1 前提必备知识

具体的使用和原理就不说了,网上有人写的挺好的了。

可以参考:

Dubbo SPI之自适应扩展机制 @Adaptive - 简书

2 术语定义

我们先统一下本文使用的术语(个人观点,有问题欢迎讨论):

1)扩展点(就是接口):一个接口,在dubbo中使用该接口,业务人员可以动态的替换相应的扩展。

2)扩展(就是实现类):扩展点对应的实现类。一个扩展点可以有多个扩展。dubbo中通过URL+自适应扩展来实现根据参数,动态选择扩展。

在本文中,扩展点等价于接口,扩展等价于实现类。

3 自适应扩展机制的特点

看过源码后,想自己总结关于自适应扩展机制的特点:

1 自适应扩展点,一个接口只能对应一个自适应扩展,其他的扩展都是实现业务功能的扩展,该类只会有一个对象被缓存到ExtensionLoader中。可以参考ExtensionLoader源码的属性cachedAdaptiveClass、cachedAdaptiveInstance。

2 ExtensionLoader允许我们自定义自适应扩展,只要在一个实现类上加上@Adaptive注解即可。参考AdaptiveCompiler类。

3 如果我们自己不定义,ExtensionLoader可以帮我们生成一个接口(该接口的方法上需要添加@Adaptive注解)的对应实现类。

4 扩展点实践

4.1 用户自定义自适应扩展

我们在一个扩展上面加上@Adaptive注解,该扩展会成为自适应扩展。

4.1.1 项目例子概述

HelloService一个接口,该接口有3个实现(两个业务相关的实现,一个自适应实现)。一个dubbo扩展配置文件,一个程序启动入口类。

HelloService接口

package org.example.test.exAdaptive;
import org.apache.dubbo.common.extension.SPI;
@SPI("father")
public interface HelloService {
    String sayHello(String name);
}

两个业务实现类,FatherHelloServiceImpl、MotherHelloServiceImpl。

package org.example.test.exAdaptive;

public class FatherHelloServiceImpl implements HelloService{
    @Override
    public String sayHello(String name) {
        return "Father say hello to " + name;
    }
}
--------------------------------------

package org.example.test.exAdaptive;

public class MotherHelloServiceImpl implements HelloService{
    @Override
    public String sayHello(String name) {
        return "Mather say hello to " + name;
    }
}

自适应扩展类,注意@Adaptive注解加在类上来。

package org.example.test.exAdaptive;
import org.apache.dubbo.common.extension.Adaptive;
import org.apache.dubbo.common.extension.ExtensionLoader;
/**
 * @author lihe49
 * @version 1.0
 */
@Adaptive
public class AdaptiveHelloServiceImpl implements HelloService{
    @Override
    public String sayHello(String name) {
        ExtensionLoader<HelloService> loader = ExtensionLoader.getExtensionLoader(HelloService.class);
        HelloService helloService;
        if (name.equals("A")){
            helloService = loader.getExtension("father");
        } else {
            helloService = loader.getExtension("mother");
        }
        return helloService.sayHello(name);
    }
}

dubbo扩展配置文件,org.example.test.exAdaptive.HelloService文件

father=org.example.test.exAdaptive.FatherHelloServiceImpl
mother=org.example.test.exAdaptive.MotherHelloServiceImpl
adaptive=org.example.test.exAdaptive.AdaptiveHelloServiceImpl

程序启动入口文件,DubboSPI_AdaptiveTest类

package org.example.test.exAdaptive;
import org.apache.dubbo.common.extension.ExtensionLoader;
import java.util.Set;

public class DubboSPI_AdaptiveTest {
    public static void main(String[] args) {
        ExtensionLoader<HelloService> extensionLoader = ExtensionLoader.getExtensionLoader(HelloService.class);
        Set<String> supportedExtensions = extensionLoader.getSupportedExtensions();
        System.out.println("HelloService的扩展为: " + supportedExtensions);
        HelloService adaptiveExtension = extensionLoader.getAdaptiveExtension();
        System.out.println("自适应类名为: " + adaptiveExtension);
    }
}

运行结果

需要注意两点:

1)虽然有3个实现类,但是只有两个扩展。

2)自适应扩展的类名是真是的类名。

自适应扩展只能有一个有效。定义2个,最后一个生效。感兴趣的同学可以自己测试一下。

4.2 dubbo生成自适应扩展

dubbo生成自适应扩展,需要在接口的方法上添加@Adaptive注解。

这个网上例子比较多。可以参考这篇文章的demo部分。

Dubbo插件扩展机制(@Adaptive) - StrangerIt - 博客园

4 自适应扩展类的用途

自适应扩展类用途是什么呢?

答:

1)可以通过URL参数动态选择扩展。主要是dubbo自动生成扩展方式。

2)dubbo扩展类自动注入属性的时候,注入的属性实例是自适应扩展实例。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/133586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【北京理工大学-Python 数据分析-1.1】

数据维度 维度&#xff1a;一组数据的组织形式 一维数据&#xff1a;由对等关系的有序或无序数据构成&#xff0c;采用线性组织形式。包括列表、集合和数组&#xff08;python中不常见&#xff0c;但在C和Java中比较常见&#xff09;类型。 列表&#xff1a;数据类型可以不同…

讲座笔记:Representation Learning on Networks

1 传统机器学习 传统机器学习需要进行很多的特征工程 我们希望模型自动学习特征&#xff0c;而不是用人为特征工程的方式1.1 目标 1.2 难点 graph更复杂&#xff0c;CNN和RNN很难直接应用 ——>复杂的拓扑结构&#xff08;不像CNN有网格的概念&#xff09;——>没有固定…

国家队入场,中国数字资产交易市场或将迎来新一轮“洗牌”

‍‍数据智能产业创新服务媒体——聚焦数智 改变商业数字化已经成为中国文化产业的催化剂&#xff0c;一大批文化资源在数字技术的赋能下焕发了崭新的生机。随着数字化的升级与科技进步&#xff0c;数字经济正在成为改变全球竞争格局的关键力量&#xff0c;各国家都争先出台相…

【微服务】Nacos 健康检查机制

目录 一、前言 二、注册中心的健康检查机制 三、Nacos 健康检查机制 四、临时实例健康检查机制 五、永久实例健康检查机制 六、集群模式下的健康检查机制 七、小结 &#x1f496;微服务实战 &#x1f496; Spring家族及微服务系列文章 一、前言 在前文中&#xff0c;…

使用 Helm 安装 MQTT 服务器-EMQX

EMQX ℹ️ Info: 使用 EMQX 通过 Helm3 在 Kubernetes 上部署 EMQX 4.0 集群 | EMQ emqx/deploy/charts/emqx at main-v4.4 emqx/emqx (github.com) emqx/values.yaml at main-v4.4 emqx/emqx (github.com) emqx/emqx-operator: A Kubernetes Operator for EMQ X Broker (git…

Arch Linux/Manjaro安装pycharm

首先换清华源以加快速度 &#xff08;已经换源的小伙伴可以跳过这一步&#xff09; 首先安装vim&#xff0c;用来编辑文件&#xff0c;已经安装过的可以跳过这一步。 sudo pacman -S vim 然后使用vim编辑配置文件 sudo vim /etc/pacman.d/mirrorlist 打开文件以后按inser…

Javaweb——第二章 Jsp和Servlet

目录 2.1 JSP概述 2.2 Servlet概述 2.3 jsp和servlet的区别和联系&#xff1a; ​编辑 2.4 Jsp的生命周期 2.4.1 JSP编译 2.4.2 JSP初始化 2.4.3 JSP执行 2.4.4 JSP清理 2.5 Servlet 2.5.1 Servlet的工作模式 2.5.2 Servlet创建方式 2.5.3 Servlet生命周期 2.1 JS…

JAVA之网络编程学习

文章目录一 java网络编程初识1.1 概述1.2 C/S 架构&B/S架构认识1.2.1 C/S架构1.2.2 B/S架构1.3 网络通信两个要素1.4 IP(Inet Adderss)1.5 InetAddress演示1.6 端口号1.7 InetSocketAddress使用1.8 网络通信协议二 TCP网络编程2.1 信息通信案例2.1.1 TcpClientDemo2.1.2 Tc…

聊聊接口文档的事儿

1、前言 大家好&#xff0c;欢迎来到我的吉鹿&#xff08;记录&#xff09;空间。 最近在做一个前后端分离的项目时&#xff0c;由于后端提供的 API 接口文档实在是一言难尽&#xff0c;导致了开发的效率大大降低。于是我出手了&#xff0c;我决定薅完我20几年的头发来肝一下…

TC275——10GPT12_PWM_Generation

产生PWM的方式有很多&#xff0c;这里尝试使用TC275的GPT12模块&#xff0c;来产生具有固定频率和可变占空比的PWM信号。 GPT12就是General Purpose Timer Unit通用定时器模块&#xff0c;它包含5个16位定时器&#xff0c;被分给GPT1和GPT2。 这里使用GPT1&#xff08;T2、T3…

LinuxQQ3.0体验和下载方式

体验 2022年12月31日推出了LinuxQQ3.0版本&#xff0c;2.0版本特别复古 3.0特别丝滑 支持QQ空间 管理界面与WindowsQQ一致 支持截图和表情&#xff0c;传输文件图片很方便 下载方式 下载链接 im.qq.com/linuxqq/index.shtml 选择合适的版本下载即可 从下载文件夹中可以找到…

.Net 6实现旋转验证码

前几篇文章&#xff0c;介绍了.Net 6实现的滑动验证码功能&#xff0c;最近把滑动验证码的ImageSharp替换成了SkiaSharp&#xff0c;其中抠图部分参考了pojianbing大神的代码。滑动验证码完成之后&#xff0c;心想着。做一个旋转验证码。其实旋转验证码跟滑动验证码及其类似。 …

跨系统实时同步数据解决方案

数据量太大&#xff0c;单存储节点存不下&#xff0c;就只能把数据分片存储。 数据分片后&#xff0c;对数据的查询就没那么自由。如订单表按用户ID作为Sharding Key&#xff0c;就只能按用户维度查询。我是商家&#xff0c;我想查我店铺的订单&#xff0c;做不到。&#xff0…

ubuntu18.04下mysql数据库C语言API操作总结

通过C/C去操作数据库需要调用mysql客户端api&#xff0c;常用api和调用举例见后面。 目录 一.常用api 1.环境初始化 2.连接 mysql 的服务器 3.增删改查操作 4.事务处理 5.处理查询数据集合 6.释放资源&#xff0c;关闭连接 7.字符集相关 8.获取错误信息 二.api调用举…

Linux杂谈之sudo

一 sudo配置文件/etc/sudoers介绍 ① 什么是sudo 1) sudo 的英文全称是 super user do&#xff0c;即以超级用户root 用户的方式执行命令2) /etc/sudoers 是一个文本文件,只有root用户有该命令的执行权限 1) 允许普通用户以特权用户的权限去执行某些特权命令,访问和使用本…

优秀国土空间规划设计网络评选投票投票怎么进行小程序免费使用

如果通过一个小程序免费制作一个微信投票活动呢&#xff1f;文章详细讲解如何利用一款免费好用的微信小程序“活动星投票”小程序来制作投票活动&#xff0c;无需注册即可免费制作&#xff0c;非常的方便快捷&#xff0c;可以实现视频投票、分组投票、隐藏选手票数、导出投票数…

【Linux】进程概念(下)

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;进程状态&…

手把手教你用Python和OpenCV搭建一个半自动标注工具(详细步骤 + 源码)

导 读 本文将手把手教你用Python和OpenCV搭建一个半自动标注工具&#xff08;包含详细步骤 源码&#xff09;。 背景介绍 样本标注是深度学习项目中最关键的部分&#xff0c;甚至在模型学习效果上起决定性作用。但是&#xff0c;标注工作往往非常繁琐且耗时。一种解决方案是…

【苹果家庭群发推】创作AppleScript脚本来控制MacOS附有的iMessage客户端停止考据,近似于组iMessage

推荐内容IMESSGAE相关 作者推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者推荐内容3.日历推 *** 点击即可查看作者要求内容信息作者推荐…

ENVI_IDL:如何对文件名的日期进行格式化输出?

目录 00 前言 01 第一步&#xff0c;使用file_basename()函数路径中的获取文件名 02 第二步&#xff0c;使用strmid()函数获取文件名的日期 03 第三步&#xff0c;将获取的日期进行类型转换 04 第四步&#xff0c;将日期进行整理 05 第五步&#xff0c;进行格式化输出 …