Version: Next

服务配置中心

基础配置

cloudalibaba-config-nacos-client3377

POM

<!-- nacos config-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud ailibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

YAML

需要配置 application.yamlbootstrap.yaml 两个文件

  • 由于 bootstrap 优先级更高,因此用来写配置
  • application.yaml 写自身的一些配置
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定远程代码仓库上配置文件的格式 -> yaml格式配置
# group: DEV_GROUP
# namespace: 9a770128-f22f-40a3-b060-7488e1e4a7bc
#${prefix}-${spring.profile.active}.${file-extension}
# ${spring.application.name}-${spring.profile.active}.${file-extension}

主启动

  • 使用 @EnableDiscoveryClient 注解
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigClientMain3377 {
public static void main(String[] args) {
SpringApplication.run(NacosConfigClientMain3377.class, args);
}
}

业务类

  • 写一个 Controller 对外暴露配置信息
  • 使用 @RefreshScope 注解支持 Nacos 动态刷新功能
  • 使用 @Value("${config.info}") 读取远程代码仓库中配置文件配置信息
@RestController
@RefreshScope // 支持 Nacos 动态刷新
public class ConfigClientController {
// 这个配置写在远程代码仓库的配置文件中 config-test.yaml; config-dev.yaml
@Value("${config.info}")
private String configInfo;
@GetMapping("/config/info")
public String getConfigInfo() {
return configInfo;
}
}

Nacos 添加配置信息

Nacos 中的匹配规则

${prefix}-${spring.profile.active}.${file-extension}
// 例如 provider-test.yaml
  • prefix:默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix 来配置
  • spring.profile.activ 为当前环境的 profile (dev、test那种东西,配置在 application.yaml 中)。
    • spring.profile.active 为空时,对应连接符 - 也将不存在,dataId 的格式变为 ${prefix}.${file-extension}
    • file-extension:为配置文件的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置,目前仅支持 propertiesyaml 两种类型
  • 通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

最终:将 prefix 明确指定为 spring.application.name 得到最终公式

${spring.application.name}-${spring.profile.active}.${file-extension}
// 目前得到的就是 nacos-config-client-test.yaml
  • 目前推出的远程配置文件名应当是 nacos-config-client-test.yaml,即应当在配置中心配置这么个文件,配置内容就是 ConfigClientController 中读取的 config.info

Nacos 添加配置

  • 访问 localhost:8848/nacos,打开 配置管理-配置列表


  • 根据推算出的文件名 nacos-config-client-test.yaml 新建配置文件
  • 配置内容应当包含 config.info 为:
config:
info: "Config info for 「test」, from nacos config center, version = 1"

  • 点击 发布,再次查看配置列表,可以发现配置已经添加了并且能够显示和操作


测试

  • 测试前,确保 nacos 管理网站 -> 配置管理 -> 配置列表 下有对应的 yaml 配置文件
  • 运行 cloud-config-nacos-client3377
  • 访问 localhost:3377/config/info,发现配置已经更新


动态刷新配置测试

  • Nacos 8848 管理页面 直接使用 编辑 修改配置文件的 version
  • 再次访问 localhost:3377/config/info

分类配置

多环境多项目配置

问题一

  • dev 开发环境test 测试环境prod 生产环境
  • 如何保证指定环境启动时服务能正确读取到 Nacos 上响应环境的配置文件?

问题二

  • 大型分布式微服务系统会有很多微服务子项目
  • 每个微服务子项目都有自己对应的 开发环境测试环境生产环境
  • 如何对这些微服务子项目进行配置管理

Namespace + Group + Data ID


默认情况

  • Namespace = public
  • Group = DEFAULT_GROUP
  • 默认 Cluster: DEFAULT

Namespace 主要用来实现 隔离

  • 例如三个环境 devtextprod,就可以创建三个 Namespace,不同的 Namespace 之间是隔离的

Group 用来分组

Cluster 用来指定微服务的虚拟划分,可以实现容灾

DataID 配置

  • 指定 spring.profile.active(application.yaml) 和配置文件的 DataID 来使不同环境下读取不同的配置
  • 默认空间 + 默认分组 + 新建 dev 和 test 两个 DataID
  • 通过 spring.profile.active 属性就能进行多环境下配置文件的读取
  • 就是按照先前添加配置的方式,模仿 test 配置文件,新建一个 dev 配置文件,nacos-config-client-dev.yaml,内容如下
config:
info: "Config info for 「dev」, from nacos config center, version = 1"
  • 变为两个 DataId,并且属于同一个 Group


  • 修改 spring.profile.active 属性就能进行多环境下配置文件的读取,从 test 切换到 dev
修改 application.yaml
spring:
profiles:
#active: test
active: dev #表示开发环境

测试

  • 重启 3377
  • 访问 http://localhost:3377/config/info
  • 得到响应 Config info for 「dev」, from nacos config center, version = 1,已经切换到了 dev 环境的配置文件

Group 配置

  • 通过 Group 实现环境区分
  • 默认 Group 为 DEFAULT_GROUP

新建 Group

  • 在创建 DataId 时,填写 Group 栏目即可
  • 新建一个 DataId : nacos-config-client-info.yaml,Group 设置为 DEV_GROUP
config:
info: "nacos-config-client-info.yaml, 「 DEV_GROUP 」, version = 1"

  • 再新建一个 DataId : nacos-config-client-info.yaml,Group 设置为 TEST_GROUP


  • 在两个不同的 Group 中,存在同名的配置文件


微服务指定 Group

  • bootstrap.yaml 中,在先前配置的基础上,添加 group 配置即可
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式配置
group: TEST_GROUP
# namespace: 9a770128-f22f-40a3-b060-7488e1e4a7bc
# ${spring.application.name}-${spring.profile.active}.${file-extension}
#${prefix}-${spring.profile.active}.${file-extension}

  • 这样就回去读取 TEST_GROUP 分组下的 nacos-config-client-info.yaml 文件

测试

  • 重启 3377
  • 访问 http://localhost:3377/config/info
    • 响应 nacos-config-client-info.yaml, 「 TEST_GROUP 」, version = 1
    • 可以看到读取了 TEST_GROUP 分组的配置文件

Namespace 配置

新建 NameSpace

  • 新建 devtest 两个 Namespace
  • 命名空间 - 新建命名空间


  • 在配置列表可以看到已经出现了新增的命名空间

新建 DataId

  • 在新的 Namespace 下新建 DataId 配置文件


  • 修改 bootstrap.yaml 添加 namesapce 属性,值为 命名空间 ID
server:
port: 3377
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 #Nacos服务注册中心地址
config:
server-addr: localhost:8848 #Nacos作为配置中心地址
file-extension: yaml #指定yaml格式配置
group: DEV_GROUP
namespace: 6ce749f4-8ff9-4bcb-82d3-948b04411c8b
# ${spring.application.name}-${spring.profile.active}.${file-extension}
#${prefix}-${spring.profile.active}.${file-extension}

测试

  • 重启 3377
  • 访问 http://localhost:3377/config/info
  • 响应 Config info for 「dev」, from nacos config center 「dev NameSpace」, 「 DEV_GROUP 」, version = 1
    • 可见已经从 dev namesapceDEV_GROUP 读取了 nacos-config-client-dev.yaml 配置文件