servicecontext.go 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package svc
  2. import (
  3. "context"
  4. "fmt"
  5. "slow_wild_api/apps/internal/config"
  6. "slow_wild_api/apps/internal/middleware"
  7. "google.golang.org/grpc"
  8. "google.golang.org/grpc/metadata"
  9. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserverclient"
  10. "github.com/zeromicro/go-zero/rest"
  11. "github.com/zeromicro/go-zero/zrpc"
  12. )
  13. type ServiceContext struct {
  14. Config config.Config
  15. SlowWildPb slowwildserverclient.SlowWildServer
  16. OptionalJwtMiddleware rest.Middleware
  17. }
  18. // 创建 gRPC 拦截器
  19. func userAuthInterceptor() grpc.UnaryClientInterceptor {
  20. return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  21. // 从context中获取user_id
  22. if userId := ctx.Value("user_id"); userId != nil {
  23. // 创建metadata
  24. md := metadata.New(map[string]string{
  25. "user_id": fmt.Sprint(userId),
  26. })
  27. // 将metadata添加到context
  28. ctx = metadata.NewOutgoingContext(ctx, md)
  29. }
  30. return invoker(ctx, method, req, reply, cc, opts...)
  31. }
  32. }
  33. func NewServiceContext(c config.Config) *ServiceContext {
  34. // 创建带有拦截器的 gRPC 客户端
  35. client := zrpc.MustNewClient(c.SlowwildRpc,
  36. zrpc.WithUnaryClientInterceptor(userAuthInterceptor()))
  37. return &ServiceContext{
  38. Config: c,
  39. SlowWildPb: slowwildserverclient.NewSlowWildServer(client),
  40. OptionalJwtMiddleware: middleware.NewOptionalJwtMiddleware(c.Auth.AccessSecret).Handle,
  41. }
  42. }