package etcd
|
|
|
|
import (
|
|
"time"
|
|
"context"
|
|
"fmt"
|
|
clientv3 "go.etcd.io/etcd/client/v3"
|
|
)
|
|
|
|
//创建租约注册服务
|
|
type ServiceReg struct {
|
|
client *clientv3.Client
|
|
lease clientv3.Lease
|
|
leaseResp *clientv3.LeaseGrantResponse
|
|
canclefunc func()
|
|
keepAliveChan <-chan *clientv3.LeaseKeepAliveResponse
|
|
key string
|
|
}
|
|
|
|
func NewServiceReg(addr []string, timeNum int64) (*ServiceReg, error) {
|
|
conf := clientv3.Config{
|
|
Endpoints: addr,
|
|
DialTimeout: 5 * time.Second,
|
|
}
|
|
|
|
var (
|
|
client *clientv3.Client
|
|
)
|
|
|
|
if clientTem, err := clientv3.New(conf); err == nil {
|
|
client = clientTem
|
|
} else {
|
|
return nil, err
|
|
}
|
|
|
|
ser := &ServiceReg{
|
|
client: client,
|
|
}
|
|
|
|
if err := ser.setLease(timeNum); err != nil {
|
|
return nil, err
|
|
}
|
|
go ser.ListenLeaseRespChan()
|
|
return ser, nil
|
|
}
|
|
|
|
//设置租约
|
|
func (this *ServiceReg) setLease(timeNum int64) error {
|
|
lease := clientv3.NewLease(this.client)
|
|
|
|
//设置租约时间
|
|
leaseResp, err := lease.Grant(context.TODO(), timeNum)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
//设置续租
|
|
ctx, cancelFunc := context.WithCancel(context.TODO())
|
|
leaseRespChan, err := lease.KeepAlive(ctx, leaseResp.ID)
|
|
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
this.lease = lease
|
|
this.leaseResp = leaseResp
|
|
this.canclefunc = cancelFunc
|
|
this.keepAliveChan = leaseRespChan
|
|
return nil
|
|
}
|
|
|
|
//监听 续租情况
|
|
func (this *ServiceReg) ListenLeaseRespChan() {
|
|
for {
|
|
select {
|
|
case leaseKeepResp := <-this.keepAliveChan:
|
|
if leaseKeepResp == nil {
|
|
fmt.Printf("已经关闭续租功能\n")
|
|
return
|
|
} else {
|
|
fmt.Printf("续租成功\n")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
//通过租约 注册服务
|
|
func (this *ServiceReg) PutService(key, val string) error {
|
|
kv := clientv3.NewKV(this.client)
|
|
_, err := kv.Put(context.TODO(), key, val, clientv3.WithLease(this.leaseResp.ID))
|
|
return err
|
|
}
|
|
|
|
|
|
//撤销租约
|
|
func (this *ServiceReg) RevokeLease() error {
|
|
this.canclefunc()
|
|
time.Sleep(2 * time.Second)
|
|
_, err := this.lease.Revoke(context.TODO(), this.leaseResp.ID)
|
|
return err
|
|
}
|
|
|
|
func Etcdrun() {
|
|
ser,_ := NewServiceReg([]string{"101.201.121.115:2379"},5)
|
|
ser.PutService("/Server/001","LeitServer")
|
|
//select{}
|
|
}
|