程序配置服务和热更新

前言

​ 在开发过程中,因为不同环境中有不同的配置,所以往往一个项目要同时保存着不同环境的配置文件(devteststagingprd)等。如果没有一个方便简洁的管理这些配置文件方式,排查问题也会变的麻烦。接下来介绍几种我所经历的几种配置文件管理方案

git 分支管理

​ 顾名思义就是利用 git 的分支来管理不同环境的配置,比如dev分支就是对应存放这dev的配置文件。

优点

  • 分支管理更符合开发的代码习惯,只关心本分支的代码和配置

缺点

  • 不符合git-flow流程,如果test配置有改动,那么就要直接编辑test分支代码,而不是从dev分支合并过去。排查配置相关问题不友善
  • 一份配置文件就一个分支,维护代价太大,有些舍本琢末了。

热更新方案无

所有配置文件都放在项目下

​ 这种方式就是把所有的配置文件集中放在项目下的某个目录,用环境变量的方式去加载指定的配置文件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
package main

func main(){
    switch env{
        case:"dev":
        load("dev.config")
        case:"test":
        load("test.config")
        ...
        default:
        load("local.config")
    }
    
}

优点

  • 配置统一集中管理,修改方便

缺点

  • 配置文件过多容易使项目结构变的“难看”,判断依赖过多,不优雅。
  • 无法做到热更新,配置更改需要重新发布代码

热更新方案无

配置中心

​ 将配置文件都放到三方的服务中保管,比如nacosApollo等配置中心

  • nacos:https://nacos.io/zh-cn/docs/what-is-nacos.html
  • Apollo:https://www.apolloconfig.com/#/zh/README

优点

  • 集中化管理配置,配置文件“不落地”
  • 有相关 sdk 调用,支持热更新等高级功能

缺点

  • 要维护一个高可用的 三方服务 增加了维护成本

热更新方案

  • 需要另外编码去开发

云原生方式管理(推荐)

​ 将应用配置和密匙等文件交由k8sconfigMapsecret来管理,容器启动时候,直接将configMapsecret挂载进pod即可使用

 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
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: my-nginx
spec:
  replicas: 1
  template:
    metadata:
      labels:
        run: my-nginx
    spec:
      containers:
      - name: my-nginx
        image: harbor-001.jimmysong.io/library/nginx:1.9
        ports:
        - containerPort: 80
        volumeMounts:
        - name: config-volume
          mountPath: /etc/config
      volumes:
        - name: config-volume
          configMap:
            name: special-config
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: special-config
  namespace: default
data:
  log_level: INFO

相关资料连接

  • pod 挂载 configMap:https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/

  • configMap 挂载后热更新实验:https://jimmysong.io/kubernetes-handbook/concepts/configmap-hot-update.html

  • 将多个secretconfigMap挂载到一个目录下:https://stackoverflow.com/questions/59855142/use-a-single-volume-to-mount-multiple-files-from-secrets-or-configmaps

热更新方案

采用一个三方插件监控 secretconfigMap变动,如果有变动,则更新pod做到热更新

总结

​ 以上几种方式都是笔者个人开发中所使用或经历过的,对于一般的传统小型程序采用git或者都放入一个项目下即可,如果是公司的业务都上云了,服务都在k8s中那么最后一种云原生的管理方式是我个人比较推荐的。