Consul 分布式锁

Consul分布式锁

Golang 代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package main

import (
	"errors"
	"fmt"
	"github.com/hashicorp/consul/api"
	"sync"
	"time"
)

const (
	host = "192.168.80.128:8500"
)

var (
	Client  *api.Client
)

// 初始化consul
func initConsul() {
	client, err := api.NewClient(&api.Config{Address: host})
	if err != nil {
		panic(err)
	}
	Client = client
}

func NewLock(key, sessionTTL string) (*api.Lock, error) {
	opts := &api.LockOptions{
		Key:         key,
		SessionName: "1",
		SessionTTL:  sessionTTL,
	}

	lock, err := Client.LockOpts(opts)
	if err != nil {
		return nil, errors.New("failed to created lock")
	}
	return lock, nil
}

var wg sync.WaitGroup

func fn(key string) error {
	defer func() {
		wg.Done()
	}()
	var lock, err = NewLock(key, "10s")
	if err != nil {
		return err
	}
	_, err = lock.Lock(nil)
	if err != nil {
		return err
	}
	fmt.Println("operation for", key)
	time.Sleep(time.Second)
	err = lock.Unlock()
	if err != nil {
		return err
	}
	return nil
}

func main() {
	initConsul()

	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			err := fn("id:1")
			if err != nil {
				fmt.Println(err)
			}
		}()
	}
	for i := 0; i < 10; i++ {
		wg.Add(1)
		go func() {
			err := fn("id:2")
			if err != nil {
				fmt.Println(err)
			}
		}()
	}
	wg.Wait()
}
updatedupdated2025-09-302025-09-30