一、前言

很多人入门的go使用的第一个框架有可能就是go-micro,特别是go-micro/config库,已经成为了,很多其他框架写config配置的默认参考结构,今天我们就来学习一下,如何使用go-micro/config 读取配置文件

一、介绍

我们打开 go-micro.dev/v4/config 的源码结构如下:
image.png

1.1 encoder 处理编码/解码源配置

encoder 处理源配置的编码,解码,后端源source,可以为许多的不同的格式存储配置。编码器使我们能够处理任何格式。如果为指定编码器,则默认为json。

支持以下编码格式:

  • json
  • yaml
  • toml
  • xml
  • hcl

1.2 loader 加载读取数据到内存中

1.3 source 源,目前官方支持

        cli - 从 CLI 标志读取
        consul - 从 consul 读取
        env - 从环境变量读取
        etcd - 从 etcd v3 读取
        file - 从文件读取
        flag - 从标志读取
        memory - 从内存读取
    还有一些社区自己扩展了以下源,
          可以从插件库查看    https://github.com/go-micro/plugins/tree/main/v4/config/source
        configmap 从 k8s configmap 读取
        grpc   从 grpc 服务器读取
        mucp
        nacos  从nacos读取
        nats
        pkger
        runtimevar   从 Go Cloud Development Kit 运行时变量读取
        url
        vault

1.4 reader读取器

Reader 将多个更改集表示为单个合并和可查询的值集.
读取器使用编码器将更改集解码为 map[string]interface{}``Values, 然后将它们合并到单个更改集中。
image.png

1.5 config 管理所有的配置,源,编码器,和读取器

它管理从多个后端源读取,同步,监视,并将它们表示为单个合并和可查询源.

// Config is an interface abstraction for dynamic configuration
type Config interface {
    // provide the reader.Values interface
    reader.Values
    // Stop the config loader/watcher
    Close() error
    // Load config sources
    Load(source ...source.Source) error
    // Force a source changeset sync
    Sync() error
    // Watch a value for changes
    Watch(path ...string) (Watcher, error)
}

三、如何使用

3.1 使用json文件来做配置文件

我们准备一个json配置文件如下:

{
  "databases": {
    "redis": {
      "address": "10.0.0.1",
      "port": 3306
    },
    "mysql": {
      "address": "10.0.0.2",
      "port": 6379
    }
  }
}

3.2 准备一个结构体,来接收这个文件

type DatabasesConf struct {
    Databases Databases `json:"databases"`
}
type Databases struct {
    Redis DB `json:"redis"`
    Mysql DB `json:"mysql"`
}
type DB struct {
    Address string `json:"address"`
    Port    int    `json:"port"`
}
var Conf DatabasesConf

3.3 config.Scan 扫描值

当config.Load的时候,我们此时会把文件读取到内存中,存在一个全局变量config.DefaultConfig上,可以打印一下config.DefaultConfig.Map()来获取到这个值,所以在以后得时候用中,其实我们不用再重新加载文件了。

    _ = config.Load(
        file.NewSource(
            file.WithPath("c.json"),
        ),
    )
    t.Log(config.DefaultConfig.Map())
    config.Scan(&Conf)
    t.Log(Conf)

3.4 config.Get和 config.Scan 读取某个字段

    _ = config.Load(
        file.NewSource(
            file.WithPath("c.json"),
        ),
    )
    var RedisConf DB
    config.Get("databases", "redis").Scan(&RedisConf)
    t.Log(RedisConf)

海生
104 声望33 粉丝

与黑夜里,追求那一抹萤火。