写在前面
本文参照Spring官方文档,并实现了代码(源码地址),在此做下笔记;
前文 讲了 Nacos
的服务注册与发现,本文讲解如何将 Nacos
用作配置中心。
入门
在前文 provider-app
模块的 pom
文件中加入下面的依赖项:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
Nacos
的配置是由 DataId
和 Group
唯一确定的。现在,让我们通过 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
上存在三个文件,分别为:
- provider-user.properties:上文已经有了该文件;
- provider-user-test.properties: 测试环境的该文件,修改文件内容来做区分;
- 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
端点,该端点暴露了以下内容:
- Sources:当前应用程序的配置数据信息;
RefreshHistory
: 配置的刷新历史信息;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
中的配置文件。
有关 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
还正处于一个孩童期,还有很多新的功能没有完成或加入,但,让我们对这个充满朝气的小孩儿保持期待吧!
我与风来
认认真真学习,做思想的产出者,而不是文字的搬运工。
但行善事,莫问前程。