配置中心

问题

  1. 静态化配置

大多数在项目配置写在例如 application.yml,然后将各类参数配置、应用配置、环境配置、安全配置、业务配置都写到这个文件里。当项目代码逻辑中需要使用配置的时候,就从这个配置文件中读取。这种做法虽然简单,但如果参数需要修改,就需要重启运行中的项目才能生效

  1. 配置文件无法区分环境。

由于配置文件是放在项目中的,但是我们项目可能会有多个环境,例如:测试环境、预发布环境、生产环境。每一个环境所使用的配置参数理论上都是不同的,所以我们在配置文件中根据不同环境配置不同的参数,这些都是手动维护,在项目发布的时候,极其容易因开发人员的失误导致出错。

  1. 配置文件过于分散

如果一个项目中存在多个逻辑模块独立部署,每个模块所使用的配置内容又不相同,传统的做法是会在每一个模块中都放一个配置文件,甚至不同模块的配置文件格式还不一样。那么长期的结果就是配置文件过于分散混乱,难以管理

  1. 配置修改无法追溯

因为采用的静态配置文件方式,所以当配置进行修改之后,不容易形成记录,更无法追溯是谁修改的、修改时间是什么、修改前是什么内容。既然无法追溯,那么当配置出错时,更没办法回滚配置了。

目标

是否有一种方法能在不重启项目也能动态修改配置呢?

解决办法

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
<!-- using in application.yml, surrounded with @ -->
<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>
<!-- if default environment -->
<activeByDefault>true</activeByDefault>
</activation>
</profile>
</profiles>

参考资料