当前位置: 首页 > news >正文

Nacos共享配置

本文介绍一下Nacos作为配置中心时,如何读取共享配置

我的环境

  • Windows10
  • JDK8
  • SpringCloud:Finchley.RELEASE
  • SpringBoot:2.0.4.RELEASE
  • spring-cloud-alibaba-dependencies:0.2.2.RELEASE
  • Nacos-server:1.0.1

本文的项目Demo继续沿用之前文章中的聚合工程Nacos,若小伙伴还没有之前的环境,可至源码地址中下载

场景描述

一个项目中服务数量增加后,配置文件相应增加,多个配置文件中会存在相同的配置,那么我们可以将相同的配置独立出来,作为该项目中各个服务的共享配置文件,每个服务都可以通过Nacos进行共享配置的读取

下面用一个demo演示下,是否可行

  • demo工程:nacos-config-share
  • 配置文件:nacos-config-share.yml
  • 共享配置文件:shareconfig1.yml,shareconfig2.yml

创建项目

一如往常,还是在聚合工程Nacos下创建名为nacos-config-share的子工程,其pom.xml文件依赖与之前的项目都一致,如果您没有之前的项目可参考源码地址

1、修改springboot启动类NacosConfigShareApplication.java

@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class NacosConfigShareApplication {
@SpringBootApplication
@EnableDiscoveryClient
@RestController
@RefreshScope
public class NacosConfigShareApplication {public static void main(String[] args) {SpringApplication.run(NacosConfigShareApplication.class, args);}@Value("${nacos.share}")private String share;@Value("${share.config1}")private String shareConfig1;@Value("${share.config2}")private String shareConfig2;@RequestMapping("/getValue")public String getValue() {return share;}@RequestMapping("/getShare1")public String getShare1() {return shareConfig1;}@RequestMapping("/getShare2")public String getShare2() {return shareConfig2;}
}

2、修改该项目的配置文件bootstrap.yml

spring:application:name: nacos-config-sharecloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848prefix: ${spring.application.name}file-extension: ymlshared-dataids: shareconfig1.yml,shareconfig2.ymlrefreshable-dataids: shareconfig1.yml,shareconfig2.yml

从配置文件可以看出,通过shared-dataids属性来指定要读取共享配置文件的DataID,多个文件用,分隔
使用refreshable-dataids指定共享配置文件支持自动刷新

新建配置文件

这里我们作为演示,暂不加入Namespace,直接在公共空间中创建及测试

创建配置文件nacos-config-share.yml,详细如下:

  • DataId:nacos-config-share.yml
  • 配置格式:YAML
  • 配置内容:
    server:port: 9984
    nacos: share: nacos-config-share
    

创建共享配置文件1shareconfig1.yml,详细如下:

  • DataId:shareconfig1.yml
  • 配置格式:YAML
  • 配置内容:
    share: config1: 这里是共享配置文件1
    

创建共享配置文件1shareconfig2.yml,详细如下:

  • DataId:shareconfig2.yml
  • 配置格式:YAML
  • 配置内容:
    share: config2: 这里是共享配置文件2
    

创建成功后,配置列表如下图:

shareconfig

启动测试

直接启动项目,如果启动成功。可以看到日志中如下信息:

startup

访问启动类中提供的接口,测试下能否获取到共享配置文件中的值

访问127.0.0.1:9984/getValue,返回:nacos-config-share
访问127.0.0.1:9984/getShare1,返回:这里是共享配置文件1
访问127.0.0.1:9984/getShare2,返回:这里是共享配置文件2

再测试下refreshable-dataids配置的自动刷新是否生效

在Nacos控制台中修改共享配置文件shareconfig2.yml的值为:这里是共享配置文件2这里是共享配置文件2

编辑保存后,重新请求 127.0.0.1:9984/getShare2 ,观察返回结果如下:

这里是共享配置文件2这里是共享配置文件2

以上返回结果说明通过在配置文件中指定shared-dataidsrefreshable-dataids是可以实现共享配置文件的读取和自动刷新的。

需求变更

假设现在要读取shareconfig3.ymlshareconfig4.yml文件但是它的Group为SHARE3_GROUPSHARE4_GROUP, 即共享配置文件与项目自身配置文件不在同一Group中(上边的例子是全都在DEFAULT_GROUP分组) 那如果继续用上边的方法,就无法读取共享配置文件

这时可以使用另一个配置ext-config,它可以由用户自定义指定需要加载的配置DataID、Group以及是否自动刷新

并且ext-config是一个集合(List),支持多个配置文件的指定。

新建共享配置文件

先创建配置配置文件shareconfig3.ymlshareconfig4.yml,注意他们的Group属性

  • DataId:shareconfig3.yml
  • Group:SHARE3_GROUP
  • 配置格式:YAML
  • 配置内容:
    share: config3: 这里是共享配置文件3Group:SHARE3_GROUP
    
  • DataId:shareconfig4.yml
  • Group:SHARE4_GROUP
  • 配置格式:YAML
  • 配置内容:
    share: config4: 这里是共享配置文件4Group:SHARE4_GROUP
    

创建成功页面如下:

shareconfig34

修改项目代码

1、在启动类NacosConfigShareApplication.java中新增如下代码

    @Value("${share.config3}")private String shareConfig3;@Value("${share.config4}")private String shareConfig4;@RequestMapping("/getShare3")public String getShare3() {return shareConfig3;}@RequestMapping("/getShare4")public String getShare4() {return shareConfig4;}

2、修改项目配置文件bootstrap.yml,增加ext-config配置

spring:application:name: nacos-config-sharecloud:nacos:discovery:server-addr: 127.0.0.1:8848config:server-addr: 127.0.0.1:8848prefix: ${spring.application.name}file-extension: ymlshared-dataids: shareconfig1.yml,shareconfig2.ymlrefreshable-dataids: shareconfig1.yml,shareconfig2.ymlext-config:- data-id: shareconfig3.ymlgroup: SHARE3_GROUPrefresh: true- data-id: shareconfig4.ymlgroup: SHARE4_GROUPrefresh: true

启动进行测试

项目经过修改后,可以看到

  1. 项目自身的nacos配置文件属于DEFAULT_GROUP下,默认读取
  2. shareconfig1.yml,shareconfig2.yml 都属于DEFAULT_GROUP下,通过shared-dataids指定进行读取
  3. shareconfig3.yml,shareconfig4.yml 都属于非DEFAULT_GROUP下,通过ext-config配置属性进行自定义读取

启动项目,测试所有的配置文件是否可以正常读取

访问127.0.0.1:9984/getValue,返回:nacos-config-share
访问127.0.0.1:9984/getShare1,返回:这里是共享配置文件1
访问127.0.0.1:9984/getShare2,返回:这里是共享配置文件2这里是共享配置文件2
访问127.0.0.1:9984/getShare3,返回:这里是共享配置文件3,Group:SHARE3_GROUP
访问127.0.0.1:9984/getShare4,返回:这里是共享配置文件4,Group:SHARE4_GROUP

修改shareconfig4.yml的配置内容为:这里是共享配置文件4,Group:SHARE4_GROUP,支持自动刷新,保存后,再次调用127.0.0.1:9984/getShare4,返回如下:

这里是共享配置文件4,Group:SHARE4_GROUP,支持自动刷新

调用接口后发现,两种共享配置的加载方式都可以正常读取,并且可以一起使用。ext-config的方式实现了用户自定义配置共享配置文件。

总结

上面的demo已经演示Nacos共享配置的两种实现方式,两种方式针对不同的场景,总结如下:

  • shared-dataids方式:
    • 适合于共享配置文件与项目默认配置文件处于相同Group时,直接两条命令就可以搞定
    • 优点:配置方便
    • 缺点:只能在同一Group中
  • ext-config方式:
    • 它可以由开发者自定义要读取的共享配置文件的DataId、Group、refresh属性,这样刚好解决了shared-dataids存在的局限性。
    • 优点:可以与shared-dataids方案结合使用,用户自定义配置。灵活性强
    • 缺点:配置容易出错,要熟悉YAML语法

可见两种方式各有长处,所以如果在开发中需要使用共享配置,大家可以是具体情况而定选择自己最合适的方案。

本文源码:https://github.com/larscheng/larscheng-learning-demo/tree/master/Nacos

相关文章:

Nacos共享配置

本文介绍一下Nacos作为配置中心时,如何读取共享配置 我的环境 Windows10JDK8SpringCloud:Finchley.RELEASESpringBoot:2.0.4.RELEASEspring-cloud-alibaba-dependencies:0.2.2.RELEASENacos-server:1.0.1 本文的项目…...

数据结构——排序(4)

作者:几冬雪来 时间:2023年4月12日 内容:数据结构排序内容讲解 目录 前言: 1.快速排序中的递归: 2.小区间优化: 3.递归改非递归: 4.归并排序: 5.归并排序的非递归形式&…...

C++13:搜索二叉树

目录 搜索二叉树概念 模拟实现搜索二叉树 插入函数实现 插入函数实现(递归) 查找函数实现 删除函数实现 删除函数实现(递归) 中序遍历实现 拷贝构造函数实现 析构函数实现 赋值重载 我们在最开始学习二叉树的时候,…...

【从零开始学Skynet】基础篇(五):简易聊天室

在游戏中各玩家之间都可以进行聊天之类的交互,在这一篇中,我们就来实现一个简易的聊天室功能,这在上一篇代码的基础上很容易就能实现。1、功能需求 客户端发送一条消息,经由服务端转发,所有在线客户端都能收到&#xf…...

HDU - 2089 不要62(数位DP)

题目如下: 杭州人称那些傻乎乎粘嗒嗒的人为 626262(音:laoer)。 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来&#x…...

网络安全与防御

1. 什么是IDS? IDS(入侵检测系统):入侵检测是防火墙的合理补充,帮助系统对付网络攻击,扩展了系统管理员的安全管理能力,提高了信息安全基础结构的完整性。主要针对防火墙涉及不到的部分进行检测。 入侵检测主要面对的…...

【DT】蒸脱机的结构和工作原理

DT蒸脱机的结构和工作原理什么是DTDT结构图工作过程什么是DT DT 蒸脱机(DesolventazationerToaster),根据英文名可以看出来,他的作用是脱溶、烘烤。用于蒸脱湿豆粕中的溶剂。 大豆油生产工艺有2种:压榨油的加工工艺是…...

Docker管理软件

下面是一些常见的Docker管理软件 Portainer Portainer是一个轻量级的Docker管理界面,可以以用户友好的方式显示Docker环境的状态。它提供了仪表板、容器、镜像、卷、网络等功能。 Rancher Rancher是一个开源的Docker容器管理平台,支持多个主机和集群…...

关于运行时内存数据区的一些扩展概念

栈顶缓存技术(Top-of-Stack Cashing) 前面提过,基于栈式架构的虚拟机所使用的零地址指令更加紧凑,但完成一项操作的时候必然需要使用更多的入栈和出栈指令,这同时也就意味着将需要更多的指令分派(instruction dispatc…...

计算机组成原理第二章数据的表示与运算(中)

提示:且行且忘且随风,且行且看且从容 文章目录前言2.2.0 奇偶校验码(大纲已删)2.2.1 电路的基本原理 加法器设计2.2.2 并行进位加法器2.2.3 补码加减运算器2.2.4 标志位的生成2.2.5 定点数的移位运算2.2.62.2.6.1 原码的乘法运算2.2.6.2 补码的乘法运算2…...

我的第一台电脑的故事

第一台电脑啊,多么遥远的故事了,又似乎就在眼前。今天重回往事,就简单记录一下吧。 🌱缘起 那是初一,至今已13年,遂觉遥远,而又是立志我学习的起点,至今还在校园,又觉就…...

【1041. 困于环中的机器人】

来源:力扣(LeetCode) 描述: 在无限的平面上,机器人最初位于 (0, 0) 处,面朝北方。注意: 北方向 是 y 轴的正方向。南方向 是 y 轴的负方向。东方向 是 x 轴的正方向。西方向 是 x 轴的负方向。 机器人可…...

几何算法——4.交线(intersection curve)的表达与参数化、微分性质

几何算法——4.曲面求交的交线(intersection curve)的表达与参数化、微分性质1 关于曲面求交的交线表达2 交线的微分性质3 交线的参数化4 修正弦长参数化的微分性质1 关于曲面求交的交线表达 两个曲面求交,比较经典的方法是用跟踪法&#xf…...

【GPT】让你事半功倍特别好用的5个GPT工具

文章目录前言一、现在还能开通ChatGPT4.0吗?二、推荐五款与ChatGPT的相关实用工具1.一款浏览器插件:ChatGPT for Google2.一款生成图片的AI工具:midjourney3.推荐两款AI自动生成PPT:闪击PPT、mindshow4.识别PFD文件内容对话&#…...

人工智能大模型多场景应用原理解析

前言 在上篇文章《人工智能大模型之ChatGPT原理解析》中分享了一些大模型之ChatGPT的核心原理后,收到大量读者的反馈,诸如:在了解了核心原理后想进一步了解未来的发展趋势(比如生成式人工智能和元宇宙能擦出什么样的火花?),大模型…...

SpringBoot默认包扫描机制与默认配置文件

文章目录一、SpringBoot默认包扫描机制 - 示例二、SpringBoot默认扫描包机制 - 原理三、SpringBoot手动扫描包机制 - 原理&示例四、ComponentScan与MapperScan五、SpringBoot默认配置文件一、SpringBoot默认包扫描机制 - 示例 默认情况下,扫描启动类同级及其子…...

RabbitMq 消息可靠性问题(一) --- publisher发送时丢失

前言 消息从生产者发送到exchange, 再到 queue, 再到消费者。这个过程中有哪些有消息丢失的可能性呢? 发送时丢失: 生产者发送的消息未送达 exchange消息到达 exchange 后未到达 queue MQ 宕机,queue将消息丢失consumer 接收到消息后未消费…...

Java初识泛型

目录 一、包装类 1、基本数据类型和对应的包装类 2、装箱和拆箱 3、自动装箱和自动拆箱 二、什么是泛型 三、引出泛型 1、泛型的语法 四、泛型类的使用 1、语法 2、示例 3、类型推导(Type Inference) 六、泛型如何编译的 1、擦除机制 2、为什么不能实例化泛型类…...

寸照换底色技巧大全,超详细图文教程

在日常的设计工作中,我们常常需要将图片的背景色进行修改,以适应不同的场景和需求。其中最常用的方法就是寸照换底色技巧。本文将为大家介绍一些常见的寸照换底色技巧,并提供超详细的图文教程,帮助大家轻松完成这项任务。 一、使…...

这篇文章价值很大:股票历史分时成交数据怎么简单获取?【干货】

文章目录前言一、准备二、使用步骤1.引入库2,使用这个API查询历史分时数据:3.查询完整历史分时数据4.其他查询方法参数格式:[(市场代码, 股票代码), ...]参数:市场代码, 股票代码, 文件名, 起始位置, 数量参数:市场代码…...

【入坑系列】TiDB 强制索引在不同库下不生效问题

文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...

LeetCode - 394. 字符串解码

题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

【论文笔记】若干矿井粉尘检测算法概述

总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时,遇到的一些问题总结一下 [参考文档]:https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现: 今天在看到这个教程的时候,在自己的电…...

Python网页自动化Selenium中文文档

1. 安装 1.1. 安装 Selenium Python bindings 提供了一个简单的API,让你使用Selenium WebDriver来编写功能/校验测试。 通过Selenium Python的API,你可以非常直观的使用Selenium WebDriver的所有功能。 Selenium Python bindings 使用非常简洁方便的A…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞,需构建多层防御体系,结合技术验证、存储隔离与权限控制: 🔒 一、基础防护层 前端校验(仅辅助) 通过JavaScript限制文件后缀名(白名单)和大小,提…...