SpringCloudAlibaba之Nacos配置中心

写在前面

本文参照Spring官方文档,并实现了代码(源码地址),在此做下笔记;


前文 讲了 Nacos 的服务注册与发现,本文讲解如何将 Nacos 用作配置中心

入门

在前文 provider-app 模块的 pom 文件中加入下面的依赖项:

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

Nacos 的配置是由 DataIdGroup 唯一确定的。现在,让我们通过 Nacos 控制台创建如下配置文件:

nacos配置创建过程
上面的配置文件创建成功以后,为 provider-app 项目的 application.yml 新增配置内容。现在,项目的配置文件变成了下面这样:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        ip: 192.168.3.18
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f
      config:
        shared-dataids: provider-user.properties
        server-addr: 127.0.0.1:8848
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f
  application:
    name: provider-app
server:
  port: 18083
management:
  endpoints:
    web:
      exposure:
        include: nacos-discovery

但这里需要注意,这个配置文件名 application.yml 需要修改为 bootstrap.yml (加载外部配置都会使用这样的文件命名)。为了查看配置注入的效果,修改启动类的 main 方法如下:

		ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosProviderDemoApplication.class, args);
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        System.out.println(environment.getProperty("username"));
        System.out.println(environment.getProperty("password"));

启动项目,控制台的打印结果正常!

保证 DataId 有着文件格式这样的后缀是一个好的习惯。


支持的配置文件格式

配置文件在控制台新建的时候需要选择格式,现在有 text、json、xml、yaml、html、properties 这几种格式。

现在,让我们换一种 yaml 格式的文件。我们将 provider-app 中除了 Nacos 配置相关外的其它配置全放入这个新建的 yaml 文件中:

spring:
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
        ip: 192.168.3.18
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f
  application:
    name: provider-app
server:
  port: 18083
management:
  endpoints:
    web:
      exposure:
        include: nacos-discovery

控制台创建对应文件,data Id 为 provider_app_application.yml ,现在,修改项目的 bootstrap.yml 文件如下:

spring:
  cloud:
    nacos:
      config:
        shared-dataids: provider-user.properties,provider_app_application.yml
        server-addr: 127.0.0.1:8848
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f

重启应用程序,如果该服务正常注册到 nacos,那说明我们的外部配置已经生效了!


动态配置更新

为了能更好地观察到动态更新的效果,我们将启动类中的 main 方法修改为循环打印:

		while (true){
            System.out.println(environment.getProperty("username"));
            System.out.println(environment.getProperty("password"));
        }

bootstrap.yml 文件需要主动声明需要动态刷新的数据id,因为默认情况下并不支持:

spring:
  cloud:
    nacos:
      config:
        shared-dataids: provider-user.properties,provider_app_application.yml
        server-addr: 127.0.0.1:8848
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f
        refreshable-dataids: provider-user.properties

现在,观察控制台的打印结果。然后在 Nacos 上修改配置文件,再观察打印结果!


Profile 的支持

nacos 对 Spring 的 profile 也提供了良好的支持,假设现在,我们的 nacos 上存在三个文件,分别为:

  1. provider-user.properties:上文已经有了该文件;
  2. provider-user-test.properties: 测试环境的该文件,修改文件内容来做区分;
  3. provider-user-prod.properties: 生产环境的该文件,修改该文件内容来做区分;

然后,新增 bootstrap.properties 文件,在文件中添加如下内容:

这里必须使用 bootstrap.properties 文件!

spring.profiles.active=test

它的默认加载规则是:除了数据id 为 ${spring.application.name}.${file-extension:properties} 的文件会加载 ,${spring.application.name}-${profile}. ${file-extension:properties} 的文件也会被加载。

所以,遵照这个规则,我们修改 bootstrap.yml 文件如下,删除了 provider-user.properties 的声明,但在动态更新中的声明仍然需要保留:

spring:
  cloud:
    nacos:
      config:
        shared-dataids: provider_app_application.yml
        server-addr: 127.0.0.1:8848
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f
        refreshable-dataids: provider-user.properties
  application:
    name: provider-user

最终,我们仍然能够正常打印出结果!你可以通过程序运行时控制台的前几行打印信息观察到加载的文件。而且,修改 provider-user-test.properties 文件的内容也是支持动态刷新的。

我个人认为,这种环境支持很受限,因为它只能支持默认规则,并且它与 spring.application.name 有关。这个值还是唯一的,假设我们想让 provider_app_application.yml 这个配置也通过 profile 来在运行时选择加载的文件,我们除了将 spring.application.name 修改为 provider_app_application 以为,好像没有其它办法了,但这样 provider-user.properties 就没法支持了。

spring.profiles.active=test 除了放在 bootstrap.properties 文件中,还可以使用命令行传参:-Dspring.profiles.active=<profile>


Nacos 的端点

Nacos 提供了一个 nacos-config 端点,该端点暴露了以下内容:

  1. Sources:当前应用程序的配置数据信息;
  2. RefreshHistory: 配置的刷新历史信息;
  3. NacosConfigProperties : 展示了当前服务的 nacos 的基本配置信息;

我们仍然需要在配置中暴露该端点才能使用:

management:
  endpoints:
    web:
      exposure:
        include: nacos-discovery,nacos-config

由于上面,我们已经将配置放到了 Nacos 的配置管理中,所以,我们将这段内容加进去就好了(provider_app_application.yml 文件)。

现在,访问 http://192.168.3.18:18083/actuator/nacos-config ,得到如下内容:
nacos-config响应结果

结果中之所以有刷新历史,是因为我在程序启动后,修改了 nacos 中的配置文件。


有关 Nacos 配置管理的配置

具体的说明可以参考官方文档,或者 NacosConfigProperties 文件。

官方文件中关于这一节的说明有个强调,就是 dataId 必须要有文件后缀,所以不管怎样,文件后缀都加上!

这里还介绍另外一种配置方法(之前使用的是 shared-dataids),使用 ext-config 这种方式:

spring:
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: ecbbf883-5744-42e3-b448-09aabee90d7f
        refreshable-dataids: provider-user.properties
        ext-config:
          -
            dataId: provider_app_application.yml
            refresh: true
            group: DEFAULT_GROUP

这与之前的方式产生的效果是一样的,但它的粒度更细,能够针对单个数据文件!


总结

Nacos 的控制台界面非常清爽,使用起来也很方便。关于它的配置管理也很好理解。所以,本文只详细介绍了它的几种特性:动态更新、Profile,有关界面上的操作就未更多介绍了。

最后,Nacos 还正处于一个孩童期,还有很多新的功能没有完成或加入,但,让我们对这个充满朝气的小孩儿保持期待吧!


我与风来

认认真真学习,做思想的产出者,而不是文字的搬运工。
比心
但行善事,莫问前程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值