跳到主要内容

配置管理

概览

配置管理是框架必不可少的一部分,像数据库、redis、消息队列等都会依赖配置进行初始化。
Eagle 框架支持 单独模式分环境 的配置模式;同时也支持不同的配置格式, 目前包括的有:

yaml
toml
ini
json
hcl
dotenv
env

配置字段统一用驼峰写法

文件位置

配置默认使用 yaml 格式,存放于项目根目录的 config 目录下。

配置文件根据不同功能分开存放,方便扩展,具体如下:

.
├── README.md
├── app.yaml
├── database.yaml
├── logger.yaml
├── redis.yaml
└── trace.yaml

配置模式

单独配置模式

单独配置主要是只所有的配置文件都分开的保存在 config 目录下,如下:

适合于不需要区分环境的场景

├── config
│   ├── README.md
│   ├── app.yaml
│   ├── database.yaml
│   ├── logger.yaml
│   ├── redis.yaml
│   └── trace.yaml

多环境配置模式

我们一般的环境有开发(dev)、测试(test)、线上(prod)环境,不同的环境可以对应不同的配置文件,如下:

# 开发环境
├── config
│   ├── dev
│   │ ├── README.md
│   │ ├── app.yaml
│   │ ├── database.yaml
│   │ ├── logger.yaml
│   │ ├── redis.yaml
│   │ └── trace.yaml

# 测试环境
├── config
│   ├── test
│   │ ├── README.md
│   │ ├── app.yaml
│   │ ├── database.yaml
│   │ ├── logger.yaml
│   │ ├── redis.yaml
│   │ └── trace.yaml

# 线上环境
├── config
│   ├── prod
│   │ ├── README.md
│   │ ├── app.yaml
│   │ ├── database.yaml
│   │ ├── logger.yaml
│   │ ├── redis.yaml
│   │ └── trace.yaml

加载配置

在项目启动的时候,可以通过参数来指定配置目录和运行环境,参数说明:

  • -c 配置目录
  • -e 环境变量
go build

# 单独配置启动模式
./eagle -c config

# 多环境配置启动模式
./eagle -c config -e dev
# 或者
APP_ENV=dev ./eagle -c config

读取配置

默认读取的是 yaml 格式的文件, 以读取应用名为例

// main.go
var (
cfgDir = pflag.StringP("config", "c", "config", "config file path.")
env = pflag.StringP("env name", "e", "", "env var name.")
...
)

...

// 初始化配置
c := config.New(*cfgDir, config.WithEnv(*env))
var cfg config.AppConfig
if err := c.Load("app", &cfg); err != nil {
panic(err)
}

// 读取某一项配置
name := cfg.Name

应用的配置 config.WithEnv(*env) 优先级高于环境变量的 APP_ENV 配置

加载自定义配置

如果有一个自己的配置文件,以加载 redis 配置文件为例,根据配置文件类型的不同有两种加载方式

默认加载方式(yaml)

type Config struct {
Addr string
Password string
}
var cfg Config
// config/redis.yaml
if err := config.Load("redis", &cfg); err != nil {
// handle error
}
fmt.Println(cfg)
// Output:
// {127.0.0.1:6379 123456}

指定不同的文件格式

// 加载 json 格式的配置
conf, err := config.LoadJson("redis")
// 加载 toml 格式的配置
// conf, err := config.LoadToml("redis")
if err != nil {
// handle error
}
fmt.Println("redis addr: ", conf.GetString("redis.Addr"))
fmt.Println("redis min idel conn: ", conf.GetInt("redis.MinIdleConn"))

如果默认提供的文件格式不支持,可以使用以下方式获取:

conf, err := config.LoadWithType("redis", "ini")
if err != nil {
// handle error
}