kv操作
package main
import (
"log"
"github.com/hashicorp/consul/api"
)
func main() {
// config := api.DefaultConfig()
config := api.DefaultNonPooledConfig() //DefaultNonPooledConfig
config.Address = "xxx.xxx.xxx.xxx:8500"
client, err := api.NewClient(config)
if err != nil {
log.Fatal(err)
}
//初始化一个kv
pair := &api.KVPair{
Key: "key-1",
Value: []byte("10"),
}
//创建一个KV
kv := client.KV()
if _, err := kv.Put(pair, nil); err != nil {
log.Fatal(err)
}
//查询一个KV
if p, _, err := kv.Get(pair.Key, nil); err != nil {
log.Fatal(err)
} else {
log.Println(p.Key, "=>", string(p.Value))
}
//查询以 "key-1" 开头的K
if ps, _, err := kv.List(pair.Key, nil); err != nil {
log.Fatal(err)
} else {
for _, p := range ps {
log.Println(p.Key, "=>", string(p.Value))
}
}
//查询以 "key-1/" 开头的K
if ks, _, err := kv.Keys(pair.Key, "/", nil); err != nil {
log.Fatal(err)
} else {
for _, k := range ks {
log.Println(k)
}
}
//删除kv
if _, err := kv.Delete(pair.Key, nil); err != nil {
log.Fatal(err)
} else {
log.Println("delete key '", pair.Key, "' successfully")
}
}
分布式锁
package main
import (
"fmt"
"log"
"sync"
"time"
"github.com/hashicorp/consul/api"
)
var n int
//consul实现分布式锁
func print(wg *sync.WaitGroup, char string) {
defer wg.Done()
config := api.DefaultConfig()
config.Address = "xxx.xxx.xxx.xxx:8500"
client, err := api.NewClient(config)
lock, err := client.LockKey("lockthis")
if err != nil {
log.Fatal(err)
}
for {
_, err := lock.Lock(nil)
if err != nil {
log.Fatal(err)
}
if n >= 20 {
if err := lock.Unlock(); err != nil {
log.Fatal(err)
}
break
}
n++
fmt.Printf("%s -> %d\n", char, n)
time.Sleep(1 * time.Second)
if err := lock.Unlock(); err != nil {
log.Fatal(err)
}
}
}
func main() {
wg := &sync.WaitGroup{}
wg.Add(2)
go print(wg, "A")
go print(wg, "B")
wg.Wait()
fmt.Println("Done")
}