package svc import ( "context" "encoding/json" "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" "gitea.youtukeji.com.cn/youtu/youtu_grpc/app/user_service/userservice" "gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/config" "gitea.youtukeji.com.cn/youtu/youtu_grpc/pkg/my_gorm" "github.com/redis/go-redis/v9" "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/core/logx" "github.com/zeromicro/go-zero/zrpc" clientv3 "go.etcd.io/etcd/client/v3" "gorm.io/driver/mysql" "gorm.io/gorm" ) type ServiceContext struct { Config config.Config Cli cli2.Helper UserManagerClient userservice.UserService Query *query.Query dwCache *cache.Redis } 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_service.rpc.key" clientConf.App = "user_service.rpc" clientConf.Etcd = discov.EtcdConf{ // 通过 etcd 服务发现 Hosts: []string{viper.GetString(config.EtcdAddrKey)}, Key: "user_service.rpc", } //初始化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) } svc.Query = query.Use(db) 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"` } type AppDataList []AppData const AppDataWatchKey = "/youtu/appData" func (svc *ServiceContext) InitClient() { svc.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) } go func() { ch := make(chan []byte) go config.EtcdGetOneAndWatch(context.TODO(), cli, AppDataWatchKey, ch) //从通道中尝试取值(监视的信息) for res := range ch { var appDataArr AppDataList err = json.Unmarshal(res, &appDataArr) if err != nil { logx.Errorf("etcd watch %s json.Unmarshal: %v", AppDataWatchKey, err) continue } svc.SaveDW(appDataArr, svc.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) } } func (svc *ServiceContext) DeleteDWCache(appId string) (err error) { err = svc.dwCache.Delete(appId) return err }