nacos配置中心用法详细介绍(代码片段)

张维鹏 张维鹏     2022-12-01     684

关键词:

        上篇文章介绍了 Nacos 作为注册中心的用法,除此之外,Nacos 还能作为配置中心使用,那这篇文章就介绍下 Nacos 作为配置中心的基本用法,首先我们先了解下为什么需要使用配置中心。

一、为什么需要配置中心:

在没有配置中心之前,传统应用配置的存在以下痛点:

(1)采用本地静态配置,无法保证实时性:修改配置不灵活且需要经过较长的测试发布周期,无法尽快通知到客户端,还有些配置对实时性要求很高,比方说主备切换配置或者碰上故障需要修改配置,这时通过传统的静态配置或者重新发布的方式去配置,那么响应速度是非常慢的,业务风险非常大

(2)易引发生产事故:比如在发布的时候,容易将测试环境的配置带到生产上,引发生产事故。

(3)配置散乱且格式不标准:有的用properties格式,有的用xml格式,还有的存DB,团队倾向自造轮子,做法五花八门。

(4)配置缺乏安全审计、版本控制、配置权限控制功能:谁?在什么时间?修改了什么配置?无从追溯,出了问题也无法及时回滚到上一个版本;无法对配置的变更发布进行认证授权,所有人都能修改和发布配置。

        而配置中心区别于传统的配置信息分散到系统各个角落的方式,对系统中的配置文件进行集中统一管理,而不需要逐一对单个的服务器进行管理。那这样做有什么好处呢?

(1)通过配置中心,可以使得配置标准化、格式统一化

(2)当配置信息发生变动时,修改实时生效,无需要重新重启服务器,就能够自动感知相应的变化,并将新的变化统一发送到相应程序上,快速响应变化。比方说某个功能只是针对某个地区用户,还有某个功能只在大促的时段开放,使用配置中心后只需要相关人员在配置中心动态去调整参数,就基本上可以实时或准实时去调整相关对应的业务。

(3)通过审计功能还可以追溯问题

二、Nacos配置中心的使用:

        微服务中配置中心的主流解决方案主要有三种:Nacos、Apollo、Config+Bus,不过这篇文章我们主要介绍 Nacos 作为配置中心的用法,对其他两种方式感兴趣的读者请自行上网查阅

1、Springboot 整合 Nacos 配置中心:

(1)首先我们声明项目的版本信息:

<properties>
    <spring-boot.version>2.3.2.RELEASE</spring-boot.version>
    <spring-cloud.version>Hoxton.SR9</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.6.RELEASE</spring-cloud-alibaba.version>
</properties>

<!--  只声明依赖,不引入依赖 -->
<dependencyManagement>
    <dependencies>
        <!-- 声明springBoot版本 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>$spring-boot.version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 声明springCloud版本 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>$spring-cloud.version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!-- 声明 springCloud Alibaba 版本 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>$spring-cloud-alibaba.version</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2)添加 nacos 配置中心的 maven 依赖:

<!-- SpringCloud Ailibaba Nacos Config -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

(3)在 application.properties 文件中添加 nacos 配置中心相关配置:

spring.profiles.active=dev
spring.application.name=cloud-producer-server
server.port=8080

# nacos 配置中心地址
spring.cloud.nacos.config.server-addr=localhost:8848
# 配置文件的类型
spring.cloud.nacos.config.file-extension=yaml

(4)在 nacos 控制台新建一个 DataID 为 cloud-producer-server-dev.yaml 的配置集:

为什么 DataID 的命名为 cloud-producer-server-dev.yaml 会在下文介绍

 (5)编写测试类:

//配置发布之后,动态刷新配置
@RefreshScope
@RestController
@RequestMapping("provider")
public class ProviderController

    // 使用原生注解@Value()导入配置
    @Value("$user.id")
    private String id;
    @Value("$user.name")
    private String name;
    @Value("$user.age")
    private String age;

    @GetMapping("getNacosConfig")
    public String providerTest()
    
        return "我是provider,已成功获取nacos配置中心的数据:(id:" + id + ",name:" + name + ",age:" + age +")";
    

(6)启动服务验证:

        启动项目,访问 http://localhost:8080/provider/getNacosConfig 接口,可以看到 nacos 配置中心的配置信息已经生效并被成功获取到了

(7)验证动态刷新配置:

        配置的动态刷新是配置中心最核心的功能之一,假设我现在需要修改 user.name 的值,那么我直接改变 Nacos 中的配置会生效吗?我们试下直接将 Nacos 中的配置修改成 “zhangsan”,如下图:

 此时不重启项目并重新访问该接口,结果如下:

        我们发现配置已经动态刷新了,这是为什么呢?其实是由于我们在类上添加了 @RefreshScope 注解而产生的效果。

//配置发布之后,动态刷新配置
@RefreshScope
@RestController
@RequestMapping("provider")
public class ProviderController

2、Nacos 的核心概念:

2.1、Data ID:

(1)Data ID 的命名格式:

        前面我们演示了在 nacos 控制台新建一个 DataID 为 cloud-producer-server-dev.yaml 的数据集,那么这个 Data ID 是什么呢?Data ID 是配置集的唯一标识,一个应用可以包含多个配置集,每个配置集都需要被一个有意义的名称标识。那么 Data ID 怎么取值呢?格式通俗一点就是 “前缀-环境-扩展名”,如下所示:

$spring.cloud.nacos.config.prefix-$spring.profiles.active.$spring.cloud.nacos.config.file-extension

① prefix:前缀,默认是 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。

# 若不指定,默认采用应用名的方案
spring.application.name=cloud-producer-server

# 手动指定配置的dataID前缀标识
# spring.cloud.nacos.config.prefix=cloud-producer-server-config

② active:配置运行环境,即为当前环境对应的 profile。

注意:当 spring.profiles.active 为空时,对应的连接符 ”-“ 也将不存在,dataId 的拼接格式变成 $prefix.$file-extension

# dev表示开发环境
spring.profiles.active=dev

③ file-exetension:配置文件的类型,默认是 properties,也可以通过配置项 spring.cloud.nacos.config.file-extension 来配置,目前支持的类型有 TEXT、JSON、XML、YAML、HTML、Properties

# 指定配置文件类型为yaml文件
spring.cloud.nacos.config.file-extension=yaml

④ 最终配置:

        经过前面三个步骤,我们最终在nacos配置中心的控制台新增配置文件就是:cloud-producer-server.yaml

2.2、环境隔离-命名空间Namespace:

        Nacos 引入命名空间 Namespace 的概念来进行多环境配置和服务的管理及隔离。例如,你可能存在本地开发环境dev、测试环境test、生产环境prod 三个不同的环境,那么可以创建三个不同的 Namespace 区分不同的环境。创建方式如下:

 创建完成后,就可以在Nacos 控制台的配置列表上面看到不同的命名空间了,如下图:

        成功创建新命名空间后,就可以在 springboot 的配置文件配置命名空间的 id 切换到对应的命名空间,并获取对应空间下的配置文件,但在没有指定命名空间配置的情况下,默认的配置都是在 public 空间中,指定命名空间的方式如下:

# 对应创建的命名空间的ID,此处对应的是dev命名空间
cloud.nacos.config.namespace=483bb765-a42d-4112-90bc-50b8dff768b3

2.3、业务隔离-Group分组:

        Group 也可以实现环境隔离的功能,但 Group 设计的目的主要是做同一个环境中的不同服务分组,把不同的微服务的配置文件划分到同一个分组里面去,Nacos 如果不指定 Group,则默认的分组是 DEFAULT_GROUP。

        如果没有 Group,试想一下这个场景:有两个微服务,一个是订单系统,一个是用户系统,但是他们有着相同的配置,比如 datasource-url,那么如何区分呢?这时候 Group 就派上用场了。上述场景中订单系统、用户系统可以单独分为一个组,比如 ORDER_GROUP、USER_GROUP,当然这是比较细粒度的分组,根据企业的业务也可以多个微服务分为一组。

        接下来我们演示一下创建配置集时以及集成时如何指定分组,还是前面的例子,新建配置集是在如下位置指定Group分组:

 接下来在 application.properties 文件分组:

spring.cloud.nacos.config.namespace=483bb765-a42d-4112-90bc-50b8dff768b3

3、小结:

Nacos 实现配置管理和动态配置刷新很简单,总结如下步骤:

  • ① 添加对应 spring-cloud-starter-alibaba-nacos-config 依赖
  • ② 使用原生注解 @Value() 导入配置
  • ③ 使用原生注解 @RefreshScope 刷新配置
  • ④ 根据自己业务场景做好多环境配置隔离(Namespace)、不同业务配置隔离(Group)

4、共享配置:

        当我们微服务的数量越来越多,势必会有相同的配置,这时我们可以将相同的配置抽取出来作为项目中共有的配置,比如集群中的数据源信息、日志的配置信息,nacos 也是支持这种一个配置中心多个配置集这种写法的。

(1)我们在nacos中新建两个 Data ID 分别是 db.yaml 和 log.yaml 的文件。

(2)在配置文件中分别加入部分配置内容

(3)在 Springboot 项目中添加如下的 nacos 配置:

spring:
  cloud:
    nacos:
      config:
        extension-configs[0]:
          data-id: db.yaml
          # 默认为DEFAULT_GROUP
          group: DEFAULT_GROUP
          # 是否动态刷新,默认为false
          refresh: true
        extension-configs[1]:
          data-id: log.yaml
          group: DEFAULT_GROUP
          refresh: true

为了更加清晰的在多个应用间配置共享的 Data Id,官方推荐使用 shared-configs,配置如下:

spring:
  cloud:
    nacos:
      config:
        shared-configs[0]:
          data-id: db.yaml
          # 默认为DEFAULT_GROUP
          group: DEFAULT_GROUP   
          # 是否动态刷新,默认为false
          refresh: true   
        shared-configs[1]:
          data-id: log.yaml
          group: DEFAULT_GROUP
          refresh: true

(4)思考:在这2个文件中出现相同配置,nacos如何选取?

        当多个 Data Id 同时出现相同的配置时,它的优先级关系是 spring.cloud.nacos.config.extension-configs[n].data-id 其中 n 的值越大,优先级越高。

注意:spring.cloud.nacos.config.extension-configs[n].data-id 的值必须带文件扩展名,文件扩展名既可支持 properties,又可以支持 yaml/yml。此时 spring.cloud.nacos.config.file-extension 的配置对自定义扩展配置的 Data Id 文件扩展名没有影响。

(5)不同方式配置加载优先级:

        Nacos 配置中心目前提供以下三种配置能力从 Nacos 拉取相关的配置,当三种方式共同使用时,他们的一个优先级关系是:A < B < C:

  • 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 配置

相关阅读:

常见的服务器架构入门:从单体架构、EAI 到 SOA 再到微服务和 ServiceMesh

常见分布式理论(CAP、BASE)和一致性协议(Gosssip协议、Raft一致性算法)

一致性哈希算法原理详解

Nacos注册中心的部署与用法详细介绍

Nacos配置中心用法详细介绍

SpringCloud OpenFeign 远程HTTP服务调用用法与原理

什么是RPC?RPC框架dubbo的核心流程

服务容错设计:流量控制、服务熔断、服务降级

sentinel 限流熔断神器详细介绍

Sentinel 规则持久化到 apollo 配置中心

Sentinel-Dashboard 与 apollo 规则的相互同步

Spring Cloud Gateway 服务网关的部署与使用详细介绍

Spring Cloud Gateway 整合 sentinel 实现流控熔断

Spring Cloud Gateway 整合 knife4j 聚合接口文档

常见分布式事务详解(2PC、3PC、TCC、Saga、本地事务表、MQ事务消息、最大努力通知)

分布式事务Seata原理

RocketMQ事务消息原理


参考文章:

SpringBoot2.X整合Nacos做配置中心

五十五张图告诉你微服务的灵魂摆渡者Nacos究竟有多强?

nacos配置中心用法举例(代码片段)

我们这篇文章介绍下Nacos作为配置中心的基本用法,首先我们先了解下为什么需要使用配置中心。一、为什么需要配置中心:在没有配置中心之前,传统应用配置的存在以下痛点:(1)采用本地静态配置&#x... 查看详情

nacos配置中心用法举例(代码片段)

我们这篇文章介绍下Nacos作为配置中心的基本用法,首先我们先了解下为什么需要使用配置中心。一、为什么需要配置中心:在没有配置中心之前,传统应用配置的存在以下痛点:(1)采用本地静态配置&#x... 查看详情

nacos配置中心用法详细教程

一、为什么需要配置中心:在没有配置中心之前,传统应用配置的存在以下痛点:(1)采用本地静态配置,无法保证实时性:修改配置不灵活且需要经过较长的测试发布周期,无法尽快通知到客户端,还有些配置对实时性要求... 查看详情

微服务系列之nacos配置中心之一:nacos介绍与安装(代码片段)

...公司推出的开源工具,用于实现分布式系统的服务发现与配置管理。英文全称DynamicNamingandConfigurationService,Na为Naming/NameServer即注册中心,co为Configuration即配置中心,Service是指该注册/配置中心都是以服务为核心。服务(Service)... 查看详情

nacos基础介绍—配置中心(代码片段)

一、什么是配置中心在微服务架构中,配置中心就是统一管理各个微服务配置文件的服务。把传统的单体jar包拆分成多个微服务后,配置文件也要拆分,每个微服务都要有自己的配置文件。为了统一维护,方便管... 查看详情

nacos基础介绍——注册中心(代码片段)

前言Nacos官网一、什么是NacosNacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。Nacos的关键特性包括:服务发现和服务健康监测... 查看详情

nacos——服务注册和发现中心配置中心(代码片段)

Nacos——服务注册和发现中心、配置中心Nacos是现在比较火的一款动态服务发现、管理和配置中心,配合一些云原生的组件很方便,下面简单介绍一下nacos和springcloud的使用。1.启动NacosServer服务下载源码或者安装包你可以通过源码... 查看详情

nacos介绍及使用(代码片段)

...Nacos是一个更易于帮助构建云原生应用的动态服务发现、配置和服务管理平台,提供注册中心、配置中心和动态DNS服务三大功能。能够无缝对接Springcloud、Spring、Dubbo等流行框架。3、nacos和eureka功能对比4、nacos支持a(高可... 查看详情

使用nacos实现分布式配置中心(代码片段)

...的解析,这篇博文开始,介绍Nacos另外一个强大的功能:配置中心,这篇博文主要是一个快速入门,后面博客在从原理上进行介绍。什么是配置中心为什么需要配置中心?在我们开发分布式微服务项目之前,我们通常的做法都是... 查看详情

03.nacos组件之统一配置中心(代码片段)

Nacos组件之统一配置中心前言介绍核心概念命名空间GroupDataIDconfigclient-profile.propertiesConfigClient开发1.新建Module2.pom.xml3.bootstrap.properties4.ConfigClientApplication.java5.TestController.java6.测试历史版本前言前面我们提到过Nacos是ali 查看详情

nacos安装教程(史上最详细保姆级教程)(代码片段)

...#xff1a;SpringCloud快速导航前言1、下载安装包2、解压3、端口配置4、启动5、访问6、Nacos的依赖7、概览8、生态总结前言  Nacos的全称是DynamicNamingandConfigurationService,Na为naming/nameServer即注册中心,co为configuration即注册中心,ser... 查看详情

nacos配置中心(代码片段)

本文介绍springcloud集成nacos案例官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh-cn/docs/what-is-nacos.html单机部署:1.git克隆项目gitclonehttps://github.com/alibaba/nacos.git2.进入根目录cdnacos/3.maven编译mvn-Prelease-nacoscleaninstall-U3.进... 查看详情

springcloudalibaba之nacos组件(代码片段)

...目搭建4.2、Nacos服务消费者项目搭建4.3、结果分析5、Nacos配置中心5.1、Nacos配置中心基础配置5.2、Nacos配置中心分类配置5.3、Nacos集群和持久化配置(重要)该篇博 查看详情

springcloud学习笔记总结(代码片段)

...os服务注册与发现之服务注册中心对比提升6.Nacos作为服务配置中心7.Nacos服务配置中心之namespace、group、DataID三者关系7.Nacos服务配置中心之Da 查看详情

springboot项目中使用nacos作为配置中心(代码片段)

利用nacos作为配置中心,好处不言而喻,配置外置了,与程序解耦,并且nacos还提供了友好的管理界面。springboot的卖点之一,就是与之前的spring相比,所谓约定重于配置,配置文件大大简化。现在使用na... 查看详情

nacos:服务注册及配置中心(代码片段)

SpringCloudAlibabaNacos:服务注册及配置中心一、Nacos简介1.Nacos简介​Nacos是由阿里巴巴提供的一款专门构建云本地应用的动态服务发现、配置中心和服务管理平台。在SpringCloudAlibaba中常使用Nacos作为注册中心和分布式配置中心。​Nac... 查看详情

springcloudalibabanacos服务注册和配置中心(代码片段)

SpringCloudAlibabaNacos服务注册和配置中心一、Nacos概述二、Nacos作为注册中心2.1基于Nacos的服务提供者2.2基于Nacos的服务消费者2.3Nacos与其他注册中心对比三、Nacos作为配置中心3.1Nacos基础配置3.2Nacos分类配置3.2.1Nacos的命名规则说明3.2.2... 查看详情

springcloudspringcloudalibaba之nacos配置中心(二十八)

...一章介绍了Nacos作为注册中心的使用,本章介绍Nacos作为配置中心  示例代码沿用上一章代码Nacos配置客户端搭建  1、在父项目(test-springcloud)中,新建配置客户端模块(springcloud-config-nacos-client8901)  2、在pom中,依赖Naco... 查看详情