resolver.go 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package resolver
  2. import (
  3. "fmt"
  4. "strings"
  5. "zero/core/discov"
  6. "google.golang.org/grpc/resolver"
  7. )
  8. const (
  9. DiscovScheme = "discov"
  10. EndpointSep = ","
  11. )
  12. var builder discovBuilder
  13. type discovBuilder struct{}
  14. func (b *discovBuilder) Scheme() string {
  15. return DiscovScheme
  16. }
  17. func (b *discovBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (
  18. resolver.Resolver, error) {
  19. if target.Scheme != DiscovScheme {
  20. return nil, fmt.Errorf("bad scheme: %s", target.Scheme)
  21. }
  22. hosts := strings.Split(target.Authority, EndpointSep)
  23. sub, err := discov.NewSubscriber(hosts, target.Endpoint)
  24. if err != nil {
  25. return nil, err
  26. }
  27. update := func() {
  28. var addrs []resolver.Address
  29. for _, val := range sub.Values() {
  30. addrs = append(addrs, resolver.Address{
  31. Addr: val,
  32. })
  33. }
  34. cc.UpdateState(resolver.State{
  35. Addresses: addrs,
  36. })
  37. }
  38. sub.AddListener(update)
  39. update()
  40. return &discovResolver{
  41. cc: cc,
  42. }, nil
  43. }
  44. type discovResolver struct {
  45. cc resolver.ClientConn
  46. }
  47. func (r *discovResolver) Close() {
  48. }
  49. func (r *discovResolver) ResolveNow(options resolver.ResolveNowOptions) {
  50. }
  51. func RegisterResolver() {
  52. resolver.Register(&builder)
  53. }