github.heygears.com/openimsdk/tools@v0.0.49/discovery/zookeeper/resolver.go (about) 1 // Copyright © 2023 OpenIM. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package zookeeper 16 17 import ( 18 "context" 19 "strings" 20 21 "google.golang.org/grpc/resolver" 22 ) 23 24 type Resolver struct { 25 client *ZkClient 26 target resolver.Target 27 cc resolver.ClientConn 28 addrs []resolver.Address 29 getConnsRemote func(ctx context.Context, serviceName string) (conns []resolver.Address, err error) 30 } 31 32 func (r *Resolver) ResolveNowZK(o resolver.ResolveNowOptions) { 33 serviceName := strings.TrimLeft(r.target.URL.Path, "/") 34 r.client.logger.Debug(context.Background(), "start resolve now", "target", r.target, "serviceName", serviceName) 35 newConns, err := r.getConnsRemote(context.Background(), serviceName) 36 if err != nil { 37 r.client.logger.Error(context.Background(), "resolve now error", err, "target", r.target, "serviceName", serviceName) 38 return 39 } 40 r.addrs = newConns 41 if err := r.cc.UpdateState(resolver.State{Addresses: newConns}); err != nil { 42 r.client.logger.Error(context.Background(), "UpdateState error, conns is nil from svr", err, "conns", newConns, "zk path", r.target.URL.Path, "serviceName", serviceName) 43 return 44 } 45 r.client.logger.Debug(context.Background(), "resolve now finished", "target", r.target, "conns", r.addrs, "serviceName", serviceName) 46 } 47 48 func (r *Resolver) ResolveNow(o resolver.ResolveNowOptions) {} 49 50 func (r *Resolver) Close() {} 51 52 func (s *ZkClient) Build(target resolver.Target, cc resolver.ClientConn, opts resolver.BuildOptions) (resolver.Resolver, error) { 53 s.logger.Debug(context.Background(), "build resolver", "target", target, "cc", cc.UpdateState) 54 serviceName := strings.TrimLeft(target.URL.Path, "/") 55 r := &Resolver{client: s} 56 r.target = target 57 r.cc = cc 58 r.getConnsRemote = s.GetConnsRemote 59 r.ResolveNowZK(resolver.ResolveNowOptions{}) 60 s.lock.Lock() 61 defer s.lock.Unlock() 62 s.resolvers[serviceName] = r 63 s.logger.Debug(context.Background(), "build resolver finished", "target", target, "cc", cc.UpdateState, "key", serviceName) 64 return r, nil 65 } 66 67 func (s *ZkClient) Scheme() string { return s.scheme }