SpringCloud学习(五)——Nacos配置管理

news2024/12/26 0:16:13

文章目录

  • 1. Nacos实现配置管理
  • 2. 微服务拉取配置
    • 2.1 拉取优先级
    • 2.2 导入依赖
    • 2.3 添加注解
    • 2.4 配置热更新
  • 3. 使用 @ConfigurationProperties
    • 3.1 使用注解
    • 3.2 测试
  • 4. 多环境共享配置
    • 4.1 添加依赖
    • 4.2 配置文件
    • 4.3 更改属性
    • 4.4 测试
    • 4.5 配置优先级

1. Nacos实现配置管理

当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。Nacos中也可以进行配置管理,即将配置写到Nacos当中。

点击配置列表的 + 进行配置文件的配置。
在这里插入图片描述
配置文件的列表如下所示:
在这里插入图片描述
上述的 Data ID 命名是 [服务名称]-[profile].后缀名 ,其中的 profile 为开发环境,开发环境有 dev,test,provided 等,表示其生效的阶段,注意,该字段不是命名空间, 然后在配置内容中写上需要配置的内容即可。

注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。

2. 微服务拉取配置

上面我们学习了怎么配置信息,但是,这个配置信息必须要给项目读取到才能发挥作用,那么,springboot的项目中怎么读取到我们写在Nacos中的配置信息呢?

2.1 拉取优先级

微服务的配置读取一般是如下图所示:
在这里插入图片描述
微服务首先读取Nacos配置文件中的配置,再读取application.yml中的配置,然后将两者的配置文件进行合并,这就会产生一个问题,既然application.yml是在Nacos之后读的,那么,微服务是怎么得到的Nacos配置文件的地址的呢?

SpringBoot加载时会有一个叫做 bootstrap.yml 的文件首先加载,其优先级比 application.yml大得多,所以我们可以重写这个文件,在这个文件中读取Nacos的配置文件信息。

但是在springboot 2.4.x版本以后,就已经移除了 bootstrap.yml 的配置,想要使用 bootstrap.yml 文件就必须引入相应的依赖,而且逐个写上配置的方法太过麻烦,这里我们演示一下使用Nacos的注解来读取Nacos中的配置文件。

而且在这一步中,非常重要的就是版本问题,必须保证SpringBoot、SpringCloudAlibaba、SpringCloud、Nacos的版本能够兼容,在这里,我使用的版本如下:

SpringBootSpringCloudAlibabaSpringCloudNacos
2.3.2.RELEASE2.2.6.RELEASEHoxton.SR91.4.4

我们以在 user-service 中配置为例,假设我们在Nacos配置的信息内容为:

pattern:
  dateformat: MM-dd HH:mm:ss:SSS

2.2 导入依赖

在user-service服务中,引入nacos注解需要的依赖:

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>nacos-config-spring-boot-starter</artifactId>
    <version>0.2.5</version>
</dependency>

2.3 添加注解

首先在启动类上面添加注解 @NacosPropertySource,写明 dataID ,这里的 dataID 就是在Nacos中写的配置文件的名称,注意,是全部名称,包含后缀名,比如上面我在Nacos中的配置文件名称是 userservice-dev.yaml ,那么这里也写上 dataId = "userservice-dev.yaml" ,示例如下:

@NacosPropertySource(dataId = "userservice-dev.yaml", autoRefreshed = true)
@MapperScan("cn.itcast.user.mapper")
@SpringBootApplication
public class UserApplication {
    public static void main(String[] args) {
        SpringApplication.run(UserApplication.class, args);
    }
}

第一行即是我们添加的Nacos的注解。

然后,在需要使用到Nacos中配置文件的信息上面添加注解 @NacosValue 读取信息即可,示例如下,

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @NacosValue(value = "${pattern.dateformat}", autoRefreshed = true)
    private String dateformat;

    @GetMapping("now")
    public String now(){
        System.out.println(dateformat);
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(dateformat));
    }
}

例如上面的示例,注入Nacos配置文件中的 pattern.dateformat 内容,即可获取相对应的配置文件的信息。

2.4 配置热更新

至于添加的两个注解 @NacosPropertySource, @NacosValue 都添加了一个 autoRefreshed = true 的字段,那是指定配置信息可以进行热更新的字段,配置了这个属性之后,如果在Nacos中修改配置信息,提交修改后,再刷新一下网页,其能够将修改的信息立刻返回到修改的网页上,而不需要重新启动项目。

比如将上述在Nacos中的配置信息修该为

pattern:
  dateformat: yyyy年MM月dd日 HH:mm:ss:SSS

然后提交修改后再刷新一次网页,修改的内容就会马上呈现在网页上。

3. 使用 @ConfigurationProperties

当然,还有一种获取配置信息的方式就是将配置信息注入到一个写好的类中,使用的注解时 @ConfigurationProperties ,在Nacos中也提供了一个注解 @NacosConfigurationProperties ,其可以实现与 @ConfigurationProperties 相似的作用,但是其注入的配置信息时Nacos中的配置信息,我们仍以上面的例子为例。

3.1 使用注解

创建一个 MyProperty 的类,在类中定义我们指定的日期的格式的字符串,该类的格式如下:

@Data
@NacosConfigurationProperties(dataId = "userservice-dev.yaml", prefix = "pattern", autoRefreshed = true)
@Component
public class MyProperty {
    private String dateformat;
}

其中,使用了 @NacosConfigurationProperties 指定了注入的配置信息所在的文件,也就是 dataId 属性,也指定了该信息可以热更新,也就是 autoRefreshed 属性。

3.2 测试

使用注入的信息测试如下:

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private MyProperty myProperty;

    @GetMapping("now")
    public String now(){
        System.out.println(myProperty.getDateformat());
        return LocalDateTime.now().format(DateTimeFormatter.ofPattern(myProperty.getDateformat()));
    }
}

4. 多环境共享配置

微服务在启动时会从nacos读取多个配置文件:

  • 首先会读取 [spring.application.name]-[spring.profiles.active].yaml ,如 userservice-dev.yaml, userservice-test.yaml 等,
  • 然后还会读取 [spring.application.name].yaml ,如 userservice.yaml ,如果没有则不进行读取

所以,不管环境怎么变,微服务都会对 [spring.application.name].yaml 文件进行读取,故我们可以将在开发过程中不管是 dev,prod 还是 test 都会用到的环境信息放到一个名为 userservice.yaml 的文件中。

注意,注解模式下无法进行多环境共享配置,所以以下演示时我们使用另一种配置方式,在 bootstrap.yml 文件中进行配置,故请先清除Nacos注解再进行以下配置。

例如,我们在Nacos创建一个名为 userservice.yaml 的文件,该文件中的内容如下:

pattern:
  envShare: 环境的共享值

4.1 添加依赖

在springboot中想要使用 bootstrap 文件,则必须引入如下依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.1.3</version>
</dependency>

4.2 配置文件

然后New一个名为 bootstrap.yml 的文件,其层级与 application.yml 相同,其中配置的内容如下:

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev
  cloud:
    nacos:
      server-addr: localhost:8848 # Nacos地址
      config:
        file-extension: yaml # 文件后缀名

4.3 更改属性

因为我们需要的是既读取 userservice-dev.yaml 中的内容,又读取 userservice.yaml 中的内容,所以,我们的注入类就不能只有 dateformat 一个属性了,还需要增加一个读取了 userservice.yaml 中的 envShare 属性,即将 MyProperty 类增加一个属性,修改如下:

@Data
@ConfigurationProperties(prefix = "pattern")
@Component
public class MyProperty {
    private String dateformat;
    private String envShare;
}

4.4 测试

对注入的配置信息中的属性进行测试如下,

@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {

    @Autowired
    private MyProperty myProperty;
    
    @GetMapping("now")
    public String now(){
        System.out.println(myProperty.getDateformat());
        return myProperty.toString();
    }
}

打印的内容输出如下
在这里插入图片描述
可以看到,我们没有在 userservice-dev.yaml 中写上 envShare 属性,只在 userservice.yaml 中写了 envShare 属性,但还是可以读取到该属性的值,这就证明了多环境共享。

4.5 配置优先级

引入了多环境的共享配置后,我们可能起效果的配置文件就达到了三种,一个是当前开发模式下的配置文件,一个是共享配置文件,一个是本地的配置文件,那么这三种的优先级是怎样的呢?
在这里插入图片描述
其优先级如上面所示,当前开发模式下的配置文件 > 共享配置文件 > 本地配置文件,所以,如果在这三个文件中出现了一个三个文件中都有的配置信息,那么,起效的肯定是当前开发模式下的配置文件。

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

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

相关文章

【测试面试】吐血整理,大厂测试开发岗面试题(1~4面),拿下年40w...

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 自动化测试面试题&am…

scConverter 文档转换 DLL / SDK 2023.3.21 Crack

scConverter 转换 DLL / SDK scConverter 是一个DLL&#xff0c;可以将PDF、DWF、Gerber、CGM、TIFF、CALS、PLT、PNG和JPEG文件转换为大量输出格式。可用的输出格式列表包括Adob​​e PDF、PDF/A、DXF、DWF、CALS、TIFF、PLT和PNG。您将在下面找到所有可用输入和输出格式的完整…

计算机算法设计与分析(第5版)PDF

《计算机算法设计与分析&#xff08;第5版&#xff09;》是2018年电子工业出版社出版的图书&#xff0c;作者是王晓东。 整本书的结构是&#xff1a;先介绍算法设计策略思想&#xff0c;然后从解决经典算法问题来学习&#xff0c;通过实践的方式去学习算法。 网络上许多的算法…

天梯赛-模拟赛-4.16

L2-041 插松枝 人造松枝加工场的工人需要将各种尺寸的塑料松针插到松枝干上&#xff0c;做成大大小小的松枝。他们的工作流程&#xff08;并不&#xff09;是这样的&#xff1a; 每人手边有一只小盒子&#xff0c;初始状态为空。 每人面前有用不完的松枝干和一个推送器&#x…

【鸿蒙应用ArkTS开发系列】- Web组件使用讲解

目录 一、Web组件介绍 二、创建组件 权限列表 三、设置样式和属性 四、添加事件和方法 五、访问本地Html 1、本地html文件创建 2、本地html文件加载 2、JS对象注入&#xff0c;Html使用JS对象调用客户端方法 3、客户端调用本地Html网页中的JS方法 使用鸿蒙的ArkUI框架…

Lesson 10.1 超参数优化与枚举网格的理论极限和随机网格搜索 RandomSearchCV

文章目录一、超参数优化与枚举网格的理论极限1. 超参数优化 HPO&#xff08;HyperParameter Optimization&#xff09;2. 网格搜索的理论极限与缺点3. 建立 benchmark&#xff1a;随机森林中枚举网格搜索的结果二、随机网格搜索 RandomizedSearchCV1. 基本原理2. 随机网格搜索的…

使用chatgpt实现微信聊天小程序(秒回复),github开源(附带链接)

文章目录前言效果展示原理说明服务器端代码说明微信小程序代码说明代码链接总结前言 我在前一段时间突发奇想&#xff0c;就使用java来调用chatgpt的接口&#xff0c;然后写了一个简单小程序&#xff0c;也上了热榜第一&#xff0c;java调用chatgpt接口&#xff0c;实现专属于…

select 排序qsort排序

目录 1.希尔排序的时间复杂度 3.有技巧的选择排序&#xff1a;堆排序 4.排序的种类 5.直接插入排序和冒泡排序 6.快速排序 7.希尔排序 堆排序 和快排的区别 8.为什么相遇位置一定比key小 9.快排的优化 11.快排递归写法的不足 12.快排的非递归解法 1.希尔排序的时间复杂…

C++11新特性(上)

357089 文章目录1. 统一的列表初始化1.1 &#xff5b;&#xff5d;初始化1.2 std::initializer_list2. decltype3. 右值引用和移动语义3.1 左值引用和右值引用3.2 左值引用与右值引用比较3.3 右值引用使用场景和意义3.4 右值引用引用左值及更深入的使用场景3.5 完美转发4. 新的…

“编程式 WebSocket” 实现简易 online QQ在线聊天项目

目录 一、需求分析与演示 1.1、需求分析 1.2、效果演示 二、客户端、服务器开发 2.1、客户端开发 2.2、服务器开发 一、需求分析与演示 1.1、需求分析 需求&#xff1a;实现一个 online QQ在线聊天项目&#xff0c;当用户登录上自己的账号后&#xff0c;将会显示在线&…

我用nodejs和electron实现了一个简单的聊天软件-----chat 开源

翎&#x1f3a5;项目演示地址 &#x1f517;https://www.bilibili.com/video/BV1Fg4y1u76d/ 希望观众老爷给个免费的三连支持一下新人up主 ♻️项目基本介绍 翎是基于electron(vue2)和nodejs实现的简单聊天软件,其中用websocket和http进行通讯传递,数据库使用了mysql数据库,…

二进制插入与查找组成一个偶数最接近的两个素数

二进制插入 链接&#xff1a;二进制插入_牛客题霸_牛客网 (nowcoder.com) 描述&#xff1a;给定两个32位整数n和m&#xff0c;同时给定i和j&#xff0c;将m的二进制数位插入到n的二进制的第j到第i位,保证n的第j到第i位均为零&#xff0c;且m的二进制位数小于等于i-j1&#xff…

Qt Quick - Popup

Qt Quick - Popup使用总结一、概述二、Popup 的布局三、弹出分级四、弹出定位五、定制化一、概述 Popup是类似弹出式用户界面控件的基本类型。它可以与Window或ApplicationWindow一起使用。 import QtQuick.Window 2.2import QtQuick.Controls 2.12ApplicationWindow {id: win…

力推美团企业版 美团究竟意欲何为?

已经拥有930万活跃商家的美团公司&#xff0c;正在充分整合自身的“供应链”优势&#xff0c;冲向B端市场。 3月31日&#xff0c;据36氪消息显示&#xff0c;美团将于近期正式上线面向To B市场的业务“美团企业版”&#xff0c;定位企业消费赛道。美团企业版会为企业客户提供消…

ZeroTier 内网穿透

ZeroTier 内网穿透 官网注册账号&#xff0c;创建自己的局域网段, 登录官网 创建网络&#xff1a; 点击创建好的网络&#xff0c;进入设置界面进行设置, 选择 public 模式,点击入设置页面 地址随便选择 说明没有设备链接 下载客户端 &#xff0c;下载 安装客户端&#xf…

高级数据结构与算法 | 三元搜索树(Ternary Search Tree)

文章目录TernarySearchTree基本概念介绍原理插入查找删除代码实现TernarySearchTree 基本概念 介绍 Ternary Search Tree&#xff08;三元搜索树&#xff09;&#xff0c;它是由 Bentley 和 Sedgewick 在 1997 年提出的一种基于 Trie 的思想改良的一种数据结构&#xff0c;其…

【GCU体验】基于PyTorch + GCU跑通ResNet50模型并测试GCU性能

一、环境 地址&#xff1a;启智社区:https://openi.pcl.ac.cn/ 二、计算卡介绍 云燧T20是基于邃思2.0芯片打造的面向数据中心的第二代人工智能训练加速卡&#xff0c;具有模型覆盖面广、性能强、软件生态开放等特点&#xff0c;可支持多种人工智能训练场景。同时具备灵活的可…

win10 64位 环境下安装CUDA 11.8和 cuDNN v8.6.0

win10 64位 环境下安装CUDA 11.8和 cuDNN v8.6.0 1 安装 NVIDIA 显卡驱动程序 下载地址&#xff1a;http://www.nvidia.cn/Download/index.aspx?langcn ​​​​​​ 下载文件&#xff1a;531.41-desktop-win10-win11-64bit-international-nsd-dch-whql 选择适合自己电脑的显…

DeepFM论文翻译

1.摘要 为了最大化推荐系统的CTR&#xff0c;学习用户行为的复杂交叉特征很关键。 尽管有很大进步&#xff0c;现有的方法无论对低阶还是高阶的交叉特征&#xff0c;似乎还是有很强的bias, 或者需要专门的特征工程。 本文&#xff0c;我们证明了得出一个能强化高阶和低阶交叉特…

前端实现自动化测试

什么是前端测试 我们经常说的单元测试其实只是前端测试的一种。前端测试分为单元测试&#xff0c;UI 测试&#xff0c;集成测试和端到端测试。 ● 单元测试&#xff1a;是指对软件中的最小可测试单元进行检查和验证&#xff0c;通常指的是独立测试单个函数。 ● UI 测试&#…