resolver.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. package kafka
  2. import (
  3. "context"
  4. "net"
  5. )
  6. // The Resolver interface is used as an abstraction to provide service discovery
  7. // of the hosts of a kafka cluster.
  8. type Resolver interface {
  9. // LookupHost looks up the given host using the local resolver.
  10. // It returns a slice of that host's addresses.
  11. LookupHost(ctx context.Context, host string) (addrs []string, err error)
  12. }
  13. // BrokerResolver is an interface implemented by types that translate host
  14. // names into a network address.
  15. //
  16. // This resolver is not intended to be a general purpose interface. Instead,
  17. // it is tailored to the particular needs of the kafka protocol, with the goal
  18. // being to provide a flexible mechanism for extending broker name resolution
  19. // while retaining context that is specific to interacting with a kafka cluster.
  20. //
  21. // Resolvers must be safe to use from multiple goroutines.
  22. type BrokerResolver interface {
  23. // Returns the IP addresses of the broker passed as argument.
  24. LookupBrokerIPAddr(ctx context.Context, broker Broker) ([]net.IPAddr, error)
  25. }
  26. // NewBrokerResolver constructs a Resolver from r.
  27. //
  28. // If r is nil, net.DefaultResolver is used instead.
  29. func NewBrokerResolver(r *net.Resolver) BrokerResolver {
  30. return brokerResolver{r}
  31. }
  32. type brokerResolver struct {
  33. *net.Resolver
  34. }
  35. func (r brokerResolver) LookupBrokerIPAddr(ctx context.Context, broker Broker) ([]net.IPAddr, error) {
  36. rslv := r.Resolver
  37. if rslv == nil {
  38. rslv = net.DefaultResolver
  39. }
  40. ipAddrs, err := r.LookupIPAddr(ctx, broker.Host)
  41. if err != nil {
  42. return nil, err
  43. }
  44. if len(ipAddrs) == 0 {
  45. return nil, &net.DNSError{
  46. Err: "no addresses were returned by the resolver",
  47. Name: broker.Host,
  48. IsTemporary: true,
  49. IsNotFound: true,
  50. }
  51. }
  52. return ipAddrs, nil
  53. }