github.com/lingyao2333/mo-zero@v1.4.1/zrpc/resolver/internal/discovbuilder.go (about)

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