我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Spring Cloud Alibaba Nacos Config进阶使用

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Spring Cloud Alibaba Nacos Config进阶使用

一、SpringBoot 使用 Nacos Config 实现多环境切换

1. 现象

在日常开发过程中,对于同一个服务或者项目工程在不同的环境所需要的配置是不同的。如访问数据库、redis或者MQ其他中间件,往往需要进行环境隔离,如果每次部署都需要去修改配置文件的话,是十分不方面的。在微服务场景下,这个问题尤为突出,因为代码工程的数量是传统单项目的几十倍。需要建筑一些组件,在不修改配置稳健的前提下动态的切换运行环境。Nacos Config提供了类似的解决方案。

在这里插入图片描述

2. 引入依赖

在pom文件中添加Nacos Config的依赖包,注意版本


    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.3.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--服务注册发现-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <!--spring-cloud-alibaba 版本控制-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.6.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

3. 添加bootstrap.yaml配置文件


spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      config:
        file-extension: yaml # 表示支持扩展的文件名
  application:
    name: nacos-config # 表示当前微服务需要向配置中心索要nacos-config的配置
  profiles:
    active: prod # 表示我需要向配置中心索要生产环境的配置

4. 配置对应关系图

在Nacos Config 配置管理中新增配置如图以及其对应关系如下:

在这里插入图片描述

5. 文件格式简述

索要文件的格式为${application.name}-spring。profiles.active.{file-extension}
体现在nacos中,对应尚曼的格式Data id得知应该是nacos-config-prod.yaml

6. 启动nacos

官网:
https://nacos.io/zh-cn/docs/quick-start.html


# 启动命令(standalone代表着单机模式运行,非集群模式):
# linux
sh startup.sh -m standalone

# Windows
startup.cmd -m standalone

在这里插入图片描述

http://localhost:8848/nacos/
账号/密码:nacos/nacos

在这里插入图片描述

7. 添加生产配置

标签 说明
Data ID nacos-config-prod.yaml
Group DEFAULT_GROUP 默认,可以自定义
描述 简述生产环境配置
配置格式 yaml 文件扩展名选择
配置内容 nacosProd: Production environment configuration 和配置yml文件格式语法一样

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

8. 添加测试controller


package com.gblfy.alibab.nacosconfig.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class NacosConfigController {


    @Value("${nacosProd}")
    private String nacosProd;

    @GetMapping("/nacosProd")
    public String getNacosProd() {
        return nacosProd;
    }

}

9. 启动Springboot工程并观察到如下日志则为成功

在这里插入图片描述

10. 浏览器验证

打开浏览器访问http://localhost:8080/nacosProd验证测试结果结果如图:

在这里插入图片描述

11. 调整激活环境

修改bootstrap.yaml文件中激活环境调整为test环境spring.profiles.active.test


spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      config:
        file-extension: yaml # 表示支持扩展的文件名
  application:
    name: nacos-config # 表示当前微服务需要向配置中心索要nacos-config的配置
  profiles:
    active: test  # 表示我需要向配置中心索要生产环境的配置

12. 新建test环境配置

在nacos中新建data_id为nacos-config-test.yaml,并添加相同的配置参数,把环境参数的内容调整为test测试环境的

在这里插入图片描述

13. test配置关系图

在这里插入图片描述

14. 测试方法

添加test测试环境方法,把刚才生产的方法注释掉,因为咱们现在激活的是test测试环境的配置


 //    @Value("${nacosProd}")
//    private String nacosProd;
//
//    @GetMapping("/nacosProd")
//    public String getNacosProd() {
//        return nacosProd;
//    }

    @Value("${nacosTest}")
    private String nacosTest;

    @GetMapping("/nacosTest")
    public String getNacosTest() {
        return nacosTest;
    }

15. 重启springboot服务,监控控制台输出

在这里插入图片描述

16. 浏览器验证

打开浏览器访问http://localhost:8080/nacosTest验证测试结果结果如图:

在这里插入图片描述

17. 配置修改实时生效

在修改nacos中修改配置实时生效测试
修改前配置:

在这里插入图片描述

修改后配置:

在这里插入图片描述

发布规则

在这里插入图片描述

不停止项目服务,打开浏览器访问http://localhost:8080/nacosTest验证测试结果结果如图:

在这里插入图片描述

其他环境同上这里就不一一验证了。

18. 不同环境配置动态切换如何实现?

这里演示修改配置文件,到正式环境,激活那个环境配置是在命令脚本中配置好的
会采用下面这种方式激活环境配置,这个命令配置环境的优先级比项目中的配置文件中的优先级高


java -jar xxx.jar -Dspring.profiles.active=test

二、如何解决不同环境相同配置的问题

在这里插入图片描述

2.1. 现象

在实际的开发过程中,我们的工程项目所用到的配置参数大多数并不需要根据不同的环境进行区分,生产、测试、开发环境所用到的参数值是相同的。如何解决同一服务在多环境中,引用相同配置的问题呢?Nacos Config也提供了相应的解决方案。

在这里插入图片描述

2.2. 添加配置

在Nacos Config中添加配置,data_id为nacos-config.yaml,如图所示:

在这里插入图片描述

2.3. 增加测试方法

在NacosConfigController类中添加读取项目中共有相同配置的方法进行测试


//    @Value("${nacosProd}")
//    private String nacosProd;
//
//    @GetMapping("/nacosProd")
//    public String getNacosProd() {
//        return nacosProd;
//    }

    @Value("${nacosTest}")
    private String nacosTest;

    @GetMapping("/nacosTest")
    public String getNacosTest() {
        return nacosTest;
    }
    @Value("${nacosCommon}")
    private String nacosCommon;

    @GetMapping("/nacosCommon")
    public String getNacosCommon() {
        return nacosCommon;
    }

2.4. 重新启动项目,观察控制台

在这里插入图片描述

2.5. 浏览器验证

打开浏览器访问http://localhost:8080/nacosTest验证测试结果结果如图:

在这里插入图片描述

打开浏览器访问http://localhost:8080/nacosCommon验证测试结果结果如图:

在这里插入图片描述

从上面测试可以看出,访问test环境独有的配置可以正常访问。访问项目中共有相同的配置也正常。
此时,我们已经在nacos中配置了3个配置文件,nacos-config-prod.yaml、nacos-config-test.yaml和nacos-config.yaml
在这里插入图片描述

三、如果同一个配置项在三个配置文件中都存在且值不同,最终项目读取是哪个呢?

3.1. 验证思路

在这里插入图片描述

验证这个其实很简单,只需要在环境独有的配置中配置共有相同配置文件中相同的配置标签让他值不一样,浏览器访问不就知道了,对吧?
这样,演示在nacos-config-test.yaml文件中配置nacos-config.yaml文件中nacosCommon标签,给他赋予不同的值进行测试。

3.2. 添加相同配置

nacos-config.yaml文件中原配置:

在这里插入图片描述

nacos-config-test.yaml文件中配置nacosCommon标签值为
添加相同配置
在测试配置中添加与公用配置一样的标签属性值不同,观察谁的配置生效即可


nacosTest: Test environment configuration v2
nacosCommon: Common Environment Configuration 测试配置文件中,配置相同属性值不同的测试案例

在这里插入图片描述

规则发布

在这里插入图片描述

3.3. 浏览器验证

打开浏览器访问http://localhost:8080/nacosCommon验证测试结果结果如图:

在这里插入图片描述

实际读取的配置信息是从nacos-config-test.yaml文件中读取的。
结论:如果配置了spring.profiles.active,则优先获取nacos-config-{spring.profiles.active}.yaml中的值。

四、不同微服务之间相同配置如何共享

在这里插入图片描述

在这里插入图片描述

4.1. 解决方案简述

像这种共有中间件的配置信息企业会采用单独的配置文件来维护,Nacos Config为我们提供了二种配置方式来解决此类场景的问题,分别是extension-configs和shard-configs配置方式。

4.2. 通过shard-configs配置方式

在nacos中新建redis.yaml,添加配置信息,reidsip:127.0.0.1,然后,配置信息发布生效

在这里插入图片描述

修改项目的bootstrap.yaml的配置文件,添加配置spring.cloud.nacos.config.shared-configs[0]


spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      config:
        file-extension: yaml # 表示支持扩展的文件名
        shared-configs[0]:
          data_id: redis.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
          #group: # 可以不写 默认DEFAULT_GROUP
  application:
    name: nacos-config # 表示当前微服务需要向配置中心索要nacos-config的配置
  profiles:
    active: test  # 表示我需要向配置中心索要生产环境的配置

在这里插入图片描述

在这里插入图片描述

添加测试方法


 @Value("${redisip}")
    private String redisip;

    @GetMapping("/redisip")
    public String getredisip() {
        return redisip;
    }

打开浏览器访问http://localhost:8080/redisip验证测试结果结果如图:

http://localhost:8080/redisip

在这里插入图片描述

4.3. 如何添加多个shared-configs配置呢?

在nacos中新建mq.yaml,添加配置信息mqip: 127.0.0.2

在这里插入图片描述

修改项目的bootstrap.yaml问阿金,并添加shared-configs[1]:配置,具体配置线如下:


spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      config:
        file-extension: yaml # 表示支持扩展的文件名
        shared-configs[0]:
          data_id: redis.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
          #group: # 可以不写 默认DEFAULT_GROUP
        shared-configs[1]:
          data_id: mq.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
          #group: # 可以不写 默认DEFAULT_GROUP
  application:
    name: nacos-config # 表示当前微服务需要向配置中心索要nacos-config的配置
  profiles:
    active: test  # 表示我需要向配置中心索要生产环境的配置

新增一个获取mq信息的url以及方法


package com.gblfy.alibab.nacosconfig.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
public class NacosConfigController {


//    @Value("${nacosProd}")
//    private String nacosProd;
//
//    @GetMapping("/nacosProd")
//    public String getNacosProd() {
//        return nacosProd;
//    }

    @Value("${nacosTest}")
    private String nacosTest;

    @GetMapping("/nacosTest")
    public String getNacosTest() {
        return nacosTest;
    }
    @Value("${nacosCommon}")
    private String nacosCommon;

    @GetMapping("/nacosCommon")
    public String getNacosCommon() {
        return nacosCommon;
    }
    @Value("${redisip}")
    private String redisip;

    @GetMapping("/redisip")
    public String getredisip() {
        return redisip;
    }
    @Value("${mqip}")
    private String mqip;

    @GetMapping("/mqip")
    public String getmqip() {
        return mqip;
    }

}

打开浏览器访问http://localhost:8080/mqip验证测试结果结果如图:

在这里插入图片描述

4.4. 通过extension-configs方式

修改bootstrap.yaml文件,删除shared-configs相关配置,增加extension-configs[0]和extension-configs[1]的配置如下:


spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      config:
        file-extension: yaml # 表示支持扩展的文件名
        extension-configs[0]: # shared-configs是一个列表 List<Config> sharedConfigs
          data_id: redis.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
        extension-configs[1]: # shared-configs是一个列表 List<Config> sharedConfigs
          data_id: mq.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
          #group: # 可以不写 默认DEFAULT_GROUP
  application:
    name: nacos-config # 表示当前微服务需要向配置中心索要nacos-config的配置
  profiles:
    active: test  # 表示我需要向配置中心索要生产环境的配置

重新启动项目,分别访问http://localhost:8080/redisip和http://localhost:8080/mqip验证是否可以正常读取redis.yaml和mq.yaml的配置信息

在这里插入图片描述

在这里插入图片描述

4.5. 配置实时刷新测试验证

在nacos中修改redis.yaml和mq.yaml的信息,不重启项目,直接访问浏览器,验证配置是否生效
redis.yaml原配置:

在这里插入图片描述

mq.yaml修改后配置:

在这里插入图片描述

mq.yaml原配置:

在这里插入图片描述

mq.yaml修改后配置:

在这里插入图片描述

访问http://localhost:8080/redisip和http://localhost:8080/mqip验证

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、多个shard-configs的文件中存在相同的配置

5.1. 思考1

如果多个shard-configs的文件中存在相同的配置,最终会以那个配置文件中的值为准?

5.2. 分析验证思路

这样场景

例如:在redis.yaml和mq.yaml配置文件中有一个相同的配置属性但是值不一样,然后在项目中存在多个shard-configs的文件,到底优先获取谁的配置问价心中的信息呢?对吧

5.3. 验证流程

  • 1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一个属性为port的属性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672
  • 2.在项目中的bootstrap.yaml中配置多个shard-configs
  • 3.在测试类中添加测试方法
  • 4.浏览器验证
  • 5.得出结论

5.4. 流程实战

  • 1.在nacos上在redis.yaml和mq.yaml配置文件中都配置一个属性为port的属性,redis.yaml文件中配置6379,和mq.yaml配置文件中port配置5672

在这里插入图片描述

在这里插入图片描述

  • 2.在项目中的bootstrap.yaml中配置多个shard-configs

spring:
  cloud:
    nacos:
      server-addr: localhost:8848 # nacos服务地址
      config:
        file-extension: yaml # 表示支持扩展的文件名
        extension-configs[0]: # shared-configs是一个列表 List<Config> sharedConfigs
          data_id: redis.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
        extension-configs[1]: # shared-configs是一个列表 List<Config> sharedConfigs
          data_id: mq.yaml
          refresh: true # 默认是false 如果需要支持自动刷新,需要配置true,搭配@RefreshScope实现动态刷新
          #group: # 可以不写 默认DEFAULT_GROUP
  application:
    name: nacos-config # 表示当前微服务需要向配置中心索要nacos-config的配置
  profiles:
    active: test  # 表示我需要向配置中心索要生产环境的配置
  • 3.在测试类中添加测试方法

 @GetMapping("/port")
    public String getport() {
        return port;
    }
  • 4.浏览器验证

http://localhost:8080/port

在这里插入图片描述

  • 5.得出结论

结论:会以数组最后一个配置文件内容为准

六、配置文件优先级

6.1. springboot

提示springboot配置文件优先级
(bootstrap.ptoterties > bootstrap.yaml > application.ptoterties > bootstrap.yaml)

6.2. nacos

如果同时在extension-configs和shard-configs存在相同的配置,最终会以那个文件中的值为准?
总结下configdemo.yaml、configdemo-test.yaml、和shard-configs、extension-configs读取优先级


    extension-configs:
      - data-id: shareconfig3.yml
        group: share3_group
        refresh: true
      - data-id: shareconfig3.yml
        group: share4_group
        refresh: true
    shared-configs:
      - data-id: shareconfig1.yml
        refresh: true
      - data-id: shareconfig2.yml
        refresh: true

spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高,因此会走group=share4_group的配置。
spring.cloud.nacos.config.shared-configs[n].data-id默认跟上面一样的逻辑。

不同方式配置加载优先级
Spring Cloud Alibaba Nacos Config 目前提供了三种配置能力从 Nacos 拉取相关的配置。

A: 通过 spring.cloud.nacos.config.shared-configs[n].data-id 支持多个共享 Data Id 的配置
B: 通过 spring.cloud.nacos.config.extension-configs[n].data-id 的方式支持多个扩展 Data Id 的配置
C: 通过内部相关规则(spring.cloud.nacos.config.prefix、spring.cloud.nacos.config.file-extension、spring.cloud.nacos.config.group)自动生成相关的 Data Id 配置

当三种方式共同使用时,他们的一个优先级关系是:A < B < C

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Spring Cloud Alibaba Nacos Config进阶使用

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Spring Cloud Alibaba Nacos Config加载如何配置

本篇内容介绍了“Spring Cloud Alibaba Nacos Config加载如何配置”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
2023-07-02

Spring Cloud Alibaba 整合Nacos的详细使用教程

Spring Cloud Alibaba提供了越来越完善的各类微服务治理组件,比如分布式服务配置与注册中心nacos,服务限流、熔断组件sentinel等,本篇先来介绍nacos的详细使用,需要的朋友可以参考下
2023-03-13

Spring Cloud Alibaba整合Nacos使用的方法是什么

今天小编给大家分享一下Spring Cloud Alibaba整合Nacos使用的方法是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起
2023-07-05

Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断

这篇文章主要讲解了“Spring Cloud Alibaba 使用 Feign+Sentinel 怎么完成熔断”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Cloud Alib
2023-06-14

Spring Cloud Config如何使用本地配置文件

本篇内容主要讲解“Spring Cloud Config如何使用本地配置文件”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Spring Cloud Config如何使用本地配置文件”吧!一、简介
2023-06-20

如何在项目中使用Spring Cloud Alibaba Sentinel组件

这篇文章主要介绍“如何在项目中使用Spring Cloud Alibaba Sentinel组件”,在日常操作中,相信很多人在如何在项目中使用Spring Cloud Alibaba Sentinel组件问题上存在疑惑,小编查阅了各式资料,
2023-06-20

如何使用svn+Spring Cloud Config来做配置中心

这篇文章主要介绍“如何使用svn+Spring Cloud Config来做配置中心”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“如何使用svn+Spring Cloud Config来做配置中心”
2023-06-05

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录