0.安装ETCD包
go get go.etcd.io/etcd/client/v3
1.初始化client
这里必须了解一下Client的结构
// Client provides and manages an etcd v3 client session. type Client struct { Cluster KV Lease Watcher Auth Maintenance conn *grpc.ClientConn cfg Config creds grpccredentials.TransportCredentials resolver *resolver.EtcdManualResolver mu *sync.RWMutex ctx context.Context cancel context.CancelFunc // Username is a user name for authentication. Username string // Password is a password for authentication. Password string authTokenBundle credentials.Bundle callOpts []grpc.CallOption lgMu *sync.RWMutex lg *zap.Logger }
Cluster、KV、Lease…,你会发现它们其实就代表了整个客户端的几大核心功能板块,分别用于:
- Cluster:向集群里增加etcd服务端节点之类,属于管理员操作。
- KV:我们主要使用的功能,即操作K-V。
- Lease:租约相关操作,比如申请一个TTL=10秒的租约。
- Watcher:观察订阅,从而监听最新的数据变化。
- Auth:管理etcd的用户和权限,属于管理员操作。
- Maintenance:维护etcd,比如主动迁移etcd的leader节点,属于管理员操作
2.获取KV对象
实际上client.KV是一个interface,提供了关于k-v操作的所有方法:
2.1put
通过接口的返回,可以看到他是返加一个(*PutResponse, error),PutResponse的结构体如下
其中Header的结构体如下
调用PUT方法,可以看到返回的 结果
2.2Get方法
通过返回值,知道Get返回的是一个(*GetReponse,error),GetResponse的结构体如下
拿到这个GetReponse这个响应值后,要通过这个响应值里面的Kvs,来获取具体的值,
运行上面的方法,结果如下
与ETCD里面存的值是一样的
2.3Lease对象
Lease提供了几个功能:
- Grant:分配一个租约。
- Revoke:释放一个租约。
- TimeToLive:获取剩余TTL时间。
- Leases:列举所有etcd中的租约。
- KeepAlive:自动定时的续约某个租约。
- KeepAliveOnce:为某个租约续约一次。
- Close:貌似是关闭当前客户端建立的所有租约。
要想实现key自动过期,首先得创建一个租约,它有20秒的TTL:
grantResp中主要使用到了ID,也就是租约ID:
接下来,我们用这个租约来Put一个会自动过期的Key:
在MAIN方法中进行如下调用
2.4事务
etcd中事务是原子执行的,只支持if … then … else …
这种表达,能实现一些有意思的场景。
首先,我们需要开启一个事务,这是通过KV对象的方法实现的:
2.5Watch操作
2.6参考