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

104 lines
2.7 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"
"encoding/json"
2025-02-14 17:21:32 +08:00
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/auth_service/internal/gen/dao/query"
cli2 "gitea.youtukeji.com.cn/youtu/youtu_grpc/app/auth_service/pkg"
2025-02-14 17:46:27 +08:00
"gitea.youtukeji.com.cn/youtu/youtu_grpc/app/user_service/userservice"
"gitea.youtukeji.com.cn/youtu/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"
"github.com/spf13/viper"
"github.com/zeromicro/go-zero/core/conf"
"github.com/zeromicro/go-zero/core/discov"
2025-02-14 17:21:32 +08:00
"github.com/zeromicro/go-zero/core/logx"
"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 {
Config config.Config
Cli cli2.Helper
2025-02-14 17:46:27 +08:00
UserManagerClient userservice.UserService
Query *query.Query
2025-02-05 18:45:49 +08:00
}
func NewServiceContext(c config.Config) *ServiceContext {
svc := &ServiceContext{
2025-02-05 18:45:49 +08:00
Config: c,
}
clientConf := zrpc.RpcClientConf{}
err := conf.FillDefault(&clientConf) // 填充默认值,比如 trace 透传等,参考服务配置说明
if err != nil {
panic(err)
}
2025-02-14 17:46:27 +08:00
clientConf.Token = "user_service.rpc.key"
clientConf.App = "user_service.rpc"
clientConf.Etcd = discov.EtcdConf{ // 通过 etcd 服务发现
Hosts: []string{viper.GetString(config.EtcdAddrKey)},
2025-02-14 17:46:27 +08:00
Key: "user_service.rpc",
}
2025-02-14 17:46:27 +08:00
svc.UserManagerClient = userservice.NewUserService(zrpc.MustNewClient(clientConf))
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
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
cli, err := clientv3.NewFromURL(viper.GetString(config.EtcdAddrKey))
if err != nil {
panic(err)
}
go func() {
2025-02-14 17:21:32 +08:00
ch := make(chan []byte)
go config.EtcdGetOneAndWatch(context.TODO(), cli, AppDataWatchKey, ch)
//从通道中尝试取值(监视的信息)
for res := range ch {
var appDataArr AppDataList
2025-02-14 17:21:32 +08:00
err = json.Unmarshal(res, &appDataArr)
if err != nil {
logx.Errorf("etcd watch %s json.Unmarshal: %v", AppDataWatchKey, err)
continue
}
svc.SaveDW(appDataArr, dwCache)
}
}()
}
2025-02-06 15:35:23 +08:00
func (svc *ServiceContext) SaveDW(arr []AppData, dwCache cache.Cache) {
svc.Cli.Clear()
2025-02-06 15:35:23 +08:00
//配置小程序cli抖音&微信)
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)
}
}