Download: 极客工夫 -Go 进阶训练营 | 全新降级第 4 期
GO 高级进阶 ETCD 操作
etcd 是分布式系统中高可用键值(key-value)存储数据库,有几大重要的特色:
简略:安装简单、提供了 gRPC API 交互
平安:反对 TLS 加密通道的标准
疾速:基准 10000 次写入 / 秒
牢靠:基于 raft 算法,实现分布式系统数据的可用性和一致性
etcd 是用 Go 编写的,它应用 Raft 一致性算法来治理高可用日志
linux 下装置 etcd
须要装置 go 1.13 以上版本
cd $GOPATH/src
mkdir go.etcd.io && cd go.etcd.io
git clone https://github.com/etcd-io/etcd
cd etcd
./build
应用 build 脚本构建后生成 etcd 和 etcdctl 可执行程序,etcdctl 是一个命令行客户端
go 如何操作 etcd
首先援用 etcd 库
import “go.etcd.io/etcd/clientv3”
连贯 etcd 服务器
cli, err := clientv3.New(clientv3.Config{
Endpoints: []string{“192.168.1.109:2379”},
DialTimeout: 5 * time.Second,
})
if err != nil {
fmt.Printf(“connect to etcd failed, err:%v\n”, err)
return
}
fmt.Println(“connect to etcd success”)
defer cli.Close()
通过 put 将 key 和 value 存储在 etcd
// put
ctx, cancel := context.WithTimeout(context.Background(), time.Second)
_, err = cli.Put(ctx, “server1”, “192.168.3.10”)
cancel()
if err != nil {
fmt.Printf(“put to etcd failed, err:%v\n”, err)
return
}
// 通过 get 获取 key 的值
ctx, cancel = context.WithTimeout(context.Background(), time.Second)
resp, err := cli.Get(ctx, “server1”)
cancel()
if err != nil {
fmt.Printf(“get from etcd failed, err:%v\n”, err)
return
}
for _, ev := range resp.Kvs {
fmt.Printf(“%s:%s\n”, ev.Key, ev.Value)
}
etcd 利用场景
etcd 比拟常见用于服务器发现,服务发现是分布式系统一个不可短少的要害组件, 通过开源的的框架 zookeeper, etcd ,consul 等来实现服务发现,本文次要介绍如何通过 go 操作基于 etcd 构建服务发现。