package svc import ( "context" "fmt" "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/zeromicro/go-zero/rest" "github.com/zeromicro/go-zero/zrpc" ) type ServiceContext struct { Config config.Config SlowWildPb slowwildserverclient.SlowWildServer OptionalJwtMiddleware rest.Middleware } // 创建 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 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, } }