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 }