Spring Cloud配置服务

Spring Cloud配置服务

背景

2019年项目启动初,由于时间节点非常紧迫,也没有看到引入配置服务的好处,我们没有引入配置服务.这导致了各个服务的配置文件存在大量重复内容,不便于维护.我们在部署的时候,通过容器环境变量以及Docker Compose本身引用环境变量进行配置(当时采用Docker Compose部署),解决了对各个服务的集中配置问题.2020年上半年开发了服务配置模块,但是各个服务没有集成.

2021年底,系统需要适配信创环境,不能部署在Docker容器中,只能通过RPM包的形式安装部署到物理机上.由于RPM包安装时不能指定安装参数,信创环境对程序包有严格要求,我们通过Maven插件的方式在系统编译过程中为不同项目注入不同配置参数,结合Systemd的环境变量配置,解决了系统统一配置问题,但是也导致不同实施项目需要特制的安装包.

为何引入

  • 解决了服务配置文件冗余,提高系统的可维护性.
  • 信创环境,相同架构下可以共享部分安装包.
  • 集中管理服务配置文件,可拓展GUI方式配置服务.
  • 仅仅是改变服务配置文件读取方式,对系统改动不大.

不利影响

  • 服务本地调试开发,不能直接看到服务配置文件.
  • 各个服务依赖于配置服务模块.

设计

配置文件设计

Spring配置文件

我们对Spring配置文件根据运行环境,配置所属功能进行拆分,对公共配置进行提取,形成了模块化的配置文件,如下图所示.

普通配置文件

我们对普通配置文件根据运行环境进行划分,服务实例可根据运行环境加载特定运行环境的普通配置文件.

安全性

配置服务的安全性

待实现.

配置项加密

待实现.

秘钥管理

待实现.

实现

服务端

配置服务基于Spring Cloud Config Server实现,采用文件系统作为存储后端.
配置参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
spring:
application:
name: ${APPLICATION_NAME:config-server}
cloud:
config:
server:
native:
search-locations:
- file:repo
bootstrap: true
profiles:
active:
- dev
- native
eureka:
client:
service-url:
defaultZone: ${REGISTER_CENTER:http://localhost:12331/eureka}

---
spring:
profiles: dev
server:
port: 8888
eureka:
instance:
prefer-ip-address: true
---
spring:
profiles: prod
server:
port: 80
eureka:
instance:
prefer-ip-address: true

客户端

客户端引入Spring Cloud Config接入配置服务.
配置参考

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
application:
name: test
profiles:
active:
- dev
- eureka
- db
- druid
- kafka
- redis
cloud:
config:
uri: ${CONFIG_SERVER:http://localhost:12333}
logging:
config: ${spring.cloud.config.uri}/${spring.application.name}/${spring.profiles.active[0]}/main/log4j2.xml

如何集成新的服务

配置服务端

  1. 在配置文件仓库中,新建一个文件夹(名称与待接入服务名称保持一致${spring.application.name}),用于保存待接入服务的配置文件,将该文件夹加入到配置服务配置文件搜索路径列表中.
  2. 将待接入服务的配置文件保存到给目录下,服务公共配置文件的名称须与服务名称保持一致,为${spring.application.name}.yml,特定运行环境的配置文件命名必须为${spring.application.name}-${profile}.yml,当然你也可以使用一个内部分区的文件保存所有运行环境的配置.
  3. 将服务配置文件中的公共部分剔除掉,仅保留服务特有的配置项即可.

配置客户端配置

  1. 加入Spring Cloud Config依赖项
1
2
3
4
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
  1. 删除以前的配置文件,新建bootstrap.yml配置文件,内容参考,客户端的配置文件.

注意事项

  1. 对于普通配置文件,其路径需要改成URI网络路径.
  2. 客户端的spring.profiles.active配置项的第一项必须是指定运行环境,其他组合项,根据服务的实际需要进行配置.

参考

1.Spring Cloud Config Reference