servicecontext.go 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. package svc
  2. import (
  3. "context"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "slow_wild_api/apps/internal/config"
  8. "slow_wild_api/apps/internal/middleware"
  9. "google.golang.org/grpc"
  10. "google.golang.org/grpc/metadata"
  11. "git.banshen.xyz/huangguangrong/slow_wild_protobuff/slowwild/slowwildserverclient"
  12. "github.com/tencentyun/cos-go-sdk-v5"
  13. "github.com/zeromicro/go-zero/rest"
  14. "github.com/zeromicro/go-zero/zrpc"
  15. )
  16. type ServiceContext struct {
  17. Config config.Config
  18. SlowWildPb slowwildserverclient.SlowWildServer
  19. OptionalJwtMiddleware rest.Middleware
  20. TencentCos *cos.Client
  21. }
  22. // 创建 gRPC 拦截器
  23. func userAuthInterceptor() grpc.UnaryClientInterceptor {
  24. return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
  25. // 从context中获取user_id
  26. if userId := ctx.Value("user_id"); userId != nil {
  27. // 创建metadata
  28. md := metadata.New(map[string]string{
  29. "user_id": fmt.Sprint(userId),
  30. })
  31. // 将metadata添加到context
  32. ctx = metadata.NewOutgoingContext(ctx, md)
  33. }
  34. return invoker(ctx, method, req, reply, cc, opts...)
  35. }
  36. }
  37. func getTencentCosClient(bucketUrl string, secretId, secretKey string) *cos.Client {
  38. u, _ := url.Parse(bucketUrl)
  39. b := &cos.BaseURL{BucketURL: u}
  40. client := cos.NewClient(b, &http.Client{
  41. Transport: &cos.AuthorizationTransport{
  42. SecretID: secretId,
  43. SecretKey: secretKey,
  44. },
  45. })
  46. return client
  47. }
  48. func NewServiceContext(c config.Config) *ServiceContext {
  49. // 创建带有拦截器的 gRPC 客户端
  50. client := zrpc.MustNewClient(c.SlowwildRpc,
  51. zrpc.WithUnaryClientInterceptor(userAuthInterceptor()))
  52. return &ServiceContext{
  53. Config: c,
  54. SlowWildPb: slowwildserverclient.NewSlowWildServer(client),
  55. OptionalJwtMiddleware: middleware.NewOptionalJwtMiddleware(c.Auth.AccessSecret).Handle,
  56. TencentCos: getTencentCosClient(c.TencentCos.BucketUrl, c.TencentCos.SecretId, c.TencentCos.SecretKey),
  57. }
  58. }