/
main.go
86 lines (73 loc) · 1.89 KB
/
main.go
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
package main
import (
"context"
"fmt"
"log"
"time"
"github.com/qingwave/gocorex/discovery/etcdiscovery"
"github.com/qingwave/gocorex/syncx/group"
clientv3 "go.etcd.io/etcd/client/v3"
)
func main() {
client, err := clientv3.New(clientv3.Config{
Endpoints: []string{"localhost:2379"},
DialTimeout: 3 * time.Second,
})
if err != nil {
log.Fatalf("failed to create etcd lock: %v", err)
}
defer client.Close()
worker := func(i int, run bool) {
id := fmt.Sprintf("worker-%d", i)
val := fmt.Sprintf("10.0.0.%d", i)
sd, err := etcdiscovery.New(etcdiscovery.EtcdDiscoveryConfig{
Client: client,
Prefix: "/services",
Key: id,
Val: val,
TTLSeconds: 2,
Callbacks: etcdiscovery.DiscoveryCallbacks{
OnStartedDiscovering: func(services []etcdiscovery.Service) {
log.Printf("[%s], onstarted, services: %v", id, services)
},
OnStoppedDiscovering: func() {
log.Printf("[%s], onstoped", id)
},
OnServiceChanged: func(services []etcdiscovery.Service, event etcdiscovery.DiscoveryEvent) {
log.Printf("[%s], onchanged, services: %v, event: %v", id, services, event)
},
},
})
if err != nil {
log.Fatalf("failed to create service etcdiscovery: %v", err)
}
defer sd.Close()
if !run {
if sd.UnRegister(context.Background()); err != nil {
log.Fatalf("failed to unregister service [%s]: %v", id, err)
}
return
}
if err := sd.Register(context.Background()); err != nil {
log.Fatalf("failed to register service [%s]: %v", id, err)
}
if err := sd.Watch(context.Background()); err != nil {
log.Fatalf("failed to watch service: %v", err)
}
}
wg := group.NewGroup()
for i := 0; i < 3; i++ {
id := i
wg.Go(func() { worker(id, true) })
}
go func() {
time.Sleep(2 * time.Second)
worker(3, true)
}()
// unregister
go func() {
time.Sleep(4 * time.Second)
worker(2, false)
}()
wg.Wait()
}