配置文件初始化思路要点一二三

配置文件字段如下

1
2
3
4
type Config struct {
	Server    Server            `json:"server,omitempty" yaml:"server,omitempty"`
	Ingresses netv1.IngressSpec `json:"ingresses,omitempty" yaml:"ingresses,omitempty"`
}

完整配置如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
server:
  port: 8080

ingresses:
  rules:
    - host: www.baidu.com
      http:
        paths:
        - backend:
            service:
              name: /search
              port:
                number: 80
          pathType: ImplementationSpecific
          # pathType: Exact
          # pathType: Prefix

Config 文件

读取多个文件后合并最终结果。 可以将不同的功能配置放在不同的文件中, 在数据内容多的情况下更有利于操作。

除此之外, 还可以按照环境读取不同的配置文件( config.master.yml / config.develop.yml ), 这种方式在 CICD 中就可以体现出优势了。

例如, 之后在读取 k8s 信息渲染路由配置文件时, 可以只更改 config.ing.yml 文件。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
func (cfg *Config) ReadConfig() {
	for _, f := range []string{"config.default.yml", "config.yml", "config.server.yml", "config.ing.yml"} {
		err := cfg.readconfig(f)
		if err != nil {
			logrus.Warnf("read file %s failed: %v", f, err)
			continue
		}
	}
}

func (cfg *Config) readconfig(file string) error {
	b, err := os.ReadFile(file)
	if err != nil {
		logrus.Warnf("read config failed: %v", err)
		return err
	}

	return yaml.Unmarshal(b, cfg)
}

除了读取配置文件之外, 生成 默认的配置文件也是非常重要的。 为所设计的 配置字段 创建一个默认值, 在程序启动的时候生成默认配置, 如此任何配置字段的都会在程序启动时体现出来, 而不必再花时间进行文档整理。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18

func NewConfig() *Config {
	return &Config{
		Server: Server{
			Port: 8080,
		},
	}
}

func (cfg *Config) Initial() *Config {

	b, _ := yaml.Marshal(cfg)
	f, _ := os.OpenFile("config.default.yml", os.O_CREATE|os.O_RDWR|os.O_TRUNC, 0644)
	defer f.Close()

	f.Write(b)
	return cfg
}

Config 字段

config 字段在设计的时候直接使用了 k8s 的 Ingress 字段。 方便之后直接使用,不再做转换。

1
2
3
4
type Config struct {
	Server    Server            `json:"server,omitempty" yaml:"server,omitempty"`
	Ingresses netv1.IngressSpec `json:"ingresses,omitempty" yaml:"ingresses,omitempty"`
}