SJA APS后端代码
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.

153 lines
4.5 KiB

package etcd
import (
clientv3 "go.etcd.io/etcd/client/v3"
"leit.com/leit_seat_aps/common"
conf "leit.com/leit_seat_aps/config"
"context"
"fmt"
)
/******************************************************************************
*
* @Struct Name : ETCDServiceImplement
*-----------------------------------------------------------------------------
*
* @Description : 的数据访问对象实现
*
* @Author : zhangxin
*
* @Date : 2021-06-17
*
******************************************************************************/
type ETCDServiceImplement struct {
Client *clientv3.Client
Lease clientv3.Lease
LeaseResp *clientv3.LeaseGrantResponse
CancelFunc func()
KeepAliveChan <-chan *clientv3.LeaseKeepAliveResponse
Addr string
CTX context.Context
}
/******************************************************************************
*
* @Function Name : NewETCDLockClientDAOImplement
*-----------------------------------------------------------------------------
*
* @Description : 创建一个NewETCDLockClientDAOImplement实例
*
* @Function Parameters : etcd客户端连接
*
* @Return Value : ETCDLockClientImplement实例
*
* @Author : zhangxin
*
* @Date : 2021-06-16
*
******************************************************************************/
func NewETCDServiceImplement(client *clientv3.Client, addr string) *ETCDServiceImplement {
lease := clientv3.NewLease(client)
ctx, cancelFunc := context.WithCancel(context.TODO())
return &ETCDServiceImplement{
Client: client,
Lease: lease,
Addr: addr,
CTX: ctx,
CancelFunc: cancelFunc,
}
}
/******************************************************************************
*
* @Reference LAPP_ETL/dao/etl/ETCDServiceImplement.RegisterService
*
******************************************************************************/
func (impl *ETCDServiceImplement) RegisterService(name string) (err error) {
err = impl.SetLease()
if err != nil {
return err
}
go impl.ListenLeaseRespChan()
kv := clientv3.NewKV(impl.Client)
serviceKey := fmt.Sprintf("/services/%s/%s", conf.AppConfig.LocalAddr, name)
_, err = kv.Put(impl.CTX, serviceKey, common.SERVICE_STATUS_RUNNING, clientv3.WithLease(impl.LeaseResp.ID))
return err
}
/******************************************************************************
*
* @Reference LAPP_ETL/dao/etl/ETCDServiceImplement.RegisterTask
*
******************************************************************************/
func (impl *ETCDServiceImplement) RegisterTask(taskId int, stage string) (err error) {
err = impl.SetLease()
if err != nil {
return err
}
go impl.ListenLeaseRespChan()
kv := clientv3.NewKV(impl.Client)
serviceKey := fmt.Sprintf("/task/%s/%d/%s", conf.AppConfig.LocalAddr, taskId, stage)
_, err = kv.Put(impl.CTX, serviceKey, common.SERVICE_STATUS_RUNNING, clientv3.WithLease(impl.LeaseResp.ID))
return err
}
/******************************************************************************
*
* @Reference LAPP_ETL/dao/etl/ETCDServiceImplement.SetLease
*
******************************************************************************/
func (impl *ETCDServiceImplement) SetLease() error {
//设置租约时间
leaseResp, err := impl.Lease.Grant(impl.CTX, conf.AppConfig.ServiceLease)
if err != nil {
return err
}
//设置续租
leaseRespChan, err := impl.Lease.KeepAlive(impl.CTX, leaseResp.ID)
if err != nil {
impl.CancelFunc()
return err
}
impl.LeaseResp = leaseResp
impl.KeepAliveChan = leaseRespChan
return nil
}
/******************************************************************************
*
* @Reference LAPP_ETL/dao/etl/ETCDServiceImplement.ListenLeaseRespChan
*
******************************************************************************/
func (impl *ETCDServiceImplement) ListenLeaseRespChan() {
for {
select {
case <-impl.CTX.Done():
fmt.Println("context 结束运行")
return
case leaseKeepResp := <-impl.KeepAliveChan:
if leaseKeepResp == nil {
return
}
}
}
}
/******************************************************************************
*
* @Reference LAPP_ETL/dao/etl/ETCDServiceImplement.RevokeLease
*
******************************************************************************/
func (impl *ETCDServiceImplement) RevokeLease() error {
var err error
if impl.LeaseResp != nil {
_, err = impl.Lease.Revoke(impl.CTX, impl.LeaseResp.ID)
err = impl.Lease.Close()
}
impl.CancelFunc()
return err
}