基于Etcd和Raft的协调服务如何进行Golang实现
本篇文章为大家展示了基于Etcd和Raft的协调服务如何进行Golang实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
成都创新互联主营番禺网站建设的网络公司,主营网站建设方案,成都App制作,番禺h5微信小程序搭建,番禺网站营销推广欢迎番禺等地区企业咨询

package mainimport ("go.etcd.io/etcd/clientv3""time""fmt""context")func main() {var (config clientv3.Configclient *clientv3.Clienterr errorlease clientv3.LeaseleaseGrantResp *clientv3.LeaseGrantResponseleaseId clientv3.LeaseIDkeepRespChan <-chan *clientv3.LeaseKeepAliveResponsekeepResp *clientv3.LeaseKeepAliveResponsectx context.ContextcancelFunc context.CancelFunckv clientv3.KVtxn clientv3.TxntxnResp *clientv3.TxnResponse)// 客户端配置config = clientv3.Config{Endpoints: []string{"0.0.0.0:2379"},DialTimeout: 5 * time.Second,}// 建立连接if client, err = clientv3.New(config); err != nil {fmt.Println(err)return}// lease实现锁自动过期(上锁之后,如果节点宕机,锁会一直占用,所以要过期机制,也要续租机制):// op操作// txn事务: if else then// 1, 上锁 (创建租约, 自动续租, 拿着租约去抢占一个key)lease = clientv3.NewLease(client)// 申请一个5秒的租约if leaseGrantResp, err = lease.Grant(context.TODO(), 5); err != nil {fmt.Println(err)return}// 拿到租约的IDleaseId = leaseGrantResp.ID// 准备一个用于取消自动续租的contextctx, cancelFunc = context.WithCancel(context.TODO())// 确保函数退出后, 自动续租会停止defer cancelFunc() //终止自动续租协程(goroutine)defer lease.Revoke(context.TODO(), leaseId) //告诉etcd把租约直接释放掉,更直接,立即删除,锁就释放了// 5秒后会取消自动续租if keepRespChan, err = lease.KeepAlive(ctx, leaseId); err != nil {fmt.Println(err)return}// 处理续约应答的协程go func() {for {select {case keepResp = <- keepRespChan:if keepRespChan == nil {fmt.Println("租约已经失效了")goto END} else { // 每秒会续租一次, 所以就会受到一次应答fmt.Println("收到自动续租应答:", keepResp.ID)}}}END:}()// if 不存在key, then 设置它, else 抢锁失败kv = clientv3.NewKV(client)// 创建事务txn = kv.Txn(context.TODO())// 定义事务// 如果key不存在(创建版本是0说明没有被创建)txn.If(clientv3.Compare(clientv3.CreateRevision("/cron/lock/job9"), "=", 0)).Then(clientv3.OpPut("/cron/lock/job9", "xxx", clientv3.WithLease(leaseId))).Else(clientv3.OpGet("/cron/lock/job9")) // 否则抢锁失败// 提交事务if txnResp, err = txn.Commit(); err != nil {fmt.Println(err)return // 没有问题}// 判断是否抢到了锁if !txnResp.Succeeded {fmt.Println("锁被占用:", string(txnResp.Responses[0].GetResponseRange().Kvs[0].Value))return}// 2, 处理业务fmt.Println("处理任务")time.Sleep(5 * time.Second)// 3, 释放锁(取消自动续租, 释放租约)// 上面的defer 会把租约释放掉, 关联的KV就被删除了}
上述内容就是基于Etcd和Raft的协调服务如何进行Golang实现,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注创新互联行业资讯频道。
文章名称:基于Etcd和Raft的协调服务如何进行Golang实现
URL链接:http://www.jxjierui.cn/article/pdsosi.html


咨询
建站咨询
