以下是使用Golang操作Etcd进行监听,事务和租约的示例代码:
监听:
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
)
func main() {
// 创建一个etcd client实例
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"}, // etcd节点地址
})
if err != nil {
fmt.Printf("Failed to create etcd client: %s\n", err.Error())
return
}
defer cli.Close()
// 监听指定键的变化
rch := cli.Watch(context.Background(), "/foo")
for wresp := range rch {
for _, ev := range wresp.Events {
fmt.Printf("Event received! Type:%s Key:%s Value:%s\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
}
}
}
事务:
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
)
func main() {
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"},
})
if err != nil {
fmt.Println(err)
return
}
defer cli.Close()
kv := clientv3.NewKV(cli)
key1 := "/foo1"
value1 := "bar1"
key2 := "/foo2"
value2 := "bar2"
key3 := "/foo3"
putTxnResp, err := kv.Txn(context.Background()).
If(
clientv3.Compare(clientv3.Version(key1), "=", 0),
clientv3.Compare(clientv3.Version(key2), "=", 0),
).
Then(
clientv3.OpPut(key1, value1),
clientv3.OpPut(key2, value2),
clientv3.OpDelete(key3),
).
Commit()
if err != nil {
fmt.Println(err)
return
}
if !putTxnResp.Succeeded {
fmt.Println("Transaction failed!")
return
}
fmt.Println("Transaction succeeded!")
}
租约:
package main
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
"time"
)
func main() {
// 创建一个etcd client实例
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"}, // etcd节点地址
})
if err != nil {
fmt.Printf("Failed to create etcd client: %s\n", err.Error())
return
}
defer cli.Close()
// 创建一个30秒的租约,并设置键值对ttl为该租约ID,这样当租约过期时,键值对也会被删除。
leaseResp, err := cli.Grant(context.Background(), 30)
if err != nil {
fmt.Printf("Failed to create a lease: %s\n", err.Error())
return
}
_, err = cli.Put(context.Background(), "/foo", "bar", clientv3.WithLease(leaseResp.ID))
if err != nil {
fmt.Printf("Failed to set key-value pair with lease ID:%d, error:%s\n", leaseResp.ID, err.Error())
return
}
keepAliveCh, err := cli.KeepAlive(context.Background(), leaseResp.ID)
if err != nil {
fmt.Printf("Failed to keep lease alive: %s\n", err.Error())
return
}
// 启动一个协程来处理租约续期,如果续租失败或者租约过期则退出
go func() {
for {
select {
case <-keepAliveCh:
fmt.Println("Lease renewed!")
case <-time.After(35 * time.Second):
fmt.Println("Lease expired!")
return
}
}
}()
}
以上示例代码演示了如何使用etcd client进行监听、事务和租约操作。在监听中,我们创建了一个Watch实例并监听/foo键的变化;在事务中,我们构建了一个包含两个Put操作和一个Delete操作的事务,并使用If-Then语句进行条件判断;在租约中,我们创建了一个30秒的租约并将其应用于/foo键,并启动了一个协程来处理租约的续期。




