SDK
针对不同的版本,etcd提供了两个版本的sdk, 下面针对不同版本,来使用熟悉下。
v2
Install
go get go.etcd.io/etcd/client
使用
package main
import (
"context"
"fmt"
"time"
"go.etcd.io/etcd/client"
)
func main() {
cfg := client.Config{
Endpoints: []string{"http://127.0.0.1:2379"},
Transport: client.DefaultTransport,
HeaderTimeoutPerRequest: time.Second,
}
c, err := client.New(cfg)
if err != nil {
fmt.Println(err)
}
kapi := client.NewKeysAPI(c)
// set /foo bar
resp, err := kapi.Set(context.Background(), "/foo", "bar", nil)
if err != nil {
fmt.Println(err)
}
fmt.Println(resp)
// get /foo
resp, err = kapi.Get(context.Background(), "/foo", nil)
if err != nil {
fmt.Println(err)
}
fmt.Println(resp)
}
异常处理 etcd client 可能会返回以下几种类型的异常
context error
每一个API调用的第一个参数都是context。 context可以被取消或者是检测其期限。如果context被取消了或者到了生命周期,
将会返回context异常。
cluster error
每一次API调用都会挨个发送请求到etcd集群,直到获得响应。 如果一个发送到etcd集群中某个节点的请求失败了,异常将会添加到异常列表里面, 如果整个集群中所有节点都失败了,则会返回一个集群异常。
response error
如果从集群中获得的响应是无效的, 会返回响应异常。
注意事项
在节点正常工作的情况下,etcd/client优先会使用同一个集群节点。他会保存socket连接,提高客户端跟服务器之间的效率。 这个并不会影响数据的一致性, 因为复制到每个有效节点中的数据已经是一致的。
etcd/client 采用了round-robin的负载均衡策略来选择可用的节点进行交互。 例如,如果其中一个节点失效了,会转发到其他的节点。
默认情况下etcd/client不能处理服务器端的SIGSTOPed, tcp keepalive机制在这种情况下是无用的,因为操作系统仍旧会发送tcp包。我们也有计划去提高这方面的功能,但就目前来说,优先级并不高,所以没必要刻意去关注。
etcd/client 不会检测成员健康状态。 如果成员从集群中分裂出来,etcd/client 会检索到过时的数据。故而,用户需要自己关注集群状态。
V3
etcd/clientv3 是一个官方的V3版本的Go语言etcd客户端。
安装
go get go.etcd.io/etcd/clientv3
使用
package main
import (
"context"
"fmt"
"time"
"go.etcd.io/etcd/clientv3"
)
func main() {
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{"10.103.113.127:2379"},
DialTimeout: 5 * time.Second,
})
if err != nil {
fmt.Println(err)
}
defer cli.Close()
var timeout time.Duration
timeout = 5 * time.Second
ctx, cancel := context.WithTimeout(context.Background(), timeout)
resp, err := cli.Get(ctx, "magic")
defer cancel()
if err != nil {
fmt.Println(err)
}
fmt.Println(resp)
for {
wrsp := cli.Watch(ctx, "magic")
for rsp := range wrsp {
fmt.Println(rsp)
for _, ev := range rsp.Events {
fmt.Println(ev)
// fmt.Printf("%s %q : %q\n", ev.Type, ev.Kv.Key, ev.Kv.Value)
}
}
}
}
异常处理 etcd/clientv3 会返回两种类型的异常:
context error
gRPC error
Last updated
Was this helpful?