程序配置服务和热更新
前言
在开发过程中,因为不同环境中有不同的配置,所以往往一个项目要同时保存着不同环境的配置文件(dev
,test
,staging
,prd
)等。如果没有一个方便简洁的管理这些配置文件方式,排查问题也会变的麻烦。接下来介绍几种我所经历的几种配置文件管理方案
git 分支管理
顾名思义就是利用 git
的分支来管理不同环境的配置,比如dev
分支就是对应存放这dev
的配置文件。
优点
- 分支管理更符合开发的代码习惯,只关心本分支的代码和配置
缺点
- 不符合
git-flow
流程,如果test
配置有改动,那么就要直接编辑test
分支代码,而不是从dev
分支合并过去。排查配置相关问题不友善 - 一份配置文件就一个分支,维护代价太大,有些舍本琢末了。
热更新方案无
所有配置文件都放在项目下
这种方式就是把所有的配置文件集中放在项目下的某个目录,用环境变量的方式去加载指定的配置文件
|
|
优点
- 配置统一集中管理,修改方便
缺点
- 配置文件过多容易使项目结构变的“难看”,判断依赖过多,不优雅。
- 无法做到热更新,配置更改需要重新发布代码
热更新方案无
配置中心
将配置文件都放到三方的服务中保管,比如nacos
、Apollo
等配置中心
- nacos:https://nacos.io/zh-cn/docs/what-is-nacos.html
- Apollo:https://www.apolloconfig.com/#/zh/README
优点
- 集中化管理配置,配置文件“不落地”
- 有相关
sdk
调用,支持热更新等高级功能
缺点
- 要维护一个高可用的 三方服务 增加了维护成本
热更新方案
- 需要另外编码去开发
云原生方式管理(推荐)
将应用配置和密匙等文件交由k8s
的configMap
、secret
来管理,容器启动时候,直接将configMap
、secret
挂载进pod
即可使用
|
|
相关资料连接
pod
挂载configMap
:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/configMap
挂载后热更新实验:https://jimmysong.io/kubernetes-handbook/concepts/configmap-hot-update.html将多个
secret
或configMap
挂载到一个目录下:https://stackoverflow.com/questions/59855142/use-a-single-volume-to-mount-multiple-files-from-secrets-or-configmaps
热更新方案
采用一个三方插件监控 secret
和configMap
变动,如果有变动,则更新pod
做到热更新
总结
以上几种方式都是笔者个人开发中所使用或经历过的,对于一般的传统小型程序采用git或者都放入一个项目下即可,如果是公司的业务都上云了,服务都在k8s
中那么最后一种云原生的管理方式是我个人比较推荐的。