Spring Cloud配置服务
Spring Cloud配置服务
背景
2019年项目启动初,由于时间节点非常紧迫,也没有看到引入配置服务的好处,我们没有引入配置服务.这导致了各个服务的配置文件存在大量重复内容,不便于维护.我们在部署的时候,通过容器环境变量以及Docker Compose本身引用环境变量进行配置(当时采用Docker Compose部署),解决了对各个服务的集中配置问题.2020年上半年开发了服务配置模块,但是各个服务没有集成.
2021年底,系统需要适配信创环境,不能部署在Docker容器中,只能通过RPM包的形式安装部署到物理机上.由于RPM包安装时不能指定安装参数,信创环境对程序包有严格要求,我们通过Maven插件的方式在系统编译过程中为不同项目注入不同配置参数,结合Systemd的环境变量配置,解决了系统统一配置问题,但是也导致不同实施项目需要特制的安装包.
为何引入
- 解决了服务配置文件冗余,提高系统的可维护性.
- 信创环境,相同架构下可以共享部分安装包.
- 集中管理服务配置文件,可拓展GUI方式配置服务.
- 仅仅是改变服务配置文件读取方式,对系统改动不大.
不利影响
- 服务本地调试开发,不能直接看到服务配置文件.
- 各个服务依赖于配置服务模块.
设计
配置文件设计
Spring配置文件
我们对Spring配置文件根据运行环境,配置所属功能进行拆分,对公共配置进行提取,形成了模块化的配置文件,如下图所示.
普通配置文件
我们对普通配置文件根据运行环境进行划分,服务实例可根据运行环境加载特定运行环境的普通配置文件.
安全性
配置服务的安全性
待实现.
配置项加密
待实现.
秘钥管理
待实现.
实现
服务端
配置服务基于Spring Cloud Config Server实现,采用文件系统作为存储后端.
配置参考
1 | spring: |
客户端
客户端引入Spring Cloud Config接入配置服务.
配置参考
1 | spring: |
如何集成新的服务
配置服务端
- 在配置文件仓库中,新建一个文件夹(名称与待接入服务名称保持一致${spring.application.name}),用于保存待接入服务的配置文件,将该文件夹加入到配置服务配置文件搜索路径列表中.
- 将待接入服务的配置文件保存到给目录下,服务公共配置文件的名称须与服务名称保持一致,为${spring.application.name}.yml,特定运行环境的配置文件命名必须为${spring.application.name}-${profile}.yml,当然你也可以使用一个内部分区的文件保存所有运行环境的配置.
- 将服务配置文件中的公共部分剔除掉,仅保留服务特有的配置项即可.
配置客户端配置
- 加入Spring Cloud Config依赖项
1 | <dependency> |
- 删除以前的配置文件,新建bootstrap.yml配置文件,内容参考,客户端的配置文件.
注意事项
- 对于普通配置文件,其路径需要改成URI网络路径.
- 客户端的spring.profiles.active配置项的第一项必须是指定运行环境,其他组合项,根据服务的实际需要进行配置.