-
Notifications
You must be signed in to change notification settings - Fork 0
/
consul_register.go
111 lines (92 loc) · 3.04 KB
/
consul_register.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
package register
import (
"github.com/tsbxmw/datasource/common/consul/discovery"
"fmt"
consulapi "github.com/hashicorp/consul/api"
"log"
"os"
"os/signal"
"strconv"
"syscall"
"time"
)
type ConsulRegister struct {
Target string
Ttl int
}
func NewConsulRegister(target string, ttl int) *ConsulRegister {
return &ConsulRegister{Target: target, Ttl: ttl}
}
func (cr *ConsulRegister) Register(info discovery.RegisterInfo) error {
config := consulapi.DefaultConfig()
config.Address = cr.Target
client, err := consulapi.NewClient(config)
if err != nil {
log.Println("create consul client error:", err.Error())
}
serviceId := generateServiceId(info.ServiceName, info.Host, info.Port)
reg := &consulapi.AgentServiceRegistration{
ID: serviceId,
Name: info.ServiceName,
Tags: []string{info.ServiceName},
Port: info.Port,
Address: info.Host,
}
if err = client.Agent().ServiceRegister(reg); err != nil {
panic(err)
}
// initial register service check
check := consulapi.AgentServiceCheck{TTL: fmt.Sprintf("%ds", cr.Ttl), Status: consulapi.HealthPassing}
err = client.Agent().CheckRegister(
&consulapi.AgentCheckRegistration{
ID: serviceId,
Name: info.ServiceName,
ServiceID: serviceId,
AgentServiceCheck: check})
if err != nil {
return fmt.Errorf("initial register service check to consul error: %s", err.Error())
}
go func() {
ch := make(chan os.Signal, 1)
signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL, syscall.SIGHUP, syscall.SIGQUIT)
x := <-ch
log.Println("receive signal: ", x)
cr.DeRegister(info)
s, _ := strconv.Atoi(fmt.Sprintf("%d", x))
os.Exit(s)
}()
go func() {
ticker := time.NewTicker(info.UpdateInterval)
for {
<-ticker.C
err = client.Agent().UpdateTTL(serviceId, "", check.Status)
if err != nil {
log.Println("update ttl of service error: ", err.Error())
}
}
}()
return nil
}
func (cr *ConsulRegister) DeRegister(info discovery.RegisterInfo) error {
serviceId := generateServiceId(info.ServiceName, info.Host, info.Port)
config := consulapi.DefaultConfig()
config.Address = cr.Target
client, err := consulapi.NewClient(config)
if err != nil {
log.Println("create consul client error:", err.Error())
}
err = client.Agent().ServiceDeregister(serviceId)
if err != nil {
log.Println("deregister service error: ", err.Error())
} else {
log.Println("deregistered service from consul server.")
}
err = client.Agent().CheckDeregister(serviceId)
if err != nil {
log.Println("deregister check error: ", err.Error())
}
return nil
}
func generateServiceId(name, host string, port int) string {
return fmt.Sprintf("%s-%s-%d", name, host, port)
}