# nacos 配置中心
动态配置服务可以让您以中心化,外部化和动态化的方式管理所有环境的应用配置和服务配置
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷.
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的 UI()帮助您管理所有的服务和应用的配置。
Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及苦短配置更新状态跟踪在内的一系列开箱即用的配置管理特性, 帮助您更安全的在生产环境中管理配置变更和减低配置变更带来的风险。
实现:
- 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 配置
必须在
bootstrap.yml中进行配置
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: nacos.jun.com:8848
file-extension: yaml
server:
port: 8055
bootstrap.yml中定义的 spring.application.name 会作为nacos中配置列表的serverId
如果此服务还要注册到 nacos 当中,会使用 application.yml 中定义的 spring.application.name 的值作为 serverId
配置 和 注册 的 名称 不冲突
- 程序读取变量
@RefreshScope
@RestController
public class RestfulController {
@Value('${name:张三}')
private String name;
@Value('${password:pass}')
private String password;
@GetMapping('/name')
public String getName() {
return this.name;
}
@GetMapping('/password')
public String getPassword() {
return this.password;
}
}
只是配置中心,不需要 EnableDiscoveryClient
说明
配置中心的地址必须在
bootstrap.yml文件中声明
file-extension: yaml默认的读取的配置文件后缀是properties
@RefreshScope用于刷新读取的配置变量信息
# 配置文件隔离
配置文件名称规定:
${prefix}-${spring.profile.active}.${file-extension}
prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置。
spring.profile.active 即为当前环境对应的 profile,详情可以参考 Spring Boot 文档。 注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}
file-extension 为配置内容的数据格式,可以通过配置项
spring.cloud.nacos.config.file-extension来配置。目前只支持 properties 和 yaml 类型。
- profile
spring.profile.active: dev会加载nacos-config-client.yaml和nacos-config-client-dev.yaml的值,
并且nacos-config-client-dev.yaml优先级较高,会覆盖相同的变量
- group
默认的 group 名称为DEFAULT_GROUP,可以通过spring.cloud.nacos.config.group: alibaba来指定
- namespace
命名空间.配置的时候为命名空间 id,而不是名称
完整示例
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: nacos.jun.com:8848
file-extension: yaml
group: alibaba
namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
profiles:
active: dev
server:
port: 8055
即会去寻找7623c041-c2d4-4c0f-9fb9-dc1fc859378e命名空间下 group 为alibaba的nacos-config-client-dev.yaml文件
调试的通过在日志中查找dataId查看加载的配置信息
# 配置文件共享原则
# shared-dataids(2.1.0)
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: nacos.jun.com:8848
file-extension: yaml
group: alibaba
namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
shared-dataids: common.yml
refreshable-dataids: common.yml
profiles:
active: dev
server:
port: 8055
使用shared-dataids定义通用配置,如果需要支持刷新refreshable-dataids: common.yml
nacos-config-client-dev.yaml会将之覆盖.达到通用的目的
存在一个弊端(或者成为 bug)
只能加载
DEFAULT_GROUP下的common.yml.即: 组信息是无法传递的.
# ext-config(2.1.0)
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: nacos.jun.com:8848
file-extension: yaml
group: alibaba
namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
ext-config:
- dataId: common.yml
group: alibaba
refresh: true
profiles:
active: dev
server:
port: 8055
使用ext-config的方式,可以指定 group 和 dataId 以及是否支持刷新.
# 同时存在(2.1.0)
spring:
application:
name: nacos-config-client
cloud:
nacos:
config:
server-addr: nacos.jun.com:8848
file-extension: yaml
group: alibaba
namespace: 7623c041-c2d4-4c0f-9fb9-dc1fc859378e
ext-config:
- dataId: common.yml
group: alibaba
refresh: true
shared-dataids: common.yml
refreshable-dataids: common.yml
profiles:
active: dev
server:
port: 8055
优先读取 ext-config 配置的文件.
如果此时 ext-config 指定的文件修改了,是不能动态刷新的.而且会保留 ext-config 配置的值
所以,同时使用这两种方式不可行
总结:
使用
shared-dataids的方式,指定refreshable-dataids: common.yml支持刷新,但是不支持 group 参数使用
ext-config支持 group,动态刷新不能同时使用两种方式.
# 升级到 2.2.0
ext-config,shared-dataids,refreshable-dataids是已经废弃的配置
ext-config 使用 extension-configs代替
shared-dataids,refreshable-dataids使用shared-configs代替
extension-configs和shared-configs会使用 spring.cloud.nacos.config.namespace的值
即,必须在该 namespace 下才会生效
extension-configs和shared-configs也支持了分组
配置示例:
spring:
application:
name: nacos-config-client
profiles:
active: dev
cloud:
nacos:
config:
server-addr: 192.168.1.6:8848
file-extension: yaml
group: alibaba
namespace: acea6518-0572-4f2d-81ca-bfcddf12f512
extension-configs:
- dataId: common.yml
group: alibaba
refresh: true
shared-configs:
- dataId: shared.yml
group: alibaba
refresh: true
此时的配置文件的覆盖策略为:
shared.yml < common.yml < nacos-config-client < nacos-config-client.yaml < nacos-config-client-dev.yaml
5 个文件. nacos-config-client 为 ${spring.application.name},yaml为 file-extension 的值
file-extension 支持的格式为 properties|yaml|yml|xml|json
# config 数据持久化
config 数据持久化依赖于 nacos 的持久化,选择数据库的方式即可实现.
nacos 运行的数据库设置为mysql 5.6+,不支持 mysql 8,根据 bin 目录下操作即可实现
参照 nacos-deployment