resolver.go 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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. subsetSize = 36
  12. )
  13. var builder discovBuilder
  14. type discovBuilder struct{}
  15. func (b *discovBuilder) Scheme() string {
  16. return DiscovScheme
  17. }
  18. func (b *discovBuilder) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (
  19. resolver.Resolver, error) {
  20. if target.Scheme != DiscovScheme {
  21. return nil, fmt.Errorf("bad scheme: %s", target.Scheme)
  22. }
  23. hosts := strings.Split(target.Authority, EndpointSep)
  24. sub, err := discov.NewSubscriber(hosts, target.Endpoint)
  25. if err != nil {
  26. return nil, err
  27. }
  28. update := func() {
  29. var addrs []resolver.Address
  30. for _, val := range subset(sub.Values(), subsetSize) {
  31. addrs = append(addrs, resolver.Address{
  32. Addr: val,
  33. })
  34. }
  35. cc.UpdateState(resolver.State{
  36. Addresses: addrs,
  37. })
  38. }
  39. sub.AddListener(update)
  40. update()
  41. return &discovResolver{
  42. cc: cc,
  43. }, nil
  44. }
  45. type discovResolver struct {
  46. cc resolver.ClientConn
  47. }
  48. func (r *discovResolver) Close() {
  49. }
  50. func (r *discovResolver) ResolveNow(options resolver.ResolveNowOptions) {
  51. }
  52. func RegisterResolver() {
  53. resolver.Register(&builder)
  54. }