gitee.com/h79/goutils@v1.22.10/discovery/consul/master.go (about) 1 package consul 2 3 import ( 4 "gitee.com/h79/goutils/common/logger" 5 "gitee.com/h79/goutils/common/server" 6 "gitee.com/h79/goutils/discovery/config" 7 "gitee.com/h79/goutils/discovery/resolver" 8 "gitee.com/h79/goutils/discovery/resolver/builder" 9 "gitee.com/h79/goutils/discovery/service" 10 consul "github.com/hashicorp/consul/api" 11 ) 12 13 var _ service.Client = (*clClient)(nil) 14 var _ builder.Builder = (*clClient)(nil) 15 16 type clClient struct { 17 Base 18 node config.Node 19 } 20 21 func NewConsulClient(conf config.Config, endPoints config.EndPoints, resol resolver.Resolver) (service.Client, error) { 22 cli, err := NewClientWithPoints(endPoints) 23 if err != nil { 24 logger.Error("Consul.client: create consul failure, err= %+v", err) 25 return nil, err 26 } 27 logger.Info("Consul.client: create consul client") 28 b := &clClient{ 29 Base: Base{ 30 client: cli, 31 watcher: nil, 32 }, 33 node: conf.Node, 34 } 35 resolver.Register(b) 36 return b, nil 37 } 38 39 func (cli *clClient) Start() error { 40 return nil 41 } 42 43 func (cli *clClient) Stop() { 44 } 45 46 // Resolve service.Client and resolver.Builder interface 47 func (cli *clClient) Resolve(target builder.Target) []builder.Address { 48 49 entries, _, err := cli.client.Health().Service(target.NameWith(""), "", true, &consul.QueryOptions{}) 50 if err != nil { 51 logger.Error("Consul.client: Resolve service(%s) entry, err= %+v", target.NameWith("/"), err) 52 return nil 53 } 54 55 if len(entries) == 0 { 56 return nil 57 } 58 59 var adders []builder.Address 60 for _, entry := range entries { 61 62 logger.Debug("Consul.client: entry: %v", entry) 63 addr := server.Address{ 64 Host: entry.Service.Address, 65 Port: entry.Service.Port, 66 } 67 addr.Adjust() 68 address := builder.Address{Addr: addr.To(), ServerName: target.SchemeWith("")} 69 adders = append(adders, address) 70 } 71 return adders 72 } 73 74 // Build 75 // builder.Builder interface 76 func (cli *clClient) Build(target builder.Target, cc builder.Connector) (builder.Resolver, error) { 77 78 logger.Info("def.Client: Build target: %+v", target) 79 80 cr := resolver.NewResolver(target, cc, cli) 81 82 return cr, nil 83 } 84 85 // Scheme 86 // builder.Builder interface 87 func (cli *clClient) Scheme() string { 88 return cli.node.Scheme 89 } 90 91 // Type 92 // builder.Builder interface 93 func (cli *clClient) Type() string { 94 return cli.node.Type 95 }