Apollo配置中心
配置格式
service = "http://127.0.0.1:8080" # apollo配置服务地址
cache_dir = "/to/path" # 本地配置缓存
[app.sales-micro]
app_id = "sales-micro" # 应用id
cluster = "default" # 服务端集群
secret = "......" # 应用秘钥
namespaces = [
"gateway:SALES.micro.gateway"
] # 需要拉取的命名空间(配置项),格式为 "别名:命名空间名"。"别名:"可忽略,忽略后调起时需要 应用id + 命名空间名,如 sales-micro.SALES.micro.gateway
[app.sales-micro-holdings]
app_id = "sales-micro-holdings"
cluster = "default"
secret = "......"
namespaces = [
"holdings.dispatcher:SALES.micro.dispatcher",
"holdings.circuit_breaker:SALES.micro.circuit_breaker",
"holdings.rate_limiter:SALES.micro.rate_limiter"
]
启动
import (
"gitee.com/ltotal/ppw_gin/di"
)
func init() {
di.MustProvides(
loadConfigConf,
......
)
di.Initialize()
}
func LoadConfigConf() *di.ConfigConf {
dir, err := os.Getwd()
if err != nil {
panic(err)
}
return &di.ConfigConf{
ConfigType: "toml", // 本地配置文件格式
ConfigPath: filepath.Join(dir, "conf"), // 本地配置文件路径
ApolloConf: "apollo", // 可选,apollo配置文件名,从 "本地配置文件路径/apollo配置文件名.本地配置文件格式" 获取
ApUpdateCallback: nil, // 可选,服务端配置更新后自定义的回调方法(服务端配置更新后同步到客户端的步骤已内部实现,这里指额外的自定回调)
InitCallback: nil, // 可选,本地及apollo配置(如果有的话)初始化完成后的自定义回调
}
}
调用
// viper方式读取配置(推荐)
c := di.Apollo.Alias("gateway")
allServices := c.GetStringSlice("all_services")
sigEnable := c.GetBool("sig.enable")
// 结构体方式读取配置
type SalesMicroGateway struct {
AllServices []string `mapstructure:"all_services"`
SigEnable bool `mapstructure:"sig.enable"`
}
c := &SalesMicroGateway{}
_ = di.Apollo.Struct("gateway", c)
allServices := c.AllServices
......
基本使用
接口参数校验规则
var CustomValidators = &[]di.Validators{
{
Tag: "int_sequence", // 自定义正则校验
RegExp: `^(\d+)(,\d+)*$`,
Msg: "{0}必须为','分隔的数字",
},
{
Tag: "fund_id",
RegExp: `(?i)^HF[0-9A-Za-z]{8}$`,
Msg: "{0}基金id格式有误",
},
{
Tag: "fixed_len", // 自定义方法校验
Handler: func(fl validator.FieldLevel) bool {
fixedLen := fl.Param()
fieldValue := fl.Field().String()
lenInt, err := strconv.Atoi(fixedLen)
if err != nil {
return false
}
return len(fieldValue) == lenInt
},
Msg: "{0}长度有误",
},
}
路由规则
var ProductRoute = func() di.Routes {
controller := di.MustGet[*controller.ProductController]()
return di.Routes{
Group: "/api",
Rules: []di.Rule{
{
Method: http.MethodGet,
Route: "/product/list",
Handler: controller.List,
DataBind: binding.Query,
},
},
}
}
初始化&服务启动
func init() {
di.MustProvides(
loadConfigConf,
loadTracerConf,
loadDatabaseConf,
......
)
di.Initialize()
}
func main() {
srv := gin_server.New(&gin_server.Conf{
RunMode: gin.DebugMode,
Routes: []*pkg.Routes{
router.ProductRoute(),
},
Validators: validator.CustomValidators,
Recovery: false,
})
_ = srv.Run(":9992")
}
func LoadConfigConf() *di.ConfigConf {
dir, err := os.Getwd()
if err != nil {
panic(err)
}
return &di.ConfigConf{
ConfigType: "toml",
ConfigPath: filepath.Join(dir, "conf"),
ApolloConf: "apollo",
ApUpdateCallback: nil,
InitCallback: nil,
}
}
func LoadTracerConf() *di.TracerConf {
tracerConf := &di.TracerConf{}
_ = pkg.Apollo.Struct("tracer", tracerConf)
tracerConf.MainServiceName = "dig_srv"
return tracerConf
}
func loadDatabaseConf() []*di.DatabaseConf {
return []*di.DatabaseConf{
{
DbKey: "db.demo",
CallBack: func(db *gorm.DB) {
_ = di.Container().Provide(func() *demo_db.Query {
return demo_db.Use(db)
})
},
},
}
}
相关文档
gin(http服务)
https://www.kancloud.cn/shuangdeyu/gin_book/949416
gorm(数据库orm)
https://gorm.io/docs/query.html
gen(gorm扩展)
https://gorm.io/gen/query.html
apollo(配置中心)
https://www.apolloconfig.com/#/zh/README
dig(依赖注入)
https://pkg.go.dev/go.uber.org/dig#section-documentation
sentinel(熔断限流)
https://sentinelguard.io/zh-cn/docs/golang/quick-start.html
seata(分布式事务)
https://seata.apache.org/zh-cn/docs/overview/what-is-seata/