前言
-
背景介绍
在项目中,通常一些信息不能硬编码到代码中,例如数据库链接、账号信息等。因此需要将这些数据写到配置文件中,在项目中读取,从而满足通过修改配置文件而实现轻量迭代的需求。
-
技术选型
Go项目中通常使用toml格式文件作为配置文件,但由于之前一直从事Java开发,默认初始化配置文件格式为yaml;
解析yaml格式配置文件的方式一般有yaml.v2和Viper两种,本文以Viper作为技术选型。
实现过程
安装Viper组件
-
执行命令
# Go1.17版本 go install github.com/spf13/viper@latest
编写配置文件
-
yaml配置
apiVersion: v1 kind: KafkaCluster2 metadata: name: kafka-operator labels: config1: address: kafka-operator-labels-01 id: kafka-operator-labels-02 name: mysql-example-cluster-master nodeName: 172.16.91.21 role: master config2: address: kafka-operator-labels-01 id: kafka-operator-labels-02 name: mysql-example-cluster-slave nodeName: 172.16.91.110 role: slave spec: replicas: 1 name: kafka-controller image: 172.16.26.4:5000/nginx ports: 8088 conditions: - containerPort: 8080 requests: cpu: "0.25" memory: "512Mi" limits: cpu: "0.25" memory: "1Gi" - containerPort: 9090 requests: cpu: "0.33" memory: "333Mi" limits: cpu: "0.55" memory: "5Gi"
编写Go方法
-
创建入口函数
package main import ( "encoding/json" "fmt" "github.com/spf13/viper" _ "gopkg.in/yaml.v2" "os" ) type KafkaCluster struct { ApiVersion string `yaml:"apiVersion"` Kind string `yaml: "kind"` Metadata Metadata `yaml: "metadata"` Spec Spec `yaml: "spec"` } type Metadata struct { Name string `yaml:"name"` //map类型 Labels map[string]*NodeServer `yaml:"labels"` } type NodeServer struct { Address string `yaml: "address"` Id string `yaml: "id"` Name string `yaml: "name"` //注意,属性里,如果有大写的话,tag里不能存在空格 //如yaml: "nodeName" 格式是错误的,中间多了一个空格,不能识别的 NodeName string `yaml:"nodeName"` Role string `yaml: "role"` } type Spec struct { Replicas int `yaml: "replicas"` Name string `yaml: "name"` Image string `yaml: "iamge"` Ports int `yaml: "ports"` //slice类型 Conditions []Conditions `yaml: "conditions"` } type Conditions struct { ContainerPort string `yaml:"containerPort"` Requests Requests `yaml: "requests"` Limits Limits `yaml: "limits"` } type Requests struct { CPU string `yaml: "cpu"` MEMORY string `yaml: "memory"` } type Limits struct { CPU string `yaml: "cpu"` MEMORY string `yaml: "memory"` } // 主程序入口 func main() { var c KafkaCluster //读取yaml配置文件, 将yaml配置文件,转换struct类型 conf := c.getConf() //将对象,转换成json格式 data, err := json.Marshal(conf) if err != nil { fmt.Println("err:\t", err.Error()) return } //最终以json格式,输出 fmt.Println("data:\t", string(data)) } //读取Yaml配置文件,并转换成KafkaCluster对象 struct结构 func (kafkaCluster *KafkaCluster) getConf() *KafkaCluster { //获取项目的执行路径 path, err := os.Getwd() if err != nil { panic(err) } vip := viper.New() vip.AddConfigPath(path + "/config") //设置读取的文件路径 vip.SetConfigName("application") //设置读取的文件名 vip.SetConfigType("yaml") //设置文件的类型 //尝试进行配置读取 if err := vip.ReadInConfig(); err != nil { panic(err) } err = vip.Unmarshal(&kafkaCluster) if err != nil { panic(err) } return kafkaCluster }
总结
-
注意事项
yaml配置文件里,如果属性里存在大写的话,定义对应的属性时,一定不能有空格,可以参考上面例子中NodeServer里的说明
参考链接
-
Go语言之读取yaml配置文件,转换成struct结构,json形式输出
https://blog.51cto.com/xingej/2115258
-
Golang使用第三方包viper读取yaml配置信息操作
http://www.zzvips.com/article/144547.html
-
Go实战(一)–读取Yaml格式的配置文件
https://studygolang.com/articles/33188?fr=sidebar