首页 > 其他分享 >Nacos共享配置(shared-configs)和扩展配(extension-config)

Nacos共享配置(shared-configs)和扩展配(extension-config)

时间:2024-12-19 11:19:42浏览次数:7  
标签:group extension 配置 Nacos nacos shared configs

原文地址:https://www.jianshu.com/p/8715072d3f4c

一、共享配置(shared-configs)和扩展配(extension-config)

日常开发中,多个模块可能会有很多共用的配置,比如数据库连接信息,Redis 连接信息,RabbitMQ 连接信息,监控配置等等。那么此时,我们就希望可以加载多个配置,多个项目共享同一个配置之类等功能,Nacos Config 也确实支持。

Nacos在配置路径spring.cloud.nacos.config.extension-config下,允许我们指定⼀个或多个额外配置。

Nacos在配置路径spring.cloud.nacos.config.shared-configs下,允许我们指定⼀个或多个共享配置。

上述两类配置都⽀持三个属性:data-id、group(默认为字符串DEFAULT_GROUP)、refresh(默认为true)。

1.1 版本说明

Nacos:2.0.0
spring-cloud.version:Hoxton.SR9
spring-boot.version:2.3.6.RELEASE
alibaba.cloud.version:2.2.3.RELEASE

1.2 maven依赖

<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
   <version>2.2.3.RELEASE</version>
</dependency>
 
<dependency>
   <groupId>com.alibaba.cloud</groupId>
   <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
   <version>2.2.3.RELEASE</version>
</dependency>
 

1.3 配置文件将application改成bootstrap

application.yml作用域在于当前应用有效,bootstrap.yml系统级别的配置有效(一般采用远程配置的时候才会用到)。

因此,将项目中原来的application.yml、application-dev.yml对应改成bootstrap.yml、bootstrap-dev.yml 。

二、配置实例

spring:
  application:
    name: nacos-config-multi
  main:
    allow-bean-definition-overriding: true
  cloud:
    nacos:
      username: ${nacos.username}
      password: ${nacos.password}
      config:
        server-addr: ${nacos.server-addr}
        namespace: ${nacos.namespace}
        # 用于共享的配置文件
        shared-configs:
          - data-id: common-mysql.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

          - data-id: common-redis.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

          - data-id: common-base.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP

        # 常规配置文件
        # 优先级大于 shared-configs,在 shared-configs 之后加载
        extension-configs:
          - data-id: nacos-config-advanced.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP
            refresh: true

          - data-id: nacos-config-base.yaml
            group: SPRING_CLOUD_EXAMPLE_GROUP
            refresh: true

参数解析:

data-id : Data Id
group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP。
refresh: 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
注意:这里的Data ID后面是加.yaml后缀的,且不需要指定file-extension。

三、共享配置和扩展配置的区

实际上,Nacos中并未对extension-configs和shared-configs的差别进⾏详细阐述。我们从他们的结构,看不出本质差别;除了优先级不同以外,也没有其他差别。那么,Nacos项⽬组为什么要引⼊两个类似的配置呢?我们可以从当初该功能的需求(issue)上找到其原始⽬的。

3.1 Nacos对配置的默认理念

namespace区分环境:开发环境、测试环境、预发布环境、⽣产环境。
group区分不同应⽤:同⼀个环境内,不同应⽤的配置,通过group来区分。

3.2 主配置是应⽤专有的配置

因此,主配置应当在dataId上要区分,同时最好还要有group的区分,因为group区分应⽤(虽然dataId上区分了,不⽤设置group也能按应⽤单独加载)。

3.3 要在各应⽤之间共享⼀个配置,请使⽤上⾯的 shared-configs

因此按该理念,shared-configs指定的配置,本来应该是不指定group的,也就是应当归⼊DEFAULT_GROUP这个公共分组。

3.4 如果要在特定范围内(⽐如某个应⽤上)覆盖某个共享dataId上的特定属性,请使⽤ extension-config

⽐如,其他应⽤的数据库url,都是⼀个固定的url,使⽤shared-configs.dataId = mysql的共享配置。但其中有⼀个应⽤ddd-demo是特例,需要为该应⽤配置扩展属性来覆盖。

spring:
 application:
   name: ddd-demo-service
 cloud:
   nacos:
     config:
       server-addr: nacos-2.nacos-headless.public.svc.cluster.local:8848
       namespace: ygjpro-test2
       group: ddd-demo
       ......
       shared-configs[3]:
         data-id: mysql.yaml
         refresh: true
       ......
       extension-configs[3]:
         data-id: mysql.yaml
         group: ddd-demo
         refresh: true

3.5 关于优先级
1、上述两类配置都是数组,对同种配置,数组元素对应的下标越⼤,优先级越⾼。也就是排在后⾯的相同配置,将覆盖排在前⾯的同名配置。

同为扩展配置,存在如下优先级关系:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0。

同为共享配置,存在如下优先级关系:shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]。

2、不同种类配置之间,优先级按顺序如下:主配置 > 扩展配置(extension-configs) > 共享配置(shared-configs)

标签:group,extension,配置,Nacos,nacos,shared,configs
From: https://www.cnblogs.com/chengfaying/p/18616785

相关文章

  • 服务注册与发现:Zookeeper、Eureka、Consul、Nacos
    Zookeeper功能特点数据一致性保障:Zookeeper是一个分布式协调服务,它基于ZAB(ZookeeperAtomicBroadcast)协议来保证数据的一致性。在分布式系统中,多个节点可以通过Zookeeper来共享配置信息、实现分布式锁等功能。例如,在一个分布式集群中,不同节点对于任务的分配和执行顺序可以......
  • Nacos注册中心
    Nacos在构建和管理分布式系统或微服务架构中扮演着重要角色,它主要提供了两大核心功能:服务发现与管理和配置管理使用场景当我们的微服务被请求次数增多时,我们会通过增加多个实例部署去应对增加的并发,而每个实例有不同的端口号,如何处理请求访问的实例就成为一个问题,这个时......
  • docker安装最新版nacos详细教程
    一、下载最新版nacos,linux如果没有安装docker,百度自行查找linux安装docker教程dockerpullnacos/nacos-server下载完成后查看已下载的镜像dockerimages二、运行nacos容器dockerrun--namenacos-eMODE=standalone-p8848:8848-dnacos/nacos-server 九、浏览器访问n......
  • SpringCloud Nacos (docker 搭建 && 项目运行) 基于 Cloud 2022 版本
    一、使用docker安装nacos基础镜像1、安装docker(省略)2、创建docker-compose.ymlversion:'3.7'services:nacos:image:nacos/nacos-server:latestcontainer_name:nacosenvironment:-MODE=standalone#单机模式-PREFER_HOST_MODE=hos......
  • Docker启动Nacos2.4.3并且使用MySQL
    1.拉取容器dockerpullnacos/nacos-server:v2.4.32.创建宿主机挂载目录mkdir-p/docker/nacos/logs/mkdir-p/docker/nacos/conf/3.启动临时容器并拷贝配置文件启动临时容器dockerrun-d--namenacos-temp-p8848:8848nacos/nacos-server:v2.4.3拷贝Nacos......
  • Spring Cloud 搭建 Nacos (windows )
    一、Nacos服务搭建1、下载安装:Windows:在Nacos的GitHub页面,提供有下载链接,可以下载编译好的Nacos服务端或者源代码:GitHub主页:https://github.com/alibaba/nacosGitHub的Release下载页:https://github.com/alibaba/nacos/releases解压后出现目录:说明:(默认端口8848)bin:启动脚本......
  • SpringBoot,SpringCloudAlibaba,GateWay,Nacos,OpenFeign,Vue
    springboot,vue,springcloudalibaba课程视频,有需要可以看看<!--springboot,springboot整合redis,整合rocketmq视频:-->https://www.bilibili.com/video/BV1nkmRYSErk/?vd_source=14d27ec13a4737c281b7c79463687112<!--springcloudalibaba,openfeign,nacos,gateway,sso视频:-->......
  • Nacos之健康检测
    Nacos服务-领域模型在NacosServer中,服务和配置是一等公民,而在Server侧服务信息的存储采用的是分级存储模型服务(一组功能集的抽象):namespace,group,serviceName标识一个服务实例:服务在具体IP,端口上的提供者应用启动时的注册就是注册某个服务的实例集群:服务之下,实例之......
  • nacos灰度发布
    灰度发布的概念灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/Btesting,即让一部分用户继续用产品特性A,一部分用户开始用产品新特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,直到把所有用户都迁移到B上面来灰度发布可以保证整体系......
  • nacos安装
    nacos安装官网下载安装包解压并且执行sqlhttps://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql?spm=5238cd80.2ef5001f.0.0.3f613b7ciuvGMs&file=mysql-schema.sqlcd/usr/local/app/nacos/bin修改配置文件spring.sql.init.platform=mysqldb......