Nacos配置中心、注册中心详解(配置文件命名规则、extension-configs、shared-configs的作用、加载优先级)
1. Nacos
Nacos最基础的来说是个注册中心和配置中心
1.1 注册中心
1.1.1 注入依赖
为了方便管理依赖版本,可以在父依赖总用dependencies进行统一管理
<!-- SpringCloud Alibaba 微服务 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- bootstrap 启动器 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
1.1.2 添加配置
在bootstrap.yml配置文件中,会在application.yml之前被读取,读取到nacos的地址等信息
spring:
application:
name: zz-business # 注册到nacos上服务的名字
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: dev # 归属于那个命名空间,和‘命名空间ID’保持一致
注:命名空间起到了隔离的作用,不同的命名空间之间一般很难调用,所以命名空间可以用来做开发、测试、生产环境的区分
1.2 配置中心
1.2.1 注入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
1.2.2 添加配置
spring:
application:
name: zz-business
profiles:
active: dev
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# namespace: dev #命名空间
config:
server-addr: 127.0.0.1:8848
file-extension: yml # 文件的类型
group: BUSINESS_GROUP #所属分组
# name: # 如果不写就默认为 ${spring.application.name}-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
extension-configs: # 多个配置 写在下面的优先级高
- dataId: common1.yml
group: BUSINESS_GROUP
refresh: true
- dataId: common2.yml
group: BUSINESS_GROUP
refresh: true
shared-configs: # 共享配置文件
- data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
group: DEFAULT_GROUP
1.2.3 各配置项解读
1.2.3.1 那配置列表那么多已创建的配置文件,怎么和服务对应上呢?
首先要保证实在同一个命名空间里,其次要保证实在同一个group里面。配置名可以通过spring.cloud.nacos.config.name来指定。如果不写的话
名字默认为:${prefix}-${spring.profiles.active}.${file-extension}
prefix
默认为spring.application.name
的值,也可以通过配置项spring.cloud.nacos.config.prefix
来配置。spring.profiles.active
即为当前环境对应的 profile,详情可以参考 Spring Boot文档。 注意:当spring.profiles.active
为空时,对应的连接符-
也将不存在,dataId 的拼接格式变成${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension
来配置。目前只支持properties
和yaml
类型。
例如:zz-business-dev.yml
1.2.3.2 怎么读取多个配置文件呢?(extension-configs)
当然如果都放在一个配置文件里,可能会显得庞大,所有可以对一个配置文件根据应用模块进行拆分,用extension-configs读取多个配置
两种书写方式
extension-configs: # 多个配置 下面的优先级高
- dataId: common1.yml
group: BUSINESS_GROUP
refresh: true
- dataId: common2.yml
group: BUSINESS_GROUP
refresh: true
或
extension-configs[0]:
dataId: common2.yml
group: BUSINESS_GROUP
refresh: true
extension-configs[1]:
dataId: common1.yml
group: BUSINESS_GROUP
refresh: true
数值越大优先级越高
之前还有ext-config[0]的写法,但已经过时了
1.2.3.3 有的配置可以通用于各个服务中,怎么共享使用呢?(shared-configs)
shared-configs: # 共享配置文件
- data-id: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
group: DEFAULT_GROUP
所对应的配置名就是application-dev.yml
1.2.4 配置文件的读取优先级
那么多配置文件,如果有重复的配置项,那么应该听从谁的?谁会覆盖谁呢?
-
通过内部相关规则(应用名、扩展名、profiles)自动生成相关的 Data Id 配置优先级最高
-
nacos中的配置优先于本地配置,本地的bootstrap.yml>bootstrap.properties>application.yml>application.yaml>application.properties
-
扩展配置(extension-configs) > 共享配置(shared-configs)
-
同为扩展配置,存在如下优先级关系:extension-configs[3] > extension-configs[2] > extension-configs[1] > extension-configs[0]
-
同为共享配置,存在如下优先级关系:shared-configs[3] > shared-configs[2] > shared-configs[1] > shared-configs[0]
总的来说是:(线上) 服务名-profile.yml>服务名.yml>extension-configs[3]>extension-configs[2]>shared-configs[3]>(本地) shared-configs[2]>bootstrap.yml>bootstrap.properties>application.yml>application.yaml>application.properties
1.2.5 配置文件热更新
nacos中心的配置文件可以实现热更新,避免每次更改配置后都得重新启动,详细用法可见:
参考文章:Nacos配置文件热更新