Nacos配置中心、配置热更新、及配置共享的记录

news2024/11/19 15:22:22

Nacos除了提供了注册中心的功能,同样也提供了配置中心的功能,用于管理一些叫常改动的配置

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

Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新

下面我们就来使用Nacos配置一下服务的(部分)配置文件

这里说部分还是因为在上面说的我们不会把所有的信息都配置到服务中, 只是把一些常修改的配置单独提出来

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

1. 在Nacos里添加配置文件

步骤1 添加配置:

在nacos主界面的配置列表中点击加号

在这里插入图片描述

然后在弹出的表单中,填写配置信息:

ID配置规则: 服务名-配置类型.后缀

分组默认即可

在这里插入图片描述

步骤2 从微服务拉取配置

上面我们只是在Nacos中创建了配置文件,但是在真实的微服务项目中还没有使用,此时需要在服务中拉取对应的配置

微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。

但如果尚未读取application.yml,又如何得知nacos地址呢?

此时要做的就是将我们的配置和服务中的配置一并生效

因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:

在这里插入图片描述

此时就可以读取到我们在Nacos中配置的文件

  1. 引入nacos-config依赖

在user-service服务中,引入nacos-config的客户端依赖:

<!--nacos配置管理依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <!-- 像这种通用的版本配置我们一般交给父工程管理,这里我先加上 -->
    <version>2.2.6.RELEASE</version>  
</dependency>
  1. 添加bootstrap.yaml

然后,在user-service的resources目录添加一个bootstrap.yaml文件,内容如下:

spring:
  application:
    name: userservice # 服务名称
  profiles:
    active: dev #开发环境,这里是dev 
  cloud:
    nacos:
      server-addr: 127.0.0.1:80 # Nacos地址 因为我配置了Nacos集群环境这里我就写我的Nginx地址
      config:
        file-extension: yaml # 文件后缀名

这里会根据spring.cloud.nacos.server-addr获取nacos地址,再根据

${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}作为文件id,来读取配置。

本例中,就是去读取user-service-dev.yaml

在这里插入图片描述

此时就可以读取在Nacos配置中心配置的配置项

  1. 读取nacos配置

在user-service中的UserController中添加业务逻辑,读取pattern.dateformat配置:

使用@Value注解,再使用$表达式,指定对应的配置,即可注入获取到具体的值,后面就可以使用读取到的内容了

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

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")   // 读取配置
    private String dateformat;
    
    @GetMapping("/now")
    public String now(){
         return new SimpleDateFormat(dateformat).format(new Date())
    }
    // ...略
}

在页面访问,可以看到效果:

在这里插入图片描述

2. 配置热更新

所谓的热更新就是在修改nacos中的配置后,微服务中无需重启即可让配置生效,也就是配置热更新

要实现配置热更新,可以使用两种方式:

方式一 通过@Value注解+ @RefreshScope注解

注解看刚才的代码

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

    @Autowired
    private UserService userService;

    @Value("${pattern.dateformat}")   // 读取配置
    private String dateformat;
    
    @GetMapping("/now")
    public String now(){
         return new SimpleDateFormat(dateformat).format(new Date())
    }
    // ...略
}

此时当Nacos配置文件中的pattern.dateformat发生对应的@Value读取到的数据也会更改

方式二 使用@ConfigurationProperties

这个注解可能在之前用过,作用时批量的读取配置信息,而在这里@ConfigurationProperties注解天然支持配置文件的热更新

在user-service服务中,添加一个类,读取patterrn.dateformat属性:

package cn.itcast.user.config;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

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

在UserController中使用这个类代替@Value:

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

    @Autowired
    private UserService userService;

    // 注入配置类
    @Autowired
    private PatternProperties patternProperties;

    @GetMapping("/now")
    public String now(){
        return new SimpleDateFormat(patternProperties.getDateformat()).format(new Date())
    }
}

这两种方式都可以实现当Nacos中的配置文件更新时,对应的读取配置的地方也做相应的更新

那么什么时候使用第一种什么时候使用第二种热更新方式呢?

对于第一种我们会发现很方便, 直接在对相应的成员变量和类上添加对应的注解即可.但是不好的地方是如果有多个配置需要读取时, 我们就需要写一大~~~~堆,此时在这种方式就很麻烦,而此时使用第二种方式就很好, 自动的一次性赋值

总结: 当少于两个配置的时候使用第一种方式, 当大于两个使用第二种方式进行配置的热更新

3. 配置共享

其实微服务启动时,会去nacos读取多个配置文件,例如:

  • [spring.application.name]-[spring.profiles.active].yaml,例如:user-service-dev.yaml

  • [spring.application.name].yaml,例如:user-service.yaml

[spring.application.name].yaml不包含环境,因此可以被多个环境共享。

那下面我们我们就对其做一个测试,

  1. 在Nacos中添加一个共享的配置

    我们在nacos中添加一个user-service.yaml文件:

在这里插入图片描述

  1. 在user-service中读取共享配置

    这里使用热更新的方式一

@Slf4j
@RestController
@RefreshScope
@RequestMapping("/user")
public class UserController {    
    
    // 公共配置
	@Value("${commons.message}")
    private String message;
    
	// 独有的配置
    @Value("${pattern.format}")
    private String pattern;

    @GetMapping("/show")
    public String showMessage() {
        return new SimpleDateFormat(pattern).format(new Date()) + message;
    }
}

此时访问可以看到已经读取到了公共的配置

在这里插入图片描述

此时创建一个user-service示例,作为test实例,修改其配置文件

然后右键当前拷贝后的配置,编辑当前的配置

在这里插入图片描述

操作如下: 修改端口

在这里插入图片描述

在这里插入图片描述

可以看到这里有一个Active profiles的配置, 因为我们较常修改这些配置,所以idea就给提出来了,他对应的就是我们在配置文件中配置的配置项,来指定当前的实例是dev还是test

在这里插入图片描述

此时就会多一个为test版的服务实例,我们在Nacos创建对应的配置文件

在这里插入图片描述

这里日期的格式化故意和dev环境区别

此时运行项目访问两个user-service服务查看结果

在这里插入图片描述

共享信息都读取到了,测试成功

配置文件优先级问题

我们回顾一下,我们的配置可以在本地配置,可以在共享配置中配置也可以在nacos对应配置文件中配置,那么谁的优先级更高呢?即当同时又一个配置时谁生效呢? 优先级如下:

在这里插入图片描述

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

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

相关文章

计算时间复杂度详解

1&#xff0c;前置知识 我们在计算时间复杂度之前的前置知识是等差数列的通项公式和求和公式以及等比数 列的通项公式和求和公式 等差数列&#xff1a; 通项公式&#xff1a;ana1(n-1)d&#xff08;d是公差&#xff09; 求和公式&#xff1a;Snn(a1an)/2 等比数列&#xf…

【Python入门知识】NumPy数组拆分,超详细讲解

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 今天我们来学习python中NumPy数组的拆分 拆分 NumPy 数组 拆分是连接的反向操作。 连接&#xff08;Joining&#xff09;是将多个数组合并为一个&#xff0c;拆分&#xff08;Spliting&#xff09;将一个数组拆分为多个。…

Mysql 学习(七)独立表结构存储 二

段的结构 上一节说过表空间分为各个段&#xff0c;每个段里面又是以区为单位&#xff0c;每个区则有64个页。区根据剩余存储空间分为&#xff1a;Free&#xff0c;FREE_FRAG&#xff0c;FULL_FRAG 三种类型&#xff0c;为了方便管理区&#xff0c;给每个区创建XDES Entry结构&…

【校招VIP】用户反驳:你说大厂校招不会问框架实战,现在就有问的了,打脸了吧?一看是专业技能给自己挖的坑

最近有个用户过来质疑&#xff0c;不是说大厂不考框架的使用吗&#xff1f; 但网上的这两份面经里&#xff0c;却问到关于SpringBoot的问题。 接着发来了相对应的简历&#xff0c;一看&#xff0c;直接真相大白&#xff1a; 他在专业技能这栏写了&#xff1a;我熟练掌握Sprin…

flink内存参数配置学习

直接上官网 配置 JobManager 内存 | Apache Flink配置 JobManager 内存 # JobManager 是 Flink 集群的控制单元。 它由三种不同的组件组成&#xff1a;ResourceManager、Dispatcher 和每个正在运行作业的 JobMaster。 本篇文档将介绍 JobManager 内存在整体上以及细粒度…

自动驾驶中地图匹配定位技术总结

引言 汽车定位是让自动驾驶汽车知道自身确切位置的技术&#xff0c;在自动驾驶系统中担负着相当重要的职责。汽车定位涉及多种传感器类型和相关技术&#xff0c;主要可分为卫星定位、惯性导航定位、地图匹配定位以及多传感器融合定位几大类。其中地图匹配定位技术利用道路物理…

CSS绝对定位、相对定位

目录 静态定位 - static 相对定位 - relative 绝对定位 - absolute 固定定位 - fixed z-index属性&#xff1a; 在CSS中定位有以下4种&#xff1a; 静态定位 - static相对定位 - relative绝对定位 - absolute 固定定位 - fixed 静态定位 - static 静态定位是css中的默认定…

网络机顶盒哪个牌子好?资深数码粉分享网络电视机顶盒排名

智能电视配置跟不上经常死机卡顿&#xff0c;但显示正常的情况下不想花钱换电视机怎么办&#xff1f;一台网络机顶盒就可以解决你的烦恼&#xff0c;安装上网络机顶盒以后就可以让旧电视新生&#xff0c;那么你知道网络机顶盒哪个牌子好吗&#xff1f;如果不懂这行&#xff0c;…

【自然语言处理 | Transformer】Transformer:Attention is All You Need论文讲解

Transformer由论文《Attention is All You Need》提出&#xff1a; 论文地址为&#xff1a; https://arxiv.org/pdf/1706.03762.pdf文章目录 一、Transformer 整体结构二、Transformer 的输入2.1 单词 Embedding2.2 位置 Embedding 三、Self-Attention&#xff08;自注意力机制…

.net7 通过 JsonTranscoding 实现 gRPC 与 Web API 一鱼两吃

目标 在一个网站内&#xff0c;用一套proto即提供gPRC 调用&#xff0c;又提供 Web API 调用。 实现方法 根据微软官方James Newton King&#xff08;Newtonsoft.json 作者&#xff09;的文章&#xff0c;.net7 里面提供了 JsonTranscoding 特性&#xff0c;只需要三步&#x…

听我一句劝,别去外包,干了6年,废了....

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了6年的功能测试&…

NANK OE骨传导开放式蓝牙耳机发布,极致体验拉满!

近日&#xff0c;中国专业音频品牌NANK南卡发布了全新一代——骨传导开放式蓝牙耳机NANK OE&#xff0c;耳机采用了传统真无线和骨传导的结合方式&#xff0c;带来更加舒适的佩戴体验和音质升级&#xff0c;同时还支持单双耳自由切换&#xff0c;全新的设计收获了市场的喜爱和认…

SignOff Criteria——POCV(Parametric OCV) introduction

文章目录 1. O v e r v i e w Overview Overview2. P O C V A n a l y s i s POCV\ Analysis POCV Analysis3. P O C V F l o w POCV\ Flow POCV Flow4. P O C V R e p o r t POCV\ Report POCV Report 1. O v e r v i e w Overview Overview P r o c e s s v a r i a t i…

数据发送流程

在发送模式下&#xff0c;UART 的串行数据发送电路主要包括一个发送移位寄存器(TSR)&#xff0c;TSR 功能是将数据 逐个移位送出。待发数据必须先写到发送缓冲区中。 TXIFx 是发送中断标志位&#xff0c;可配置为发送缓冲区空或TSR 空。 数据的发送支持7bit 、8bit 或9bit 数据…

JavaScript原型链污染学习记录

1.JS原型和继承机制 0> 原型及其搜索机制 NodeJS原型机制&#xff0c;比较官方的定义&#xff1a; 我们创建的每个函数都有一个 prototype&#xff08;原型&#xff09;属性&#xff0c;这个属性是一个指针&#xff0c;指向一个对象&#xff0c; 而这个对象的用途是包含可…

为什么用Selenium做自动化测试,你真的知道吗?

目录 手工测试的问题 为什么用自动化 选择合适的测试方式 什么时候引入自动化测试 以Jmeter为代表的测试工具 编程能力既重要又不重要 为什么是Selenium 没有最好的技术&#xff0c;只有合适的技术 web自动化测试效率不高 手工测试的问题 手工操作点点点借助的是人脑的…

知识变现海哥|这3种课程定价最容易爆单

这3种课程定价最容易爆单 一门课怎么才能卖到100万&#xff0c;定价很关键。我卖了160万的课&#xff0c;总结了3种课程定价&#xff0c;组合起来最容易爆单&#xff01;引流课定价0、1、9.9、19.9一般讲3天结束&#xff0c;用低价吸引大量潜在学员 信任课定价99、699、999等…

C++—非递归【循环】遍历二叉树(前序,中序,后序)思路讲解+代码实现

非递归遍历二叉树 前序中序后序 接下来我们在研究如何使用循环实现遍历二叉树时&#xff0c;以下面的二叉树为例&#xff1a; 在下文的讲解中&#xff0c;不对如何构建这颗二叉树做讲解&#xff0c;直接给出代码&#xff0c;如果有不懂的地方欢迎私信我。 文章中的完整源代码链…

一篇文章搞定《Android内存泄漏》

------《Android内存泄漏》 什么是内存泄漏常见的内存泄漏以及规避方式单例模式引用Activity非静态内部类注册的反注册定时器TimerWebView的内存泄漏资源未关闭属性动画 怎么定位内存泄漏LeakCanary接入&#xff1a;使用&#xff1a;检测&#xff1a; Android Proflier开始检测…

Linux驱动编程(分层分离编程思想)

1、面向对象 ⚫ 字符设备驱动程序抽象出一个 file_operations 结构体&#xff1b; ⚫ 我们写的程序针对硬件部分抽象出 led_operations 结构体。 2、分层 上层实现硬件无关的操作&#xff0c;比如注册字符设备驱动&#xff1a;leddrv.c 下层实现硬件相关的操作&#xff0c;比如…