предисловие
В общем поле языка GO --- поле контейнера мы часто используем форму файла yaml для определения различных объектов ресурсов. Поэтому инженеров k8s еще называют инженерами yaml. Однако при повседневном использовании наша обработка файлов yaml обычно заключается в чтении файла yaml и получении конфигурации в файле yaml. Но что, если нам нужно сгенерировать yaml-файл из кода? Эта статья пройдет"github.com/spf13/viper"
пакет для реализации этой функциональности
Как читать yaml-файл
Прежде чем мы поговорим о том, как его сгенерировать, давайте поговорим о том, как читать файл yaml.Опытные студенты могут пропустить следующую главу.
orgname: baas
channelname: publicchain
peer:
- peer-0-baas
- peer-1-baas
orderer:
baas:
- ServerHostName: orderer-0-baas:7050
Address: 192.168.9.159:30004
- ServerHostName: orderer-1-baas:7050
Address: 192.168.9.159:30005
- ServerHostName: orderer-2-baas:7050
Address: 192.168.9.159:30006
baas2:
- ServerHostName: orderer-0-baas2:7050
Address: 192.168.9.166:30012
Выше приведен простой профиль проекта yaml, как использовать Golang для чтения информации о конфигурации?
полное чтение
type ConfigStruct struct {
OrgName string `yaml:"orgname"`
ChannelName string `yaml:"channelname"`
Peer []string `yaml:"peer"`
Orderer map[string][]OrdererInfo `yaml:"ORDERER"`
}
type OrdererInfo struct {
ServerHostName string `yaml:"ServerHostName"`
Address string `yaml:"Address"`
}
Во-первых, мы должны определить структуру, соответствующую конфигурации.Как показано выше, в yaml есть четыре специальных тега.
название ярлыка | использовать |
---|---|
omitempty | Это поле игнорируется, если значение пусто. Вы также можете реализовать интерфейс IsZero() для соответствующей структуры этого поля.Если соответствующая структура реализует этот интерфейс, будет определено, игнорировать ли поле в соответствии с возвращаемым значением интерфейса. |
flow | Этот тег используется для указания того, что вы хотите использовать потоковый режим вместо блочного. |
inline | Встроенный тип |
- | игнорировать это поле навсегда |
Затем читаем файл через viper
var configViperConfig = viper.New()
configViperConfig.SetConfigName("config")
configViperConfig.SetConfigType("yaml")
//读取配置文件内容
if err = configViperConfig.ReadInConfig(); err != nil {
panic(err)
}
var c ConfigStruct
if err = configViperConfig.Unmarshal(&c); err != nil {
panic(err)
}
Таким образом, мы можем передать кодc
Переменные получают информацию о конфигурации
одноточечное чтение
Если нам нужна только определенная конфигурация в информации о конфигурации, мы также можем прочитать одну конфигурацию
var configViperConfig = viper.New()
configViperConfig.SetConfigName("config")
configViperConfig.SetConfigType("yaml")
//读取配置文件内容
if err = configViperConfig.ReadInConfig(); err != nil {
panic(err)
}
На данный момент мы предоставляем его методу Get через пакет viper.
orgname := configViperConfig.Get("orgname")
или через метод GetString
orgname := configViperConfig.GetString("orgname")
Как написать файл конфигурации
Есть также два способа сгенерировать файл yaml с помощью кода, что соответствует приведенному выше чтению.
Структура для создания файла yaml
Создав соответствующую структуру, а затем скопировав соответствующие поля и выполнив Marshal
type Conf struct {
Test []string `yaml:"array.test,flow"`
}
func main(){
data := `array.test: ["val1", "val2", "val3"]`
var conf Conf
yaml.Unmarshal([]byte(data), &conf)
data2, _ := yaml.Marshal(conf)
fmt.Printf("%s\n", string(data2))
}
Когда мы читали файл yaml выше, мы использовали метод Get пакета Viper.Раз есть Get, то естественно есть и Set.
configViper := viper.New()
configViper.Set("version", "1.0.0")
// ......
c := configViper.AllSettings()
bytes, err := yaml.Marshal(c)
if err != nil {
return nil, err
}
fmt.Println(string(bytes))
Первым параметром метода Set является ключ строкового типа, а вторым параметром значение типа интерфейса, поэтому если структура более сложная, можно записать в ключ структуру сложной части в виде структуры Ставить, но нужно в основном Поля структуры должны быть экспортируемыми, иначе их не может вызвать вайпер, а маршалу не получиться.