介绍

ETCD : 高可用的分布式key-value存储,可以用于配置共享和服务发现。
类似项目:zookeeper和consul

import (
	"github.com/coreos/go-etcd/etcd"
	"log"
)

var (
	client *etcd.Client
	machines = []string{"http://127.0.0.1:2379"}
)

// 在初始化方法中创建 etcd 客户端
func init()  {
	client = etcd.NewClient(machines)
	log.Print("etcd client create success")
}

// 设置key值
func SetKey(key,value string,ttl uint64) {
	if nil == client {
		log.Fatal("etcd client is nil")
		return
	}
	if _, err := client.Set(key, value, ttl); err != nil {
		log.Fatal(err)
	}
}

// 获取key值
func GetKey(key string)  {
	if nil == client {
		log.Fatal("etcd client is nil")
		return
	}
	resp, err := client.Get(key, false, false)
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("Current creds: %s: %s\n", resp.Node.Key, resp.Node.Value)
}

// 监听key值的滨化
func WatchKey(key string)  {
	if nil == client {
		log.Fatal("etcd client is nil")
		return
	}
	receiver := make(chan *etcd.Response)
	stopChan := make(chan bool)
	go client.Watch(key,0,false,receiver,stopChan)
	for  {
		select {
		case r := <-receiver:
			if r.Node.Value == "stop"{
				stopChan<- true
				log.Println("get stop")
				return
			}
			log.Printf("Got updated creds: %s: %s\n", r.Node.Key, r.Node.Value)

		}
	}
}

func Close()  {
	if nil != client {
		client.Close()
	}
	log.Println("Stop")
}