discovbuilder.go 945 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package resolver
  2. import (
  3. "strings"
  4. "github.com/tal-tech/go-zero/core/discov"
  5. "github.com/tal-tech/go-zero/core/logx"
  6. "google.golang.org/grpc/resolver"
  7. )
  8. type discovBuilder struct{}
  9. func (b *discovBuilder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (
  10. resolver.Resolver, error) {
  11. hosts := strings.FieldsFunc(target.Authority, func(r rune) bool {
  12. return r == EndpointSepChar
  13. })
  14. sub, err := discov.NewSubscriber(hosts, target.Endpoint)
  15. if err != nil {
  16. return nil, err
  17. }
  18. update := func() {
  19. var addrs []resolver.Address
  20. for _, val := range subset(sub.Values(), subsetSize) {
  21. addrs = append(addrs, resolver.Address{
  22. Addr: val,
  23. })
  24. }
  25. if err := cc.UpdateState(resolver.State{
  26. Addresses: addrs,
  27. }); err != nil {
  28. logx.Error(err)
  29. }
  30. }
  31. sub.AddListener(update)
  32. update()
  33. return &nopResolver{cc: cc}, nil
  34. }
  35. func (b *discovBuilder) Scheme() string {
  36. return DiscovScheme
  37. }