discovbuilder.go 814 B

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