etcd 是一个高可用的 Key/Value 存储系统,主要用于配置管理监控以及服务注册与发现。因为etcd能够监听key的变化以及维持心跳,用来实现服务注册发现便变得非常简单,以下是实现的关键代码:
package etcd
import (
"context"
"fmt"
"go.etcd.io/etcd/clientv3"
"testing"
"time"
)
func TestEtcdLease(t *testing.T) {
config := clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 5 * time.Second,
}
client, err := clientv3.New(config)
if err != nil {
fmt.Println(err)
return
}
defer client.Close()
lease := clientv3.NewLease(client) // 创建一个租约
leaseResp, err := lease.Grant(context.Background(), 10) // 设置租约超时 10秒
if err != nil {
fmt.Println(err)
return
}
leaseRespChan, _ := lease.KeepAlive(context.Background(), leaseResp.ID) // 通过keeplive定期发送心跳
kv := clientv3.NewKV(client)
key := fmt.Sprintf("/services/http/%d", leaseResp.ID)
value := `{"host": "192.168.0.1", "port": 8000}`
fmt.Println("key", key)
// 绑定带有心跳的租约并将自身服务信息put到etcd中心
_, err = kv.Put(context.Background(), key, value, clientv3.WithLease(leaseResp.ID))
if err != nil {
fmt.Println(err)
return
}
fmt.Println("register service success")
for {
select {
case i := <-leaseRespChan:
fmt.Println("heart beat", i.String()) // 心跳信息
}
}
}
如果进程意外终止,超过设定的10秒后etcd会将绑定了租约的kv删除。