youtu_grpc/app/auth_service/internal/svc/service_context.go
2025-02-10 17:30:29 +08:00

124 lines
3.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package svc
import (
"context"
"encoding/json"
"gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/auth_service/internal/gen/dao/query"
cli2 "gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/auth_service/pkg"
"gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/user_management/user_management"
"gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/user_management/user_management_client"
"gitea.youtukeji.com.cn/xiabin/youtu_grpc/pkg/config"
"github.com/silenceper/wechat/v2/cache"
redisCache "github.com/silenceper/wechat/v2/cache"
"github.com/spf13/viper"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/discov"
"github.com/zeromicro/go-zero/zrpc"
clientv3 "go.etcd.io/etcd/client/v3"
)
type ServiceContext struct {
Config config.Config
Cli cli2.Helper
UserManagerClient user_management_client.UserManagement
Query *query.Query
}
func NewServiceContext(c config.Config) *ServiceContext {
svc := &ServiceContext{
Config: c,
}
clientConf := zrpc.RpcClientConf{}
err := conf.FillDefault(&clientConf) // 填充默认值,比如 trace 透传等,参考服务配置说明
if err != nil {
panic(err)
}
clientConf.Token = "user_management.rpc.key"
clientConf.App = "user_management.rpc"
clientConf.Etcd = discov.EtcdConf{ // 通过 etcd 服务发现
Hosts: []string{viper.GetString(config.EtcdAddrKey)},
Key: "user_management.rpc",
}
svc.UserManagerClient = user_management.NewUserManagementClient(zrpc.MustNewClient(clientConf).Conn())
svc.InitClient()
return svc
}
type AppData struct {
AppId string `json:"appId"`
AppSecret string `json:"appSecret"`
Type string `json:"type"`
}
type AppDataList []AppData
const AppDataWatchKey = "/youtu/appData"
func (svc *ServiceContext) InitClient() {
dwCache := redisCache.NewRedis(context.Background(), &redisCache.RedisOpts{Host: svc.Config.Redis[0].Host})
cli, err := clientv3.NewFromURL(viper.GetString(config.EtcdAddrKey))
if err != nil {
panic(err)
}
res, err := cli.Get(context.TODO(), AppDataWatchKey)
if err != nil {
panic(err)
}
var appDataArr AppDataList
for _, kv := range res.Kvs {
var arr AppDataList
err = json.Unmarshal(kv.Value, &arr)
if err != nil {
panic(err)
}
appDataArr = append(appDataArr, arr...)
}
svc.SaveDW(appDataArr, dwCache)
go func() {
ch := cli.Watch(context.Background(), AppDataWatchKey)
//从通道中尝试取值(监视的信息)
for res := range ch {
var appDataArr AppDataList
for _, evt := range res.Events {
var arr AppDataList
err = json.Unmarshal(evt.Kv.Value, &arr)
if err != nil {
panic(err) //todo logger
}
appDataArr = append(appDataArr, arr...)
}
svc.SaveDW(appDataArr, dwCache)
}
}()
}
func (svc *ServiceContext) SaveDW(arr []AppData, dwCache cache.Cache) {
svc.Cli.Clear()
//配置小程序cli抖音&微信)
for _, v := range arr {
var c cli2.DWClient
switch v.Type {
case cli2.DouyinClientType:
c = cli2.NewDouYinApi(v.AppId, v.AppSecret, dwCache)
case cli2.WechatClientType:
c = cli2.NewWechatApi(v.AppId, v.AppSecret, dwCache)
default:
continue
}
svc.Cli.Set(v.AppId, c)
}
}