client.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. package grpc
  2. import (
  3. "context"
  4. "sync"
  5. "time"
  6. "git.ikuban.com/server/kratos-nacos/registry"
  7. "git.ikuban.com/server/kratos-utils/http/middleware/logging"
  8. "github.com/go-kratos/kratos/v2/log"
  9. "github.com/go-kratos/kratos/v2/middleware"
  10. "github.com/go-kratos/kratos/v2/transport/grpc"
  11. grpc2 "google.golang.org/grpc"
  12. )
  13. var (
  14. ConnMap = make(map[string]*grpc2.ClientConn)
  15. ConnLock sync.Mutex
  16. )
  17. type DialOption struct {
  18. Middlewares []middleware.Middleware
  19. Timeout time.Duration
  20. GrpcOptions []grpc2.DialOption
  21. }
  22. func GetDialInsecure(
  23. r *registry.Registry,
  24. clientName string,
  25. endpointNameKey string, option *DialOption) (*grpc2.ClientConn, error) {
  26. option = checkOption(option)
  27. endpoint := grpc.WithEndpoint(endpointNameKey)
  28. if r == nil {
  29. return nil, nil
  30. }
  31. ConnLock.Lock()
  32. conn, ok := ConnMap[endpointNameKey]
  33. ConnLock.Unlock()
  34. if ok {
  35. return conn, nil
  36. }
  37. var err error
  38. conn, err = grpc.DialInsecure(context.Background(),
  39. endpoint,
  40. grpc.WithDiscovery(r),
  41. grpc.WithMiddleware(option.Middlewares...),
  42. grpc.WithTimeout(option.Timeout),
  43. grpc.WithOptions(option.GrpcOptions...),
  44. )
  45. if err != nil {
  46. return nil, err
  47. }
  48. ConnLock.Lock()
  49. ConnMap[endpointNameKey] = conn
  50. ConnLock.Unlock()
  51. return conn, nil
  52. }
  53. func GetDialSimple(endpointNameKey string, endpoint string, option *DialOption) (*grpc2.ClientConn, error) {
  54. option = checkOption(option)
  55. ConnLock.Lock()
  56. conn, ok := ConnMap[endpointNameKey]
  57. ConnLock.Unlock()
  58. if ok {
  59. return conn, nil
  60. }
  61. var err error
  62. conn, err = grpc.DialInsecure(context.Background(),
  63. grpc.WithEndpoint(endpoint),
  64. grpc.WithMiddleware(option.Middlewares...),
  65. grpc.WithTimeout(option.Timeout),
  66. grpc.WithOptions(option.GrpcOptions...),
  67. )
  68. if err != nil {
  69. return nil, err
  70. }
  71. ConnLock.Lock()
  72. ConnMap[endpointNameKey] = conn
  73. ConnLock.Unlock()
  74. return conn, nil
  75. }
  76. func NewGrpcClientOption(logger log.Logger) *DialOption {
  77. option := &DialOption{
  78. Middlewares: make([]middleware.Middleware, 0),
  79. Timeout: time.Second * 60,
  80. }
  81. if len(option.GrpcOptions) == 0 {
  82. option.GrpcOptions = append(option.GrpcOptions, grpc2.WithDefaultCallOptions(grpc2.MaxCallRecvMsgSize(ReceiveMsgSize)))
  83. }
  84. if logger != nil {
  85. option.Middlewares = append(option.Middlewares, logging.Client(logger))
  86. }
  87. return option
  88. }
  89. func checkOption(option *DialOption) *DialOption {
  90. if option == nil {
  91. option = &DialOption{
  92. Middlewares: make([]middleware.Middleware, 0),
  93. Timeout: time.Second * 60,
  94. }
  95. }
  96. if option.Timeout.Milliseconds() == 0 {
  97. option.Timeout = time.Second * 60
  98. }
  99. if len(option.GrpcOptions) == 0 {
  100. option.GrpcOptions = append(option.GrpcOptions, grpc2.WithDefaultCallOptions(grpc2.MaxCallRecvMsgSize(ReceiveMsgSize)))
  101. }
  102. return option
  103. }