package svc import ( "context" "fmt" "net/http" "net/url" "slow_wild_api/apps/internal/config" "slow_wild_api/apps/internal/middleware" "google.golang.org/grpc" "google.golang.org/grpc/metadata" "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserverclient" "github.com/tencentyun/cos-go-sdk-v5" "github.com/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/zrpc" ) type ServiceContext struct { Config config.Config SlowWildPb slowwildserverclient.SlowWildServer OptionalJwtMiddleware rest.Middleware TencentCos *cos.Client } // 创建 gRPC 拦截器 func userAuthInterceptor() grpc.UnaryClientInterceptor { return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { // 从context中获取user_id if userId := ctx.Value("user_id"); userId != nil { // 创建metadata md := metadata.New(map[string]string{ "user_id": fmt.Sprint(userId), }) // 将metadata添加到context ctx = metadata.NewOutgoingContext(ctx, md) } return invoker(ctx, method, req, reply, cc, opts...) } } func getTencentCosClient(bucketUrl string, secretId, secretKey string) *cos.Client { u, _ := url.Parse(bucketUrl) b := &cos.BaseURL{BucketURL: u} client := cos.NewClient(b, &http.Client{ Transport: &cos.AuthorizationTransport{ SecretID: secretId, SecretKey: secretKey, }, }) return client } func NewServiceContext(c config.Config) *ServiceContext { // 创建带有拦截器的 gRPC 客户端 client := zrpc.MustNewClient(c.SlowwildRpc, zrpc.WithUnaryClientInterceptor(userAuthInterceptor())) return &ServiceContext{ Config: c, SlowWildPb: slowwildserverclient.NewSlowWildServer(client), OptionalJwtMiddleware: middleware.NewOptionalJwtMiddleware(c.Auth.AccessSecret).Handle, TencentCos: getTencentCosClient(c.TencentCos.BucketUrl, c.TencentCos.SecretId, c.TencentCos.SecretKey), } }