配置

go-doudou提供了对dotenv格式和yaml格式的本地配置文件,以及阿里Nacos配置中心和携程Apollo配置中心的开箱支持,可以从本地配置文件或者远程配置中心加载配置到环境变量中。

本地配置文件和远程配置中心的优先级是本地配置文件优先,即本地配置文件中已加载的配置不会被远程配置中心加载的配置覆盖。

本地配置文件

dotenv格式和yaml格式的本地配置文件的使用方式是完全一样的,只是文件命名规则稍有不同。下文分别说明。

提示

两种格式的配置文件可以同时使用,也可以只用其中一种。当同时使用时,yaml格式的配置文件优先加载,全部加载完毕以后,再加载dotenv格式的配置文件。

dotenv文件

如果你有多个.env文件,例如.env.test, .env.prod等分别配置不同的环境,你可以通过命令行终端、Dockerfile文件或者k8s配置文件等设置GDD_ENV环境变量为test或者prod来加载对应的配置文件。

配置加载规则如下:

  1. 同一个环境变量,不论是在命令行终端配置的,还是通过配置文件配置的,最先加载的值优先级最高,不会被后加载的值修改
  2. 配置文件的加载顺序是(以prod环境为例):
    1. 加载.env.prod.local文件
    2. 当环境变量GDD_ENV的值等于test时,加载.env.local文件
    3. 加载.env.prod文件
    4. 加载.env文件

注意:前缀必须是.env

yaml文件

同时支持.yml后缀和.yaml后缀的配置文件。如果你有多个yaml文件,例如app-test.yml, app-prod.yml等分别配置不同的环境,你可以通过命令行终端、Dockerfile文件或者k8s配置文件等设置GDD_ENV环境变量为test或者prod来加载对应的配置文件。

配置加载规则如下:

  1. 同一个环境变量,不论是在命令行终端配置的,还是通过配置文件配置的,最先加载的值优先级最高,不会被后加载的值修改
  2. 配置文件的加载顺序是(以prod环境为例):
    1. 加载app-prod-local.yml文件
    2. 当环境变量GDD_ENV的值等于test时,加载app-local.yml文件
    3. 加载app-prod.yml文件
    4. 加载app.yml文件

注意:前缀必须是app

提示

环境变量转yaml配置时,规则是下划线做为属性分隔,字符很长的属性名可以用中横线分隔成多个单词,提高可读性,例如环境变量GDD_DB_MYSQL_DISABLEDATETIMEPRECISION转成yaml配置:

gdd:
	db:
		mysql:
			disable-datetime-precision:
1
2
3
4

远程配置方案

go-doudou内建支持两种远程配置中心方案:阿里的Nacos和携程的Apollo。支持在服务启动时加载,也支持自定义监听函数监听配置变化。

开启远程配置中心,需在本地配置文件中配置以下环境变量:

  • GDD_CONFIG_REMOTE_TYPE: 远程配置中心名称,可选项:nacosapollo

提示

go-doudou框架层的配置(即以GDD_为前缀的配置)中有一部分 服务配置 支持通过远程配置中心在运行时动态修改,运行时动态修改的配置优先级最高,会将服务启动时从命令行终端、Dockerfile文件、k8s配置文件、本地配置文件和远程配置中心加载的配置都覆盖掉。

Nacos配置中心

go-doudou服务启动时会自动从Nacos加载配置,只需要在本地配置文件里配置一些参数即可,可以说是开箱即用的。

  • GDD_NACOS_NAMESPACE_ID: Nacos namespaceId,非必须
  • GDD_NACOS_SERVER_ADDR: Nacos服务端连接地址,必须
  • GDD_NACOS_CONFIG_FORMAT: 配置的格式,可选项:dotenvyaml,默认值是dotenv
  • GDD_NACOS_CONFIG_GROUP: Nacos group,默认值是DEFAULT_GROUP
  • GDD_NACOS_CONFIG_DATAID: Nacos dataId,必须,多个dataId用英文逗号隔开,配置里的顺序就是实际加载顺序,遵循先加载的配置优先级最高的规则

configmgr包里提供了对外导出的与Nacos配置中心交互的单例NacosClient,可以调用AddChangeListener方法添加自定义的监听函数。用法示例:

func main() {

	...

	if configmgr.NacosClient != nil {
		configmgr.NacosClient.AddChangeListener(configmgr.NacosConfigListenerParam{
			DataId: "statsvc-dev",
			OnChange: func(event *configmgr.NacosChangeEvent) {
				fmt.Println("group:" + event.Group + ", dataId:" + event.DataId + fmt.Sprintf(", changes: %+v\n", event.Changes))
			},
		})
	}

	...

	srv.Run()
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

Apollo配置中心

go-doudou服务启动时会自动从Apollo加载配置,只需要在本地配置文件里配置一些参数即可,可以说是开箱即用的。

  • GDD_SERVICE_NAME: 服务名称就是Apollo AppId
  • GDD_APOLLO_CLUSTER: Apollo cluster,默认值是default
  • GDD_APOLLO_ADDR: Apollo服务端连接地址,必须
  • GDD_APOLLO_NAMESPACE: Apollo namespace,相当于Nacos的dataId,默认值是application.properties,多个namespace用英文逗号隔开,配置里的顺序就是实际加载顺序,遵循先加载的配置优先级最高的规则
  • GDD_APOLLO_SECRET: Apollo配置密钥,非必须

configmgr包里提供了对外导出的与Apollo配置中心交互的单例ApolloClient,可以调用AddChangeListener方法添加自定义的监听函数。用法示例:

type ConfigChangeListener struct {
	configmgr.BaseApolloListener
}

func (c *ConfigChangeListener) OnChange(event *storage.ChangeEvent) {
	c.Lock.Lock()
	defer c.Lock.Unlock()
	if !c.SkippedFirstEvent {
		c.SkippedFirstEvent = true
		return
	}
	logger.Info("from OnChange")
	fmt.Println(event.Changes)
	for key, value := range event.Changes {
		fmt.Println("change key : ", key, ", value :", value)
	}
	fmt.Println(event.Namespace)
	logger.Info("from OnChange end")
}

func main() {

    ...

	var listener ConfigChangeListener

	configmgr.ApolloClient.AddChangeListener(&listener)

    ...

	srv.Run()
}
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
29
30
31
32

需要补充说明的是:首次加载配置的事件也会被自定义监听函数监听到,如果需要跳过第一次,需要"继承"configmgr包提供的BaseApolloListener结构体,然后在OnChange函数的开头加上如下代码

c.Lock.Lock()
defer c.Lock.Unlock()
if !c.SkippedFirstEvent {
  c.SkippedFirstEvent = true
  return
}
1
2
3
4
5
6

服务配置

表格中加红色星号的配置是由go-doudou在运行时监听远程配置中心的配置变化动态修改的。

环境变量名描述默认值是否必须
GDD_BANNER是否开启bannertrue
GDD_BANNER_TEXTbanner文字go-doudou
GDD_LOG_LEVEL日志等级,可选项:panic, fatal, error, warn, warning, info, debug, traceinfo
GDD_LOG_FORMAT日志格式,可选项:text, jsontext
GDD_LOG_REQ_ENABLE是否开启http请求体和响应体日志false
GDD_LOG_CALLER是否打印“文件名:行号”false
GDD_LOG_DISCARD关闭日志false
GDD_GRACE_TIMEOUT优雅下线的超时时间15s
GDD_WRITE_TIMEOUThttp连接的写超时时间15s
GDD_READ_TIMEOUThttp连接的读超时时间15s
GDD_IDLE_TIMEOUThttp连接的空闲超时时间60s
GDD_ROUTE_ROOT_PATHhttp请求路径前缀
GDD_SERVICE_NAME服务名必须
GDD_SERVICE_GROUP服务组名,当采用zookeeper做服务注册与发现时有效
GDD_SERVICE_VERSION服务版本名,当采用zookeeper做服务注册与发现时有效
GDD_HOSThttp服务器监听地址
GDD_PORThttp服务器监听端口6060
GDD_GRPC_PORTgRPC服务器监听端口50051
GDD_RETRY_COUNT客户端请求重试次数0
GDD_MANAGE_ENABLE是否开启内建http接口:/go-doudou/doc, /go-doudou/openapi.json, /go-doudou/prometheus, /go-doudou/registry, /go-doudou/configtrue
*GDD_MANAGE_USER内建http接口的http basic校验用户名admin
*GDD_MANAGE_PASS内建http接口的http basic校验密码admin
GDD_TRACING_METRICS_ROOTjaeger调用链监控的metrics rootgo-doudou
GDD_WEIGHT服务实例的权重1
GDD_SERVICE_DISCOVERY_MODE服务发现模式,可选项:etcd, nacos, zk
GDD_ENABLE_RESPONSE_GZIP开启http响应体gzip压缩true
GDD_SQL_LOG_ENABLE开启sql日志打印false
GDD_REGISTER_HOST服务实例的注册地址,默认值取主机的私有IP
GDD_FALLBACK_CONTENTTYPE默认的http响应体的Content-Type头application/json; charset=UTF-8
GDD_CONFIG_REMOTE_TYPE远程配置中心,可选值:nacos, apollo

Nacos配置

环境变量名描述默认值是否必须
GDD_NACOS_NAMESPACE_ID命名空间public
GDD_NACOS_TIMEOUT_MS请求超时时间,单位毫秒10000
GDD_NACOS_NOTLOADCACHEATSTART程序启动时是否从磁盘缓存中加载服务列表false
GDD_NACOS_LOG_DIR日志目录地址/tmp/nacos/log
GDD_NACOS_CACHE_DIR服务列表磁盘缓存地址/tmp/nacos/cache
GDD_NACOS_LOG_LEVEL日志等级,可选项:debug,info,warn,errorinfo
GDD_NACOS_SERVER_ADDRNacos服务器连接地址,多个地址用英文逗号分隔
GDD_NACOS_CONFIG_FORMAT配置的数据格式,支持:dotenv, yamldotenv
GDD_NACOS_CONFIG_GROUP配置groupDEFAULT_GROUP
GDD_NACOS_CONFIG_DATAID配置dataId必须

Apollo配置

环境变量名描述默认值是否必须
GDD_APOLLO_CLUSTERapollo集群default
GDD_APOLLO_ADDRapollo配置服务连接地址必须
GDD_APOLLO_NAMESPACEapollo命名空间application.properties
GDD_APOLLO_BACKUP_ENABLE开启在本地磁盘缓存配置true
GDD_APOLLO_BACKUP_PATH配置缓存文件夹路径
GDD_APOLLO_MUSTSTART如果配置服务连接失败,立刻返回错误false
GDD_APOLLO_SECRETapollo配置的密钥
GDD_APOLLO_LOG_ENABLE开启apollo日志打印false

Etcd配置

环境变量名描述默认值是否必须
GDD_ETCD_ENDPOINTSetcd集群连接地址
GDD_ETCD_LEASEetcd服务注册租约TTL时间,单位秒5

Zookeeper配置

环境变量名描述默认值是否必须
GDD_ZK_SERVERSzookeeper集群连接地址,多个地址用英文逗号分隔
GDD_ZK_SEQUENCEzookeeper节点是否加编号false
GDD_ZK_DIRECTORY_PATTERN服务注册节点路径的字符串fmt模式,%s表示服务名/registry/%s/providers

Gorm配置

环境变量名描述默认值是否必须
GDD_DB_DISABLEAUTOCONFIGURE关闭自动配置false
GDD_DB_DRIVER数据库driver名称,与gorm保持一致:mysql, postgres, sqlite, sqlserver, tidb, clickhouse
GDD_DB_DSN数据库连接地址
GDD_DB_POOL_MAXIDLECONNS最大空闲连接数2
GDD_DB_POOL_MAXOPENCONNS最大连接数,-1表示无限制-1
GDD_DB_POOL_CONNMAXLIFETIME一个连接最长可复用的时间期限,-1表示无限制-1
GDD_DB_POOL_CONNMAXIDLETIME一个连接最长空闲时间,如果超期则会在下次复用前被关闭,-1表示无限制-1
GDD_DB_LOG_SLOWTHRESHOLD慢查询日志的阈值200ms
GDD_DB_LOG_IGNORERECORDNOTFOUNDERROR忽略没找到记录的错误false
GDD_DB_LOG_PARAMETERIZEDQUERIES是否隐藏sql参数false
GDD_DB_LOG_LEVEL日志级别,与gorm一致:silent, error, warn, infowarn
GDD_DB_MYSQL_SKIPINITIALIZEWITHVERSIONgorm的SkipInitializeWithVersion参数false
GDD_DB_MYSQL_DEFAULTSTRINGSIZEgorm的DefaultStringSize参数0
GDD_DB_MYSQL_DISABLEWITHRETURNINGgorm的DisableWithReturning参数false
GDD_DB_MYSQL_DISABLEDATETIMEPRECISIONgorm的DisableDatetimePrecision参数false
GDD_DB_MYSQL_DONTSUPPORTRENAMEINDEXgorm的DontSupportRenameIndex参数false
GDD_DB_MYSQL_DONTSUPPORTRENAMECOLUMNgorm的DontSupportRenameColumn参数false
GDD_DB_MYSQL_DONTSUPPORTFORSHARECLAUSEgorm的DontSupportForShareClause参数false
GDD_DB_MYSQL_DONTSUPPORTNULLASDEFAULTVALUEgorm的DontSupportNullAsDefaultValue参数false
GDD_DB_MYSQL_DONTSUPPORTRENAMECOLUMNUNIQUEgorm的DontSupportRenameColumnUnique参数false
GDD_DB_POSTGRES_PREFERSIMPLEPROTOCOLgorm的PreferSimpleProtocol参数false
GDD_DB_POSTGRES_WITHOUTRETURNINGgorm的WithoutReturning参数false