gitee.com/h79/goutils@v1.22.10/discovery/zookeeper/client.go (about) 1 package zookeeper 2 3 import ( 4 "encoding/json" 5 "gitee.com/h79/goutils/common/logger" 6 "gitee.com/h79/goutils/common/server" 7 "gitee.com/h79/goutils/discovery/config" 8 "gitee.com/h79/goutils/discovery/resolver" 9 "gitee.com/h79/goutils/discovery/resolver/builder" 10 "gitee.com/h79/goutils/discovery/service" 11 "github.com/go-zookeeper/zk" 12 ) 13 14 var _ service.Client = (*zkClient)(nil) 15 var _ builder.Builder = (*zkClient)(nil) 16 17 type zkClient struct { 18 Base 19 node config.Node 20 } 21 22 func NewZkClient(conf config.Config, eps config.EndPoints, resol resolver.Resolver) (service.Client, error) { 23 24 cli, err := NewClientZk(&eps, conf.Node, 30) 25 if err != nil { 26 logger.Error("Zookeeper.client: create client failure,err= %v", err) 27 return nil, err 28 } 29 logger.Info("Zookeeper.client: create client") 30 31 return NewZkClientWith(cli, &conf) 32 } 33 34 func NewZkClientWith(cli *zk.Conn, conf *config.Config) (service.Client, error) { 35 36 b := &zkClient{ 37 Base: Base{ 38 conn: cli, 39 }, 40 node: conf.Node, 41 } 42 resolver.Register(b) 43 return b, nil 44 } 45 46 func (cli *zkClient) Start() error { 47 return nil 48 } 49 50 func (cli *zkClient) Stop() { 51 } 52 53 // Resolve service.Client and resolver.Builder interface 54 // server config https://github.com/grpc/grpc/blob/master/doc/service_config.md 55 func (cli *zkClient) Resolve(target builder.Target) []builder.Address { 56 57 path := target.NameWith("") 58 59 // 获取字节点名称 60 childs, _, err := cli.conn.Children(path) 61 if err != nil { 62 if err == zk.ErrNoNode { 63 return nil 64 } 65 } 66 67 var adders []builder.Address 68 for _, child := range childs { 69 fullPath := path + "/" + child 70 data, _, er := cli.conn.Get(fullPath) 71 if er != nil { 72 if er == zk.ErrNoNode { 73 continue 74 } 75 return nil 76 } 77 s := server.Address{} 78 er = json.Unmarshal(data, &s) 79 if er != nil { 80 return nil 81 } 82 s.Adjust() 83 address := builder.Address{Addr: s.To(), ServerName: target.SchemeWith("")} 84 adders = append(adders, address) 85 } 86 return adders 87 } 88 89 // Build 90 // builder.Builder interface 91 func (cli *zkClient) Build(target builder.Target, cc builder.Connector) (builder.Resolver, error) { 92 93 logger.Info("def.Client: Build target: %+v", target) 94 95 cr := resolver.NewResolver(target, cc, cli) 96 97 return cr, nil 98 } 99 100 // Scheme 101 // builder.Builder interface 102 func (cli *zkClient) Scheme() string { 103 return cli.node.Scheme 104 } 105 106 // Type 107 // builder.Builder interface 108 func (cli *zkClient) Type() string { 109 return cli.node.Type 110 }