一、前言
很多人入门的go使用的第一个框架有可能就是go-micro,特别是go-micro/config库,已经成为了,很多其他框架写config配置的默认参考结构,今天我们就来学习一下,如何使用go-micro/config 读取配置文件
一、介绍
我们打开 go-micro.dev/v4/config 的源码结构如下:
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
, 然后将它们合并到单个更改集中。
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)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。