Spring Cloud Alibaba Nacos Config 初识

1,742 阅读5分钟

参考官方文档中描述:

在构建云原生应用时,Nacos是一个易使用的动态服务发现、配置、管理的平台。

使用Spring Cloud Alibaba Nacos Config,可以通过Spring Cloud的编程模型迅速接入Nacos配置管理功能。

Spring Cloud Alibaba Nacos Config是在Spring Cloud Alibaba服务中利用Nacos作为配置中心,可以从中获得配置信息,配置中心配置更新后,可以热更新得到最新的配置信息。

在Nacos中创建配置

上一篇讲Nacos Discovery服务发现时涉及了Nacos的安装、启动、管理页面,这里不再赘述。

Nacos启动后,访问管理页面,在配置管理/配置列表菜单可以新建配置:

我这里按照这个测试填写:

其中:

  • Data ID,这个相当于配置文件名称,这个名称一会儿需要在我们需要获取这个配置的服务中配置(不配置的话默认是spring.application.name),文件扩展名在服务中同样可以配置(默认为properties)
  • Group,直接使用了默认的DEFAULT_GROUP

依赖引入

Spring Cloud Alibaba提供了Nacos Config相关的依赖,引入后即可根据配置文件从配置中心获取配置及获取配置更新。

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
</dependency>

Nacos Config 配置

因为Spring Boot在加载配置文件时,会先加载bootstrap(.yml或.properties)配置文件,再加载application(.yml或.properties)配置。

  • bootstrap,顾名思义,是系统启动级别的配置,

    • 先加载
    • 配置的属性不能被覆盖也用于一些加密解密场景
    • 常用来从额外配置资源中加载配置,可以用于从Spring Cloud Config或Nacos Config等配置中心中加载配置
  • applicaiton,是应用级别的配置,晚于bootstrap。

所以在这里加一个文件名为bootstrap.yml的配置:

spring:
  application:
    name: nacos-config
  cloud:
    nacos:
      config:
        server-addr: 192.168.162.1:8848
        file-extension: yaml

这里的配置中${spring.application.name}.${file-extension:properties}即对应前面在Nacos中添加配置时的DataIdGroup不配置默认即为DEFAULT_GROUP

启动读取配置测试

我在启动Spring Boot服务时尝试获取在Nacos配置中心所配置的属性:

ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(ConfigApplication.class, args);
while (true){
    TimeUnit.SECONDS.sleep(1);
    String property = configurableApplicationContext.getEnvironment().getProperty("itlq.spring.version");
    System.out.println("nacos-config property: " + property);
}

这是可以看到控制台打印:

nacos-config property: 0.1

热更新测试

Spring Cloud Nacos Config服务默认会根据Nacos Config配置中心的变化实时加载最新的配置,我们尝试在Nacos管理页面编辑配置信息,将其改为:

不需要重启,可以看到服务的循环中已经得到了最新的配置

nacos-config property: 0.1 #旧配置
2020-06-27 23:13:04.227  INFO 14920 --- [.168.162.1_8848] c.a.c.n.c.NacosPropertySourceBuilder     : Loading nacos data, dataId: 'nacos-config.yaml', group: 'DEFAULT_GROUP'
2020-06-27 23:13:04.228  INFO 14920 --- [.168.162.1_8848] b.c.PropertySourceBootstrapConfiguration : Located property source: [BootstrapPropertySource {name='bootstrapProperties-nacos-config.yaml'}]
2020-06-27 23:13:04.230  INFO 14920 --- [.168.162.1_8848] o.s.boot.SpringApplication               : No active profile set, falling back to default profiles: default
2020-06-27 23:13:04.237  INFO 14920 --- [.168.162.1_8848] o.s.boot.SpringApplication               : Started application in 3.521 seconds (JVM running for 31.649)
2020-06-27 23:13:04.255  INFO 14920 --- [.168.162.1_8848] o.s.c.e.event.RefreshEventListener       : Refresh keys changed: [itlq.spring.version]
nacos-config property: 0.1.3 #已更新

@RefreshScope注解

Spring Cloud提供了一个Bean生命周期相关的注解@RefreshScope,Bean定义时加上它之后,可以在运行时刷新相关配置数据,方式是在数据更新后,重新创建新的Bean,以读取新的配置。用以下代码测试:

@RestController
@RefreshScope
public class VersionController {

    @Value("${itlq.spring.version}")
    String version;

    @RequestMapping("/version")
    public String version(){
        // 此处打印实际的Bean对象
        System.out.println(this);
        return version;
    }
}

在更改配置前后输出,发现返回的配置信息更新了,同时,打印的Bean对象也有两个:

top.itlq.spring.cloud.config.VersionController@44141779
nacos-config property: 0.1.3

top.itlq.spring.cloud.config.VersionController@1f1aa94d
nacos-config property: 0.1.2

说明配置数据通过创建新的Bean刷新了。

配置profile支持

Spring Cloud Nacos Config服务默认从配置中心读取${spring.application.name}.${file-extension:properties}的同时,也会读取DataId${spring.application.name}-${profile}.${file-extension:properties}的配置。

  • 其中profile使用spring.profiles.active配置,在服务中配置,必须配置在bootstrap配置文件中。

  • spring.profiles.active也可以使用Java启动参数配置

    java -Dspring.profiles.active=dev
    

Nacos命名空间

Nacos命名空间主要的作用是隔离配置,相同的Data Id和Group可以在不同的命名空间中存在,可以在Nacos管理页面的命名空间菜单下进行维护,如下图,维护了一个test,用于测试环境下的配置

在配置管理页面可以配置不同命名空间的配置

在服务中配置命名空间:

spring:
  cloud:
    nacos:
      config:
        namespace: c0b7b744-b29b-49d2-bd8d-61a40f2b1e2e

配置完成后,这里将读取名称为test命名空间的配置,如果不配置spring.cloud.nacos.config,将读取默认命名空间pulic下的配置

自定义Group和Data Id

Group

使用spring.cloud.nacos.config.group配置

Data Id

其中nacos-config为服务名,可作为数组配置多组Data Id、Group默认不可refresh,需要手动指定,data-id中需要直接指定完整的配置id(包括扩展名)

spring.cloud.nacos.config.nacos-config[0].data-id=ext-config-common03.properties
spring.cloud.nacos.config.nacos-config[0].group=REFRESH_GROUP
spring.cloud.nacos.config.nacos-config[0].refresh=true

也可以通过spring.cloud.nacos.config.shared-dataidsspring.cloud.nacos.config.refreshable-dataids指定,后者可以热更新

spring.cloud.nacos.config.shared-dataids=bootstrap-common.properties,all-common.properties
spring.cloud.nacos.config.refreshable-dataids=bootstrap-common.properties

Nacos Config端点

Spring Cloud Alibaba Nacos Config服务对外暴露了端点nacos-config,启动服务访问http://ip-addr/actuator/nacos-config(注意要在配置中加关于暴露web端点的配置),可以得到以下内容:

  • NacosConfigProperties,包含Nacos Config的一些配置信息
  • RefreshHistory,服务启动后配置更新的记录
  • Sources,配置源和同步时间

Nacos Config其它配置

文档

总结

  • Spring Cloud Alibaba Nacos Config可以启动时从Nacos Config配置中心读取配置并在服务中应用
  • Spring Cloud Alibaba Nacos Config支持热更新、profile、命名空间、自定义Data Id和Group等配置管理功能
  • 只是简单阅读、测试了可以实现的功能,具体实现的原理还需要研究后补充。TODO

参考

Spring Cloud Alibaba:spring-cloud-alibaba-group.github.io/github-page…

spring bootstrap 与 applicaiton配置文件:blog.csdn.net/snow_7/arti…

Nacos:nacos.io/zh-cn/docs/…