SJA工艺
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

107 lines
2.1 KiB

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{}
}