应用私有
1分钟内可阅读完
简要概述
对于通过 grpc-kit-cli 生成的每个微服务模版,如果它们存在需要个性化配置与数据结构,那么可以在这里定义。
配置示例
independent:
name: grpc-kit
数据结构
在 github.com/grpc-kit/pkg/cfg 中内置的数据结构,这个由框架管理,用户无法自定义:
type LocalConfig struct {
......
Independent interface{} `json:",omitempty"` // 应用私有配置
......
}
在生成各服务模版的结构,这个由用户自定义:
package modeler
// IndependentCfg 个性配置
type IndependentCfg struct {
Name string `mapstructure:"name"`
}
// Init 用于初始化实例
func (i *IndependentCfg) Init(ctx context.Context, opts ...ClientIndependentOption) error {
// 业务代码
return nil
}
框架取值
框架通过 GetIndependent 把 independent: 段解码进上述用户结构体
(模板中的实际调用:lc.GetIndependent(m.thisCfg)):
// GetIndependent 用于获取各个微服务独立的配置
func (c *LocalConfig) GetIndependent(t interface{}) error
解码行为做了两类增强(这也是推荐走该 API 而非自行 Unmarshal 的原因):
- 弱类型输入(
WeaklyTypedInput):允许把标量弱转为目标类型; - 自动钩子:
"10s"一类字符串可解码进time.Duration字段,逗号分隔 字符串("a,b,c")可解码进[]string。
应用场景
一个自定义服务
生成以下 app.yaml 配置项:
# 应用私有配置
independent:
# 消息数据写入kafka的topic
message:
cmdb:
# 资产类信息
topic: uptime-alertmanager
metric:
# 性能指标类
topic: uptime
# 主机注册的相关配置
registry:
default:
host_ttl: 60
heartbeat: 10
在对应的 modeler/independent_cfg.go 中数据结构为:
// IndependentCfg 个性配置
type IndependentCfg struct {
Message MessageConfig `mapstructure:"message"`
Registry RegistryConfig `mapstructure:"registry"`
}
// MessageConfig 用于kafka消息的配置
type MessageConfig struct {
CMDB struct {
Topic string `mapstructure:"topic"`
} `mapstructure:"cmdb"`
Metric struct {
Topic string `mapstructure:"topic"`
Drop bool `mapstructure:"drop"`
} `mapstructure:"metric"`
}
// RegistryConfig xx
type RegistryConfig struct {
Default ConfigContent `mapstructure:"default"`
}
// ConfigContent 一个具体的配置项
type ConfigContent struct {
// Address 隧道的地址
Address []string `mapstructure:"address"`
// 主机注册存活的时间
HostTTL int `mapstructure:"host_ttl"`
// 维持主机心跳时间,必须小于 host_ttl
Heartbeat int `mapstructure:"heartbeat"`
}