123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package internal
- import (
- "strings"
- "github.com/wuntsong-org/go-zero-plus/core/discov"
- "github.com/wuntsong-org/go-zero-plus/core/logx"
- "github.com/wuntsong-org/go-zero-plus/zrpc/resolver/internal/targets"
- "google.golang.org/grpc/resolver"
- )
- type discovBuilder struct{}
- func (b *discovBuilder) Build(target resolver.Target, cc resolver.ClientConn, _ resolver.BuildOptions) (
- resolver.Resolver, error) {
- hosts := strings.FieldsFunc(targets.GetAuthority(target), func(r rune) bool {
- return r == EndpointSepChar
- })
- sub, err := discov.NewSubscriber(hosts, targets.GetEndpoints(target))
- if err != nil {
- return nil, err
- }
- update := func() {
- var addrs []resolver.Address
- for _, val := range subset(sub.Values(), subsetSize) {
- addrs = append(addrs, resolver.Address{
- Addr: val,
- })
- }
- if err := cc.UpdateState(resolver.State{
- Addresses: addrs,
- }); err != nil {
- logx.Error(err)
- }
- }
- sub.AddListener(update)
- update()
- return &nopResolver{cc: cc}, nil
- }
- func (b *discovBuilder) Scheme() string {
- return DiscovScheme
- }
|