go语言yaml配置库

自己实现的一个简单go语言配置库,类似于spring-boot的yaml配置,支持多profile和从环境变量读取,介绍下使用方法

从根实体strut遍历实体属性,如果类型为bool、string,、整型、 浮点型、map[string]interface{}、[]interface{},则会根据tag中的profile值(不设置则为当前属性名的首字母变小写)解析YAML或flag或环境变量,并赋值。

若YAML或flag或环境变量都不存在,则使用tag中的profileDefault设置默认值;
若默认值也未设置,则返回error。默认变量优先级:环境变量 > flag参数 > YAML > profileDefault默认值。

可以通过设置envHigher未false,让flag优先级 > 环境变量,注意接收类型和返回类型都需要为指针类型项目源码

单profile下的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
eureka:
instance:
preferIpAddress: true
leaseRenewalIntervalInSeconds: 10
leaseExpirationDurationInSeconds: 30
client:
serviceUrl:
defaultZone: http://localhost:8000/eureka/
registryFetchIntervalSeconds: 10
logging:
level:
github.com/flyleft/consul-iris/pkg/config: info
github.com/flyleft/consul-iris/pkg/route: debug
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
type SingleEnv struct {
Eureka SingleEureka
Logging map[string]interface{} `profile:"logging.level" profileDefault:"{\"github.com/flyleft/consul-iris\":\"debug\"}"`
}

type SingleEureka struct {
PreferIpAddress bool `profile:"instance.preferIpAddress"`
LeaseRenewalIntervalInSeconds int32 `profile:"instance.leaseRenewalIntervalInSeconds"`
LeaseExpirationDurationInSeconds uint `profile:"instance.leaseExpirationDurationInSeconds"`
ServerDefaultZone string `profile:"client.serviceUrl.defaultZone" profileDefault:"http://localhost:8000/eureka/"`
RegistryFetchIntervalSeconds byte `profile:"client.registryFetchIntervalSeconds"`
}

//使用
func main() {
env, err := Profile(&SingleEnv{}, "test-single-profile.yml", true)
if err != nil {
t.Error("Profile execute error", err)
}
trueEnv := env.(*SingleEnv)
}
//通过环境变量覆盖配置,比如设置EUREKA_INSTANCE_LEASERENEWALINTERVALINSECONDS环境变量值覆盖eureka.instance.leaseRenewalIntervalInSeconds

多profile下的使用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
profiles:
active: dev # 设置生效的profile

dev:
database:
username: root
password: root
eureka:
zone: http://localhost:8000/eureka/
fetchInterval: 10
logging:
level:
github.com/flyleft/consul-iris/pkg/config: info
github.com/flyleft/consul-iris/pkg/route: debug


production:
database:
username: production
password: production
eureka:
zone: http://localhost:8000/eureka/
fetchInterval: 10
logging:
level:
github.com/flyleft/consul-iris/pkg/config: info
github.com/flyleft/consul-iris/pkg/route: debug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
type Eureka struct {
Zone string `profile:"zone"`
FetchInterval int `profile:"fetchInterval"`
}

type DataSource struct {
Host string `profile:"host" profileDefault:"localhost"`
Username string `profile:"username"`
Password string `profile:"password"`
}

type MultiEnv struct {
DataSource DataSource `profile:"database"`
Eureka Eureka
Logging map[string]interface{} `profile:"logging.level" profileDefault:"{\"github.com/flyleft/consul-iris\":\"debug\"}"`
Users []interface{} `profile:"users" profileDefault:"[\"admin\",\"test\",\"root\"]"`
}
func main() {
env, err := Profile(&MultiEnv{}, "test-multi-profile.yml", true)
if err != nil {
t.Error("Profile execute error", err)
}
trueEnv := env.(*MultiEnv)
}
//可通过环境变量DEV_EUREKA_ZONE覆盖eureka.zone的值