90 lines
2.2 KiB
Go
90 lines
2.2 KiB
Go
package titansSdk
|
||
|
||
import (
|
||
"context"
|
||
"go-common/app/service/live/resource/api/grpc/v1"
|
||
"go-common/library/ecode"
|
||
"go-common/library/log"
|
||
"go-common/library/net/rpc/warden"
|
||
"sync/atomic"
|
||
"time"
|
||
)
|
||
|
||
// titansConfigSdk 初始化时 单实例对象
|
||
var titansConfigSdk = &titansSdk{}
|
||
|
||
// Config 服务可配置项
|
||
type Config struct {
|
||
// 服务的tree_id
|
||
TreeId int64
|
||
// 缓存的更新间隔,单位为s,不配置则为5s
|
||
Expire int64
|
||
}
|
||
|
||
// titansSdk sdk
|
||
type titansSdk struct {
|
||
client v1.TitansClient
|
||
cache atomic.Value
|
||
}
|
||
|
||
// Init 业务初始化sdk接口
|
||
func Init(titansConfig *Config) {
|
||
conf := &warden.ClientConfig{}
|
||
client := warden.NewClient(conf)
|
||
conn, err := client.Dial(context.Background(), "discovery://default/"+v1.AppID)
|
||
if err != nil {
|
||
panic("依赖TitansConfig, 但是Titans的Client没有创建成功!")
|
||
}
|
||
if titansConfig.TreeId == 0 {
|
||
panic("依赖了TitansConfig, 但是titansConfig的treeId配置为空!")
|
||
}
|
||
titansConfigSdk = &titansSdk{}
|
||
titansConfigSdk.client = v1.NewTitansClient(conn)
|
||
titansConfigSdk.cache.Store(make(map[string]string))
|
||
load(titansConfigSdk, titansConfig.TreeId)
|
||
go update(titansConfigSdk, titansConfig.TreeId, titansConfig.Expire)
|
||
}
|
||
|
||
// update 定时更新
|
||
func update(sdk *titansSdk, treeId int64, expire int64) {
|
||
if expire < 1 {
|
||
expire = 5
|
||
}
|
||
for {
|
||
load(sdk, treeId)
|
||
time.Sleep(time.Duration(expire) * time.Second)
|
||
}
|
||
}
|
||
|
||
// load grpc接口
|
||
func load(sdk *titansSdk, treeId int64) {
|
||
for {
|
||
resp, err := sdk.client.GetByTreeId(context.Background(), &v1.TreeIdReq{TreeId: treeId})
|
||
if err != nil {
|
||
log.Error("[SyncTitansConfig][call resource][error], err:%+v", err)
|
||
} else {
|
||
sdk.cache.Store(resp.List)
|
||
break
|
||
}
|
||
time.Sleep(1 * time.Second)
|
||
}
|
||
}
|
||
|
||
// Get 获取配置接口
|
||
func Get(keyword string) (res string, err error) {
|
||
res = ""
|
||
cache, ok := titansConfigSdk.cache.Load().(map[string]string)
|
||
if !ok {
|
||
log.Error("[GetTitansConfig][cache content exception][error] content assert failed")
|
||
err = ecode.GetConfAdminErr
|
||
return
|
||
}
|
||
res, ok = cache[keyword]
|
||
if !ok || res == "" {
|
||
log.Error("[GetTitansConfig][cache content empty][Warn], keyword:%s, cache:%v", keyword, cache)
|
||
err = ecode.GetConfAdminErr
|
||
return
|
||
}
|
||
return
|
||
}
|