golang使用etcd实现分布式锁

摘要:
=nil{39fmt.Println40return41}42leaseId=leaseGrantResponse。ID4344//租约自动立即到期//Cancelfunc取消续订,而revoke立即到期45ctx,Cancelfunc=context。使用Cancel46delatecancelFunc()47delatelease。撤销4849ifleaseKeepAliveChan,err=租赁。保持活力;错误!=Nil{50fmt.Println51return52}53//启动租约续订协议流程,并每秒钟续订一次54gofunc(){55 for{56 select{57 caseleaseKeepAliveResponse=˂-releaseKeepAlive Chan:58ifleaseKeepAliveResponse!
 1 package main
 2 
 3 import (
 4     "context"
 5     "fmt"
 6     "time"
 7 
 8     "go.etcd.io/etcd/clientv3"
 9 )
10 
11 func main() {
12     var (
13         client *clientv3.Client
14         cfg    clientv3.Config
15         err    error
16         lease clientv3.Lease
17         ctx context.Context
18         cancelFunc context.CancelFunc
19         leaseId clientv3.LeaseID
20         leaseGrantResponse *clientv3.LeaseGrantResponse
21         leaseKeepAliveChan <-chan *clientv3.LeaseKeepAliveResponse
22         leaseKeepAliveResponse *clientv3.LeaseKeepAliveResponse
23         txn clientv3.Txn
24         txnResponse *clientv3.TxnResponse
25         kv clientv3.KV
26     )
27 
28     cfg = clientv3.Config{
29         Endpoints:   []string{"youwebsite:2379"},
30         DialTimeout: time.Second * 5,
31     }
32     if client, err = clientv3.New(cfg); err != nil {
33         fmt.Println(err)
34         return
35     }
36 
37     lease = clientv3.NewLease(client)
38     if leaseGrantResponse,err = lease.Grant(context.TODO(),5);err!=nil{
39         fmt.Println(err)
40         return
41     }
42     leaseId = leaseGrantResponse.ID
43 
44     //租约自动过期,立刻过期。//cancelfunc 取消续租,而revoke 则是立即过期
45     ctx,cancelFunc = context.WithCancel(context.TODO())
46     defer cancelFunc()
47     defer lease.Revoke(context.TODO(),leaseId)
48 
49     if leaseKeepAliveChan,err = lease.KeepAlive(ctx,leaseId);err!=nil{
50         fmt.Println(err)
51         return
52     }
53     //启动续租协程,每秒续租一次
54     go func() {
55         for {
56             select {
57             case leaseKeepAliveResponse = <-leaseKeepAliveChan:
58                 if leaseKeepAliveResponse != nil{
59                     fmt.Println("续租成功,leaseID :",leaseKeepAliveResponse.ID)
60                 }else {
61                     fmt.Println("续租失败")
62                 }
63 
64             }
65             time.Sleep(time.Second*1)
66         }
67     }()
68     //锁逻辑。
69     kv = clientv3.NewKV(client)
70     txn = kv.Txn(context.TODO())
71 
72     txn.If(clientv3.Compare(clientv3.CreateRevision("/dev/lock"),"=",0)).Then(
73         clientv3.OpPut("/dev/lock","占用",clientv3.WithLease(leaseId))).Else(
74             clientv3.OpGet("/dev/lock"))
75     if txnResponse,err = txn.Commit();err!=nil{
76         fmt.Println(err)
77         return
78     }
79     if txnResponse.Succeeded {
80         fmt.Println("抢到锁了")
81     }else {
82         fmt.Println("没抢到锁",txnResponse.Responses[0].GetResponseRange().Kvs[0].Value)
83     }
84     time.Sleep(time.Second * 10 )
85 }

免责声明:文章转载自《golang使用etcd实现分布式锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C#动态执行JS和VBS脚本Linux(Centos)下安装git步骤详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

CentOS7安装OpenStack(Rocky版)-01.控制节点的系统环境准备

分享一下Rocky版本的OpenStack安装管理经验: OpenStack每半年左右更新一版,目前是版本是201808月发布的版本-R版(Rocky),目前版本安装方法优化较好,不过依然是比较复杂 官方文档地址:https://docs.openstack.org/install-guide/openstack-services.html 本文主要分享控...

golang学习笔记---reflect包

go语言提供了一种机制,在编译时不知道类型的情况下,可更新变量,在运行时查看值,调用方法以及直接对他们的布局进行操作。这种机制称为反射(reflection)。 为什么使用反射 有时候我们需要写一个函数有能力统一处理各种值类型的函数,而这些类型可能无法共享同一个接口,也可能布局未知,也有可能这个类型在我们设计函数时还不存在。甚至这个类会同时存在上面三个问...

zk实现分布式锁

1.获取分布式锁的总体思路 在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。客户端调用createNode方法在locker下创建临时顺序节点, 然后调用getChildren(“locker”)来获取locker下面的所有子节点,注意此时不用设置任何Watcher。客户端获取到所有的子节点path之后,如果发现自己在...

Kubernetes监控etcd集群(自带metrics接口)

Kubernetes用operator部署prometheus上面采用Kubernetes部署prometheus 我们可以使用prometheus来监控自带metrics接口的应用。 etcd是Kubernetes的数据库,自带接口,我们可以用etcd作为实例来看看怎么操作。 一、监控etcd集群 1.1、查看接口信息 二进制和kubeadm安装方式...

Java深入学习28:Redisson分布式锁的使用

Java深入学习28:Redisson分布式锁的使用 情况1-常规情况,没有任何同步锁,使用Jmeter模拟多线程 问题:结果发现numTest会出现重复读写的情况(numTest = 6) @RestController public classRedissonController { static int numTest = 0; @G...

.net 分布式架构之分布式锁实现

分布式锁 经常用于在解决分布式环境下的业务一致性和协调分布式环境。 实际业务场景中,比如说解决并发一瞬间的重复下单,重复确认收货,重复发现金券等。 使用分布式锁的场景一般不能太多。 开源地址:http://git.oschina.net/chejiangyi/XXF.BaseService.DistributedLock 开源相关群: .net 开源基础服...