nacos--基础--3.4--集成--spring--spring上下文中的一些关键的特性

news2025/1/20 3:41:55

nacos–基础–3.4–集成–spring–spring上下文中的一些关键的特性


1、spring上下文中的一些关键的特性

  1. 注解驱动
  2. 依赖注入
  3. 外部化配置
  4. 事件驱动

2、注解驱动

2.1、 启用 Nacos

  1. @EnableNacos 是一个模块驱动的注解
  2. @EnableNacos 支持 Nacos Spring 的所有功能
    1. 服务发现:等于 @EnableNacosDiscovery
    2. 配置管理:等于 @EnableNacosConfig
  3. 它等于 @EnableNacosDiscovery 加上 @EnableNacosConfig,可以单独配置并在不同场景中使用。

2.2、 配置监听

假设在 Nacos 服务中有一个配置,其 dataId 是 “testDataId” 而 groupId 是默认组(“DEFAULT_GROUP”)。 现在,您可以使用 ConfigService#publishConfig 方法更改其内容:

@NacosInjected
private ConfigService configService;

@Test
public void testPublishConfig() throws NacosException {
    configService.publishConfig(DATA_ID, DEFAULT_GROUP, "9527");
}

然后您可以添加一个监听器,它将监听配置的变化。 您可以通过在 Spring Bean 中添加配置变更监听器方法来执行此操作:

@NacosConfigListener(dataId = DATA_ID)
public void onMessage(String config) {
    assertEquals("mercyblitz", config); // asserts true
}

下面的代码具有相同的效果:

configService.addListener(DATA_ID, DEFAULT_GROUP, new AbstractListener() {
    @Override
    public void receiveConfigInfo(String config) {
        assertEquals("9527", config); // asserts true
    }
});

另外,@NacosConfigListener 支持更丰富的类型转换。

2.2.1、 类型

  1. @NacosConfigListener 的类型转换有2类
    1. 内置类型转换
    2. 自定义类型转换
  2. 默认情况:内置类型转换 基于 Spring DefaultFormattingConversionService,这意味着它包含了大多数情况以及 Spring 框架更高级版本的丰富功能。

2.2.1.1、举例

前面示例中的内容 “9527” 也可以通过带 “int” 或 “Integer” 参数的方法进行监听

@NacosConfigListener(dataId = DATA_ID)
public void onInteger(Integer value) {
    assertEquals(Integer.valueOf(9527), value); // asserts true
}



@NacosConfigListener(dataId = DATA_ID)
public void onInt(int value) {
    assertEquals(9527, value); // asserts true
}

2.2.1.2、nacos-spring-context 为开发人员提供弹性扩展

  1. 如果定义名为nacosConfigConversionService的Spring Bean,其类型为ConversionService,则将忽略DefaultFormattingConversionService。
  2. 可以自定义NacosConfigConverter接口的实现,以指定类型转换的侦听器方法

2.2.1.3、可以自定义NacosConfigConverter接口的实现

public class UserNacosConfigConverter implements NacosConfigConverter<User> {

    @Override
    public boolean canConvert(Class<User> targetType) {
        return true;
    }

    @Override
    public User convert(String source) {
        return JSON.parseObject(source, User.class);
    }
}

UserNacosConfigConverter 类绑定在 @NacosConfigListener.converter() 属性上,如下:

@NacosInjected
private ConfigService configService;

@Test
public void testPublishUser() throws NacosException {
    configService.publishConfig("user", DEFAULT_GROUP, "{\"id\":1,\"name\":\"mercyblitz\"}");
}

@NacosConfigListener(dataId = "user", converter = UserNacosConfigConverter.class)
public void onUser(User user) {
    assertEquals(Long.valueOf(1L), user.getId()); 
    assertEquals("mercyblitz", user.getName());
}

2.2.2、 超时时间

由于运行自定义的 NacosConfigConverter 可能需要一些时间,因此您可以在 @NacosConfigListener.timeout() 属性中设置最大执行时间,以防止它阻塞其他侦听器

@Configuration
public class Listeners {

    private Integer integerValue;

    private Double doubleValue;
	

    @NacosConfigListener(dataId = DATA_ID, timeout = 50)
    public void onInteger(Integer value) throws Exception {
        Thread.sleep(100); // timeout of execution   超过50毫秒,就抛异常,也就是说integerValue不会被赋值
        this.integerValue = value;
    }

    @NacosConfigListener(dataId = DATA_ID, timeout = 200)
    public void onDouble(Double value) throws Exception {
        Thread.sleep(100); // normal execution
        this.doubleValue = value;
    }

    public Integer getIntegerValue() {
        return integerValue;
    }

    public Double getDoubleValue() {
        return doubleValue;
    }
}

Listeners Bean 的 integerValue 总是为null,不会改变。 因此,以下断言都将是 true:

@Autowired
private Listeners listeners;

@Test
public void testPublishConfig() throws NacosException {
    configService.publishConfig(DATA_ID, DEFAULT_GROUP, "9527");
    assertNull(listeners.getIntegerValue()); // asserts true
    assertEquals(Double.valueOf(9527), listeners.getDoubleValue());   // asserts true
}

2.3、 全局和自定义 Nacos 属性

  1. globalProperties 是任何 @EnableNacos,@EnableNacosDiscovery 或 @EnableNacosConfig 中的必选属性
  2. globalProperties 类型为 @NacosProperties。
  3. globalProperties 将初始化为其他注解或组件的 “全局 Nacos 属性”
    1. 例如:@NacosInjected。
  4. globalProperties 定义全局和默认属性
    1. 具有最低优先级
    2. 可以被覆盖

2.3.1、 覆盖优先级

在这里插入图片描述

  1. 自定义的 Nacos 属性
    1. 由 @NacosProperties 配置。
    2. 是可选的
    3. 用于在特殊情况下覆盖全局 Nacos 属性。
  2. 非自定义的 Nacos 属性
    1. Nacos 属性将尝试从 @EnableNacosConfig.globalProperties() 或 @EnableNacosDiscovery.globalProperties() 或 @EnableNacos.globalProperties() 中查找属性。

2.4、 @NacosProperties

  1. @NacosProperties 是全局和自定义 Nacos 属性的统一注解。
  2. @NacosProperties 充当Java Properties 和 NacosFactory 类之间的中介。
  3. NacosFactory 负责创建 ConfigService 或 NamingService 实例。

2.4.1、 占位符

  1. @NacosProperties 的属性完全支持占位符,它的源是Spring Environment 抽象中的各种 PropertySource,通常是Java System Properties 和操作系统环境变量。
  2. 所有占位符的前缀都是 nacos.

2.4.2、@NacosProperties 和 Nacos 属性的属性之间的映射

在这里插入图片描述

注意:@EnableNacosDiscovery 和 @EnableNacosConfig 之间 globalProperties() 的占位符存在一些差异:

在这里插入图片描述

  1. 这些 @EnableNacosDiscovery 和 @EnableNacosConfig 的占位符用于隔离不同的 Nacos 服务,在大多数情况下都是不必要的。
  2. 默认情况下,将使用常规占位符。

3、 依赖注入(@NacosInjected)

  1. @NacosInjected 用于在Spring Beans 中注入 ConfigService 或 NamingService 实例,并使这些实例可缓存。
  2. 如果它们的 @NacosProperties 相等,则实例将是相同的,无论属性是来自全局还是自定义的 Nacos 属性

3.1、案例


@NacosInjected
private ConfigService configService;

@NacosInjected(properties = @NacosProperties(encode = "UTF-8"))
private ConfigService configService2;

@NacosInjected(properties = @NacosProperties(encode = "GBK"))
private ConfigService configService3;

@NacosInjected
private NamingService namingService;

@NacosInjected(properties = @NacosProperties(encode = "UTF-8"))
private NamingService namingService2;

@NacosInjected(properties = @NacosProperties(encode = "GBK"))
private NamingService namingService3;

@Test
public void testInjection() {

    Assert.assertEquals(configService, configService2);
    Assert.assertNotEquals(configService2, configService3);

    Assert.assertEquals(namingService, namingService2);
    Assert.assertNotEquals(namingService2, namingService3);
}

属性 configService 使用 @EnableNacos#globalProperties() 或 @EnableNacosConfig#globalProperties(),因为 encode 属性的默认值是 “UTF-8”,因此 configService 实例和由 @NacosProperties(encode =“UTF-8”) 注解的 configService2 实例是相同的。 namingService 和 namingService2 也是如此。

3.2、注意

与 NacosFactory.createConfigService() 方法创建的 ConfigService 实例不同,@NacosInjected 注解创建的 ConfigService 实例支持 Nacos Spring 事件。 例如,在增强的 ConfigService 调用 publishConfig() 方法之后会有一个 NacosConfigPublishedEvent。

4、外部化配置

  1. 外部化配置是 Spring Boot 引入的概念,它允许应用程序接收外部属性源以控制运行时行为。
  2. Nacos Server 在应用程序外部运行单独的进程以维护应用程序配置。
  3. nacos-spring-context 提供了对象绑定,动态配置(自动刷新)等功能。

4.1、nacos-spring-context 和 Spring Stack 之间的简单比较

在这里插入图片描述

5、 事件驱动

  1. Nacos 事件驱动 基于标准的 Spring Event / Listener 机制。
  2. Spring 的 ApplicationEvent 是所有 Nacos Spring 事件的抽象超类

在这里插入图片描述

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

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

相关文章

香港服务器托管带宽怎么选?

香港服务器托管时&#xff0c;带宽的选择非常重要&#xff0c;带宽用量的大小不同&#xff0c;最终的费用也就会不同。用户在香港托管服务器的时候&#xff0c;应该选择多大的带宽才合适呢?应该如何选择香港服务器带宽大小呢? 香港服务器托管带宽怎么选? 其实&#xff0c;大…

5G无线技术基础自学系列 | 无线电波传播模型

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 无线电波传播模型用于预测无线电波在各…

JAVA开发(JWTUtil工具类实现token源码赏析)

一、token解决问题的背景&#xff1a; 1、 单点登录&#xff0c; 2、分布式登录状态&#xff0c; 3、在信任期内 避免 重新输入用户名密码登录。 4、跨系统免登陆等。 5、一些接口的请求权限验证。 总结以上token最终都是为了解决在在分布式系统中信任期内 避免 重新输入用户名…

如何选择合适的统计学方法

一般来说&#xff0c;使用哪种统计方法&#xff0c;取决于我们的应用场景、我们的研究目的是什么。 这里面一个麻烦的地方在于&#xff0c;不管你使用哪种统计方法&#xff0c;似乎都可以得出一个’结果’或一个p值&#xff0c;但这个结果有没有意义就两说了。 在我看来&…

【WEB安全】Xstream最新反序列化poc执行报错问题

前言 最近有个需求&#xff0c;用Xstream反序列化打个内存马&#xff0c;从通用性来讲&#xff0c;肯定用1.4.17的洞去打应用范围最广。众所周知&#xff0c;Xstream官方会提供其漏洞的poc。在我实验之下&#xff0c;1.4.17的几个poc只要涉及到任意java代码执行的都会报错&…

VMware创建共享文件夹并实现文件传输(Windows主机,Ubuntu虚拟机)

文章目录创建共享文件夹安装/更新VMware tool挂载共享文件夹共享文件夹的实现更改配置项&#xff0c;实现自动挂载&#xff08;推荐直接用这个&#xff09;数据传输参考博客创建共享文件夹 1、开启虚拟机的共享文件夹配置 首先在虚拟机中打开设置&#xff0c;在选项中点击共享…

Java springboot+vue+MySQLJava大型CRM客户关系管理源码带手机端和小程序源码 Java客户全流程高效管理CRM系统源码

springbootvue MySQL数据库 1. 前端&#xff1a;Vue 2. 后端&#xff1a;Spring boot 3. 数据库&#xff1a;MySQL 源码已经亲测 1. 前端&#xff1a;Vue 2. 后端&#xff1a;Spring boot 3. 数据库&#xff1a;MySQL 小程序是用UNIAPP开发的。 后台登录账户&#xff1a…

(附源码)springboot智能服药提醒app 毕业设计 102151

基于springboot智能服药提醒app 摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;智能服药提醒app程序被用户…

平均价格算法:TWAP vs. VWAP

时间加权平均价格 (TWAP) 和成交量加权平均价格 (VWAP) 算法应用不同的方法来计算资产价格&#xff0c;这是所有去中心化金融 (DeFi) 原语的组成部分。 在本文中&#xff0c;我们介绍了 TWAP 和 VWAP 算法之间的差异&#xff0c;解释了它们如何在区块链环境中为资产定价&#…

化学工程与装备杂志化学工程与装备杂志社化学工程与装备编辑部2022年第10期目录

科学研究与开发《化学工程与装备》投稿&#xff1a;cnqikantg126.com 槐木活性炭处理生活废水的研究 孔繁铸;高丽娟;赵开创;钱程; 1-3 基于Pumplinx的水泵机械密封温升仿真研究 赵雪飞;贾红杰;李雪峰;李雷;王景新;张晓辉; 4-728 全固态石墨烯-Ag/AgCl海洋电场探测电…

功率放大器的输入阻抗和输出阻抗是交流还是直流电阻

功率放大器的输入阻抗和输出阻抗一般是指交流电阻。交流电阻指一些伏安特性曲线的斜率。所以放大器输入阻抗和输出阻抗都是理论分析计算为主&#xff0c;而不使用万用表测量其大小。 输入阻抗一般是指电路输入端的等效阻抗&#xff0c;输入端加上一个电压源U&#xff0c;测量输…

WRF模式安装+详细运行教程

安装教程在安装之前&#xff0c;首先需要去查看自己的 Linux 系统&#xff08;虚拟机或者服 务器&#xff09;上的编译环境&#xff0c;也就是确定自己是否安装编译器或安装了哪种编 译器。&#xff08;因为安装过程需要选择编译器&#xff09;常用的编译器分为三种系列&#x…

Typora基础使用技巧

Typora Tutorial 1.数学符号及公式 (1).常用数学符号 数学符号没什么特别的语法&#xff0c;这里顺道总结以下方便使用&#xff1a; &#xff0b; &#xff0d; ≠ ≈ / &#xff1e; &#xff1c; ≯ ≮ ≤ ≥ ∵ ∴ ∽ ≌&#xff0c; √&#xff0c; Φ Χ Ψ Ωα…

antd-protable的分页逻辑封装

一、前言 这次的分页基于pro-table进行封装。 前端分页看似是个小功能&#xff0c;但里面隐藏的逻辑还是非常多的&#xff0c;比如我们业务中需要的分页器除了能进行正常的页码切换等操作外&#xff0c;还需要如下的功能&#xff1a; 次页删除最后一条数据需要跳转至第一页&…

计算机研究生就业方向之去大厂做大数据

我一直跟学生们说你考计算机的研究生之前一定要想好你想干什么&#xff0c;如果你只是转码&#xff0c;那么你不一定要考研&#xff0c;至少以下几个职位研究生是没有啥优势的&#xff1a; 1&#xff0c;软件测试工程师&#xff08;培训一下就行&#xff09; 2&#xff0c;前…

JUC并发编程第十篇,谈谈ThreadLocal原理与内存泄露的那些事儿

JUC并发编程第十篇&#xff0c;谈谈ThreadLocal原理与内存泄露的那些事儿一、ThreadLocal是什么&#xff1f;能干嘛&#xff1f;二、ThreadLocal 使用场景举例三、阿里开发规范中 ThreadLocal 的使用&#xff08;SimpleDateFormat&#xff09;四、ThreadLocal 底层源码架构分析…

一个帖子教你实现 商品下单、获取商品订单信息、商品送货时发送通知 一体化功能

1、介绍 总览 通过无缝数据库结构&#xff0c;在保证数据的可用性、一致性、安全性外&#xff0c;云数据库能够实现数据在客户端和云端之间的无缝同步。云函数提供serverless环境&#xff0c;AppGallery Connect的其他服务为云函数提供事件源。监听事件源可以触发相关函数。 …

Word处理控件Aspose.Words功能演示:使用 C++ 将 PowerPoint 演示文稿转换为 Word 文档

Aspose API 支持旗下产品覆盖文档、图表、PDF、条码、OCR、CAD、HTML、电子邮件等各个文档管理领域&#xff0c;为全球.NET 、Java、C 等10余种平台开发人员提供丰富的开发选择。 在某些情况下&#xff0c;您有一个 PowerPoint 演示文稿并想要创建一个详细描述其内容的文档。为…

[附源码]Python计算机毕业设计电影院购票系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

小米手机系统好牛,真是国产系统的佼佼者

在十多年前智能手机&#xff0c;基本就没有定制、优化系统的概念&#xff0c;手机的图标都巨丑无比&#xff0c;而且还有好多不root都卸载不掉。当时买了一部漂亮国的某想手机&#xff0c;光预装应用就占了94%的空间&#xff0c;内容倒是特别“全面”&#xff0c;什么看小说的、…