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  }