client.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package internal
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "github.com/tal-tech/go-zero/rpcx/internal/clientinterceptors"
  7. "google.golang.org/grpc"
  8. )
  9. const dialTimeout = time.Second * 3
  10. type (
  11. ClientOptions struct {
  12. Timeout time.Duration
  13. DialOptions []grpc.DialOption
  14. }
  15. ClientOption func(options *ClientOptions)
  16. )
  17. func WithDialOption(opt grpc.DialOption) ClientOption {
  18. return func(options *ClientOptions) {
  19. options.DialOptions = append(options.DialOptions, opt)
  20. }
  21. }
  22. func WithTimeout(timeout time.Duration) ClientOption {
  23. return func(options *ClientOptions) {
  24. options.Timeout = timeout
  25. }
  26. }
  27. func buildDialOptions(opts ...ClientOption) []grpc.DialOption {
  28. var clientOptions ClientOptions
  29. for _, opt := range opts {
  30. opt(&clientOptions)
  31. }
  32. options := []grpc.DialOption{
  33. grpc.WithInsecure(),
  34. grpc.WithBlock(),
  35. WithUnaryClientInterceptors(
  36. clientinterceptors.BreakerInterceptor,
  37. clientinterceptors.DurationInterceptor,
  38. clientinterceptors.PromMetricInterceptor,
  39. clientinterceptors.TimeoutInterceptor(clientOptions.Timeout),
  40. clientinterceptors.TracingInterceptor,
  41. ),
  42. }
  43. return append(options, clientOptions.DialOptions...)
  44. }
  45. func dial(server string, opts ...ClientOption) (*grpc.ClientConn, error) {
  46. options := buildDialOptions(opts...)
  47. timeCtx, cancel := context.WithTimeout(context.Background(), dialTimeout)
  48. defer cancel()
  49. conn, err := grpc.DialContext(timeCtx, server, options...)
  50. if err != nil {
  51. return nil, fmt.Errorf("rpc dial: %s, error: %s", server, err.Error())
  52. }
  53. return conn, nil
  54. }