youtu_grpc/app/auth_service/internal/svc/service_context.go

124 lines
3.1 KiB
Go
Raw Normal View History

2025-02-05 18:45:49 +08:00
package svc
2025-02-06 15:35:23 +08:00
import (
"context"
2025-02-10 17:30:29 +08:00
"encoding/json"
"gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/auth_service/internal/gen/dao/query"
2025-02-07 15:18:26 +08:00
cli2 "gitea.youtukeji.com.cn/xiabin/youtu_grpc/app/auth_service/pkg"
2025-02-10 17:30:29 +08:00
"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"
2025-02-06 15:35:23 +08:00
redisCache "github.com/silenceper/wechat/v2/cache"
2025-02-10 17:30:29 +08:00
"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"
2025-02-06 15:35:23 +08:00
)
2025-02-05 18:45:49 +08:00
type ServiceContext struct {
2025-02-10 17:30:29 +08:00
Config config.Config
Cli cli2.Helper
UserManagerClient user_management_client.UserManagement
Query *query.Query
2025-02-05 18:45:49 +08:00
}
func NewServiceContext(c config.Config) *ServiceContext {
2025-02-10 17:30:29 +08:00
svc := &ServiceContext{
2025-02-05 18:45:49 +08:00
Config: c,
}
2025-02-10 17:30:29 +08:00
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"`
2025-02-05 18:45:49 +08:00
}
2025-02-06 15:35:23 +08:00
2025-02-10 17:30:29 +08:00
type AppDataList []AppData
const AppDataWatchKey = "/youtu/appData"
func (svc *ServiceContext) InitClient() {
dwCache := redisCache.NewRedis(context.Background(), &redisCache.RedisOpts{Host: svc.Config.Redis[0].Host})
2025-02-06 15:35:23 +08:00
2025-02-10 17:30:29 +08:00
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)
}
}()
}
2025-02-06 15:35:23 +08:00
2025-02-10 17:30:29 +08:00
func (svc *ServiceContext) SaveDW(arr []AppData, dwCache cache.Cache) {
svc.Cli.Clear()
2025-02-06 15:35:23 +08:00
//配置小程序cli抖音&微信)
2025-02-10 17:30:29 +08:00
for _, v := range arr {
2025-02-07 15:18:26 +08:00
var c cli2.DWClient
2025-02-06 15:35:23 +08:00
switch v.Type {
2025-02-07 15:18:26 +08:00
case cli2.DouyinClientType:
c = cli2.NewDouYinApi(v.AppId, v.AppSecret, dwCache)
case cli2.WechatClientType:
c = cli2.NewWechatApi(v.AppId, v.AppSecret, dwCache)
2025-02-06 15:35:23 +08:00
default:
continue
}
svc.Cli.Set(v.AppId, c)
}
}