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

125 lines
3.2 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"
2025-02-17 11:29:48 +08:00
"gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/my_gorm"
"github.com/redis/go-redis/v9"
"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-17 11:29:48 +08:00
"gorm.io/driver/mysql"
"gorm.io/gorm"
2025-02-24 17:27:51 +08:00
"strings"
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-24 11:37:19 +08:00
dwCache *cache.Redis
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-17 11:29:48 +08:00
//初始化redis client
redisClient := redis.NewClient(&redis.Options{
Addr: c.Redis[0].Host,
})
//初始化数据库
db, err := my_gorm.NewDBWithCache(mysql.Open(c.Mysql), &gorm.Config{}, redisClient)
if err != nil {
panic(err)
}
2025-02-17 11:29:48 +08:00
svc.Query = query.Use(db)
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"`
2025-03-04 14:43:39 +08:00
Type int32 `json:"type"`
2025-02-05 18:45:49 +08:00
}
2025-02-06 15:35:23 +08:00
type AppDataList []AppData
2025-02-24 17:27:51 +08:00
const AppDataWatchKey = "/youtu/app/account/"
func (svc *ServiceContext) InitClient() {
2025-02-24 11:37:19 +08:00
svc.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-24 17:27:51 +08:00
ch := make(chan config.WatchKV)
2025-02-14 17:21:32 +08:00
go config.EtcdGetOneAndWatch(context.TODO(), cli, AppDataWatchKey, ch)
//从通道中尝试取值(监视的信息)
2025-02-24 17:27:51 +08:00
for res := range ch {
2025-02-24 17:27:51 +08:00
appData := AppData{}
err = json.Unmarshal(res.Value, &appData)
2025-02-14 17:21:32 +08:00
if err != nil {
logx.Errorf("etcd watch %s json.Unmarshal: %v", AppDataWatchKey, err)
continue
}
2025-02-24 17:27:51 +08:00
appData.AppId = strings.TrimPrefix(res.Key, AppDataWatchKey)
svc.SaveDW(appData, svc.dwCache)
}
}()
}
2025-02-06 15:35:23 +08:00
2025-02-24 17:27:51 +08:00
func (svc *ServiceContext) SaveDW(v AppData, dwCache cache.Cache) {
2025-02-06 15:35:23 +08:00
//配置小程序cli抖音&微信)
2025-02-24 17:27:51 +08:00
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:
return
2025-02-06 15:35:23 +08:00
}
2025-02-24 17:27:51 +08:00
svc.Cli.Set(v.AppId, c)
2025-02-06 15:35:23 +08:00
}
2025-02-24 11:37:19 +08:00
func (svc *ServiceContext) DeleteDWCache(appId string) (err error) {
err = svc.dwCache.Delete(appId)
return err
}