gitee.com/h79/goutils@v1.22.10/discovery/consul/base.go (about)

     1  package consul
     2  
     3  import (
     4  	"fmt"
     5  	"gitee.com/h79/goutils/common/logger"
     6  	"gitee.com/h79/goutils/common/result"
     7  	"gitee.com/h79/goutils/discovery/config"
     8  	"gitee.com/h79/goutils/discovery/service"
     9  	consul "github.com/hashicorp/consul/api"
    10  )
    11  
    12  type Base struct {
    13  	client  *consul.Client
    14  	watcher *Watcher
    15  }
    16  
    17  func (base *Base) kvSet(data service.Data) error {
    18  	if base.client == nil {
    19  		return fmt.Errorf("client is null, error")
    20  	}
    21  	if data.Path == "" || data.Service == "" {
    22  		return fmt.Errorf("data error: %v", data)
    23  	}
    24  	kv := &consul.KVPair{
    25  		Key:   data.ToKey(),
    26  		Flags: 0,
    27  		Value: []byte(data.Value)}
    28  
    29  	_, err := base.client.KV().Put(kv, nil)
    30  	return err
    31  }
    32  
    33  func (base *Base) kvGet(key service.Key) ([]*service.Data, error) {
    34  	if base.client == nil {
    35  		return nil, fmt.Errorf("client is null, error")
    36  	}
    37  	kv, _, err := base.client.KV().Get(key.ToKey(), nil)
    38  	if err != nil {
    39  		return nil, err
    40  	}
    41  	var kvs []*service.Data
    42  	kvs = append(kvs, &service.Data{
    43  		Key:   service.NewKey(kv.Key),
    44  		Value: string(kv.Value),
    45  	})
    46  
    47  	return kvs, nil
    48  }
    49  
    50  // Set interface
    51  func (base *Base) Set(data service.Data) error {
    52  
    53  	if err := base.kvSet(data); err != nil {
    54  		logger.Error("Consul.build: set data, err= %+v", err)
    55  		return err
    56  	}
    57  	return nil
    58  }
    59  
    60  // Get interface
    61  func (base *Base) Get(key service.Key) ([]*service.Data, error) {
    62  	kvs, err := base.kvGet(key)
    63  	if err != nil {
    64  		logger.Error("Consul.build: get data, err= %+v", err)
    65  		return nil, err
    66  	}
    67  	return kvs, nil
    68  }
    69  
    70  func (base *Base) AttachWatcher(watcher *Watcher) {
    71  	base.watcher = watcher
    72  }
    73  
    74  func NewClientWithPoints(eps config.EndPoints) (*consul.Client, error) {
    75  	eps.Servers.ToWeight()
    76  	for _, addr := range eps.Servers.Array() {
    77  		cfg := consul.DefaultConfig()
    78  		cfg.Address = addr //host:port
    79  		client, err := consul.NewClient(cfg)
    80  		if err == nil {
    81  			return client, nil
    82  		}
    83  	}
    84  	return nil, result.Error(result.ErrServiceInternal,
    85  		fmt.Sprintf("CONSUL.CLIENT: create consul client failure"))
    86  }