问题
- 静态化配置
大多数在项目配置写在例如
application.yml,然后将各类参数配置、应用配置、环境配置、安全配置、业务配置都写到这个文件里。当项目代码逻辑中需要使用配置的时候,就从这个配置文件中读取。这种做法虽然简单,但如果参数需要修改,就需要重启运行中的项目才能生效。
- 配置文件无法区分环境。
由于配置文件是放在项目中的,但是我们项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置参数理论上都是不同的,所以我们在配置文件中根据不同环境配置不同的参数,这些都是手动维护,在项目发布的时候,极其容易因开发人员的失误导致出错。
- 配置文件过于分散
如果一个项目中存在多个逻辑模块独立部署,每个模块所使用的配置内容又不相同,传统的做法是会在每一个模块中都放一个配置文件,甚至不同模块的配置文件格式还不一样。那么长期的结果就是配置文件过于分散混乱,难以管理。
- 配置修改无法追溯
因为采用的静态配置文件方式,所以当配置进行修改之后,不容易形成记录,更无法追溯是谁修改的、修改时间是什么、修改前是什么内容。既然无法追溯,那么当配置出错时,更没办法回滚配置了。
目标
是否有一种方法能在不重启项目也能动态修改配置呢?
解决办法
nacos 的配置中心提供了这个功能。
我们可以在配置管理 ->
配置列表中创建我们的配置,每次修改这个配置时服务会热更新而不用重启。
同时,我们在项目的每个服务的配置文件 application.yml 中修改如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| server: port: xxx
spring: application: name: @artifactId@ cloud: nacos: discovery: server-addr: ${NACOS_HOST:localhost}:${NACOS_PORT:8848} namespace: @nacos.namespace@ config: server-addr: ${spring.cloud.nacos.discovery.server-addr} namespace: @nacos.namespace@ config: import: - optional:nacos:application-@profiles.active@.@file.extension@ - optional:nacos:${spring.application.name}-@profiles.active@.@file.extension@
|
其中,@artifactId@ 在当前服务的 pom.xml
中配置,也即当前服务的 artifactId
1
| <artifactId>the_artifactId_to_change</artifactId>
|
其他@@的内容在最外层的 pom.xml
中配置,主要是用于区分开发(dev)、测试(test)、上线(prod)配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| <profiles> <profile> <id>dev</id> <properties> <profiles.active>dev</profiles.active> <nacos.namespace>the_namspace_to_change</nacos.namespace> <file.extension>yml</file.extension> </properties> <activation> <activeByDefault>true</activeByDefault> </activation> </profile> </profiles>
|
参考资料