1
0

discovbuilder.go 1.0 KB

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