代码拉取完成,页面将自动刷新
package cfgpltfm
import (
"context"
"fmt"
"sync"
"time"
"gitee.com/MikeDDD/gu/cfgpltfm/cfgpltrpcpb"
"gitee.com/MikeDDD/gu/guutil"
"gitee.com/MikeDDD/gu/logs"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
)
type CfgpltfmClient struct {
cfgpltAddr string
selfAddr string
env string
keyHandler sync.Map // map["key_camp"]func(*cfgpltrpcpb.GetResp)
cfgpltrpcpb.UnimplementedCfgpltClientRpcServer
}
func New(cfgpltAddr, selfAddr, env string) *CfgpltfmClient {
cli := &CfgpltfmClient{
cfgpltAddr: cfgpltAddr,
selfAddr: selfAddr,
env: env,
}
return cli
}
// 客户端 => 中心 心跳
func (cli *CfgpltfmClient) Ping() bool {
defer guutil.InDeferRecover()
conn, err := grpc.Dial(cli.cfgpltAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
logs.Error(err)
return false
}
defer conn.Close()
client := cfgpltrpcpb.NewCfgpltServiceRpcClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
if _, err := client.Regist(ctx, &cfgpltrpcpb.RegistReq{
ClientAddr: cli.selfAddr,
Env: cli.env,
}); err != nil {
logs.Error(err)
return false
}
return true
}
// 客户端 => 中心 请求
func (cli *CfgpltfmClient) Get(key string, camp int32) *cfgpltrpcpb.GetResp {
defer guutil.InDeferRecover()
conn, err := grpc.Dial(cli.cfgpltAddr, grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
logs.Error(err)
return nil
}
defer conn.Close()
client := cfgpltrpcpb.NewCfgpltServiceRpcClient(conn)
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
defer cancel()
resp, err := client.Get(ctx, &cfgpltrpcpb.GetReq{Key: key, Camp: camp})
if err != nil {
logs.Error(err)
return nil
}
return resp
}
// 客户端 => 中心 请求
func (cli *CfgpltfmClient) GetAndWatch(key string, camp int32, callback func(*cfgpltrpcpb.GetResp)) bool {
defer guutil.InDeferRecover()
resp := cli.Get(key, camp)
if resp == nil {
return false
}
cli.keyHandler.Store(fmt.Sprintf("%v_%v", key, camp), callback)
callback(resp)
return true
}
// 中心 => 客户端
func (cli *CfgpltfmClient) Push(ctx context.Context, req *cfgpltrpcpb.PushReq) (*cfgpltrpcpb.PushResp, error) {
if req.Env != cli.env {
logs.Info("skip env %v, self %v", req.Env, cli.env)
return &cfgpltrpcpb.PushResp{}, nil
}
callback, exist := cli.keyHandler.Load(fmt.Sprintf("%v_%v", req.Key, req.Camp))
if !exist {
logs.Warn("no handler for %v", fmt.Sprintf("%v_%v", req.Key, req.Camp))
return &cfgpltrpcpb.PushResp{}, nil
}
callback.(func(*cfgpltrpcpb.GetResp))(&cfgpltrpcpb.GetResp{
Key: req.Key,
Camp: req.Camp,
Value: req.Value,
})
return &cfgpltrpcpb.PushResp{}, nil
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。