mao-service-discovery 1.6.0-commit-2023-07-24-04-32-53.0 → 1.6.0-commit-2023-07-24-06-22-14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/MaoServerDiscovery +0 -0
  2. package/package.json +1 -1
  3. package/.github/dependabot.yml +0 -11
  4. package/.github/workflows/codeql-analysis.yml +0 -75
  5. package/.github/workflows/docker-image.yml +0 -24
  6. package/.github/workflows/docker-publish.yml +0 -94
  7. package/.github/workflows/go.yml +0 -29
  8. package/.github/workflows/go_static.yml +0 -29
  9. package/.github/workflows/npm-publish-release.yml +0 -36
  10. package/.github/workflows/npm-publish.yml +0 -41
  11. package/Dockerfile +0 -19
  12. package/LICENSE +0 -201
  13. package/MODULES.md +0 -39
  14. package/README.md +0 -54
  15. package/bak/index.html +0 -42
  16. package/bak/receiveProcessIcmpLoopV4V6.bak +0 -73
  17. package/bak/test/test-icmp-ka-module.go +0 -297
  18. package/bak/test/test-tech.go +0 -110
  19. package/bak/using_etcd/main.go +0 -165
  20. package/cmd/api/aux-data-module.go +0 -14
  21. package/cmd/api/config-module.go +0 -11
  22. package/cmd/api/email-module.go +0 -14
  23. package/cmd/api/gateway-module.go +0 -23
  24. package/cmd/api/grpc-ka-module.go +0 -29
  25. package/cmd/api/icmp-ka-module.go +0 -26
  26. package/cmd/api/restful-server-module.go +0 -13
  27. package/cmd/api/topo-module.go +0 -31
  28. package/cmd/api/wechat-module.go +0 -18
  29. package/cmd/general_client.go +0 -366
  30. package/cmd/lib/AuxDataProcessor/aux-data-processor-module.go +0 -64
  31. package/cmd/lib/AuxDataProcessor/env-temp-processor.go +0 -63
  32. package/cmd/lib/AuxDataProcessor/env-temp-processor_test.go +0 -30
  33. package/cmd/lib/Config/config-yaml-module.go +0 -303
  34. package/cmd/lib/Config/config-yaml-module_test.go +0 -308
  35. package/cmd/lib/Email/login-auth.go +0 -35
  36. package/cmd/lib/Email/login-auth_test.go +0 -13
  37. package/cmd/lib/Email/smtp-email-module.go +0 -229
  38. package/cmd/lib/Email/smtp-email-module_test.go +0 -12
  39. package/cmd/lib/GrpcKa/grpc-detect-module.go +0 -269
  40. package/cmd/lib/GrpcKa/grpc-detect-module_test.go +0 -26
  41. package/cmd/lib/IcmpKa/icmp-detect-module.go +0 -545
  42. package/cmd/lib/IcmpKa/icmp-detect-module_test.go +0 -23
  43. package/cmd/lib/InfluxDB/influxdb-util.go +0 -72
  44. package/cmd/lib/MaoCommon/gps.go +0 -15
  45. package/cmd/lib/MaoCommon/service-registry-util.go +0 -59
  46. package/cmd/lib/MaoCommon/service-registry.go +0 -14
  47. package/cmd/lib/MaoCommon/service-registry_test.go +0 -30
  48. package/cmd/lib/MaoEnhancedGolang/smtp.go +0 -438
  49. package/cmd/lib/Restful/restful-server-impl.go +0 -87
  50. package/cmd/lib/Soap/soap-tplink-util.go +0 -186
  51. package/cmd/lib/Soap/soap-tplink-util_test.go +0 -45
  52. package/cmd/lib/Soap/tplink-gateway-module.go +0 -200
  53. package/cmd/server.go +0 -327
  54. package/go.mod +0 -38
  55. package/go.sum +0 -222
  56. package/grpc.maojianwei.com/server/discovery/api/generate_api_from_protobuf.sh +0 -1
  57. package/grpc.maojianwei.com/server/discovery/api/mao-server-discovery.pb.go +0 -403
  58. package/grpc.maojianwei.com/server/discovery/api/mao-server-discovery.proto +0 -35
  59. package/grpc.maojianwei.com/server/discovery/api/mao-server-discovery_grpc.pb.go +0 -207
  60. package/incubator/OnosTopoShow/onos-topo-module.go +0 -347
  61. package/incubator/Wechat/wechat-message-module.go +0 -267
  62. package/incubator/Wechat/wechat-message-module_test.go +0 -108
  63. package/main.go +0 -383
  64. package/notebook/notebook.txt +0 -8
  65. package/resource/index-email.html +0 -67
  66. package/resource/index-icmp.html +0 -41
  67. package/resource/index-onos.html +0 -38
  68. package/resource/index-server.html +0 -57
  69. package/resource/index-wechat.html +0 -64
  70. package/resource/jquery-3.6.0.min.js +0 -2
  71. package/screenshot/2-cli-output.png +0 -0
  72. package/screenshot/2-cli-parameters.png +0 -0
  73. package/screenshot/2-json-format.png +0 -0
  74. package/screenshot/2-readable-format.png +0 -0
  75. package/screenshot/client-server-mode-1.png +0 -0
  76. package/screenshot/client-server-mode-2.png +0 -0
  77. package/screenshot/client-server-mode-production.png +0 -0
  78. package/screenshot/show_using_etcd.png +0 -0
  79. package/statically_linked_compilation.sh +0 -2
  80. package/util/mao_log.go +0 -42
  81. package/util/mao_log_test.go +0 -73
  82. package/util/mao_util.go +0 -53
@@ -1,229 +0,0 @@
1
- package Email
2
-
3
- import (
4
- MaoApi "MaoServerDiscovery/cmd/api"
5
- "MaoServerDiscovery/cmd/lib/MaoCommon"
6
- "MaoServerDiscovery/cmd/lib/MaoEnhancedGolang"
7
- "MaoServerDiscovery/util"
8
- "crypto/tls"
9
- "fmt"
10
- "github.com/gin-gonic/gin"
11
- "strings"
12
- "time"
13
- )
14
-
15
- const (
16
- MODULE_NAME = "SMTP-Email-module"
17
-
18
- URL_EMAIL_HOMEPAGE = "/configEmail"
19
- URL_EMAIL_CONFIG = "/addEmailInfo"
20
- URL_EMAIL_SHOW = "/getEmailInfo"
21
-
22
- EMAIL_INFO_CONFIG_PATH = "/email"
23
-
24
- SUBJECT_FIX_PREFIX = "MaoReport: "
25
- )
26
-
27
- type SmtpEmailModule struct {
28
-
29
- username string
30
- password string // Attention: password can't be outputted !!!
31
- smtpServerAddrPort string // addr:port, default port for smtp is 25.
32
- sender string
33
- receiver []string
34
-
35
-
36
- // input the message
37
- sendEmailChannel chan *MaoApi.EmailMessage
38
- lastSendTimestamp time.Time
39
-
40
- // same as the other module, it is expected to be global
41
- //checkInterval uint32
42
-
43
- needShutdown bool
44
- }
45
-
46
- func (s *SmtpEmailModule) RequireShutdown() {
47
- s.needShutdown = true
48
- }
49
-
50
-
51
- func (s *SmtpEmailModule) SendEmail(message *MaoApi.EmailMessage) {
52
- s.sendEmailChannel <- message
53
- }
54
-
55
- func (s *SmtpEmailModule) checkEmailInfo() bool {
56
-
57
- // password may be empty?
58
- if s.username == "" || s.smtpServerAddrPort == "" || s.sender == "" || len(s.receiver) == 0 {
59
- // can adapt to "s.receiver == nil"
60
- return false
61
- }
62
- return true
63
- }
64
-
65
-
66
- func (s *SmtpEmailModule) sendEmail(m *MaoApi.EmailMessage) {
67
-
68
- if !s.checkEmailInfo() {
69
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to send email, please config email info first.")
70
- return
71
- }
72
-
73
- // Set up authentication information everytime, that allows to update:
74
- // username, password, smtpServerAddrPort, sender, receiver
75
- auth := AuthLOGIN(s.username, s.password)
76
-
77
- // TODO: how to build multiple receivers string?
78
- // TODO: support multiple receivers
79
- msg := fmt.Sprintf("To: %s\r\n" +
80
- "Subject: %s%s\r\n" + "\r\n" +
81
- "%s\r\n",
82
- s.receiver[0], SUBJECT_FIX_PREFIX, m.Subject, m.Content)
83
-
84
- //msg := []byte("To: @.com\r\n" +
85
- // "Subject: MaoReport: beijing tower\r\n" +
86
- // "\r\n" +
87
- // "This is the email body.\r\n")
88
-
89
- // TODO: make it configurable
90
- tlsConfig := &tls.Config{
91
- InsecureSkipVerify: true,
92
- }
93
-
94
- // Connect to the server, authenticate, set the sender and recipient,
95
- // and send the email all in one step.
96
- err := MaoEnhancedGolang.SendMail(s.smtpServerAddrPort, auth, s.sender, s.receiver, []byte(msg), tlsConfig)
97
- if err != nil {
98
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to send email, %s", err.Error())
99
- }
100
- }
101
-
102
- func (s *SmtpEmailModule) sendEmailLoop() {
103
- checkInterval := time.Duration(1000) * time.Millisecond
104
- checkShutdownTimer := time.NewTimer(checkInterval)
105
- for {
106
- select {
107
- case message := <-s.sendEmailChannel:
108
- if time.Now().Sub(s.lastSendTimestamp) < 10 * time.Second {
109
- freezeTimer := time.NewTimer(time.Duration(10) * time.Second)
110
- sent := false
111
- for !sent {
112
- select {
113
- case <-freezeTimer.C:
114
- util.MaoLogM(util.INFO, MODULE_NAME, "Sending email, pending: %d", len(s.sendEmailChannel))
115
- s.sendEmail(message)
116
- s.lastSendTimestamp = time.Now()
117
- sent = true
118
- case <-checkShutdownTimer.C:
119
- util.MaoLogM(util.DEBUG, MODULE_NAME, "CheckShutdown while freezing, event queue len %d", len(s.sendEmailChannel))
120
- if s.needShutdown {
121
- util.MaoLogM(util.WARN, MODULE_NAME, "Exit while freezing, the sendEmailChannel len: %d", len(s.sendEmailChannel))
122
- return
123
- }
124
- checkShutdownTimer.Reset(checkInterval)
125
- }
126
- }
127
- } else {
128
- util.MaoLogM(util.INFO, MODULE_NAME, "Sending email, pending: %d", len(s.sendEmailChannel))
129
- s.sendEmail(message)
130
- s.lastSendTimestamp = time.Now()
131
- }
132
- case <-checkShutdownTimer.C:
133
- util.MaoLogM(util.DEBUG, MODULE_NAME, "CheckShutdown, event queue len %d", len(s.sendEmailChannel))
134
- if s.needShutdown {
135
- if len(s.sendEmailChannel) != 0 {
136
- util.MaoLogM(util.WARN, MODULE_NAME, "Exiting, but the sendEmailChannel is not empty, len: %d", len(s.sendEmailChannel))
137
- }
138
- util.MaoLogM(util.INFO, MODULE_NAME, "Exit.")
139
- return
140
- }
141
- checkShutdownTimer.Reset(checkInterval)
142
- }
143
- }
144
- }
145
-
146
- func (s *SmtpEmailModule) InitSmtpEmailModule() bool {
147
- s.sendEmailChannel = make(chan *MaoApi.EmailMessage, 1024)
148
- s.needShutdown = false
149
-
150
- go s.sendEmailLoop()
151
-
152
- s.configRestControlInterface()
153
-
154
- return true
155
- }
156
-
157
- func (s *SmtpEmailModule) configRestControlInterface() {
158
- restfulServer := MaoCommon.ServiceRegistryGetRestfulServerModule()
159
- if restfulServer == nil {
160
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get RestfulServerModule, unable to register restful apis.")
161
- return
162
- }
163
-
164
- restfulServer.RegisterUiPage(URL_EMAIL_HOMEPAGE, s.showEmailPage)
165
- restfulServer.RegisterGetApi(URL_EMAIL_SHOW, s.showEmailInfo)
166
- restfulServer.RegisterPostApi(URL_EMAIL_CONFIG, s.processEmailInfo)
167
- }
168
-
169
- func (s *SmtpEmailModule) showEmailPage(c *gin.Context) {
170
- c.HTML(200, "index-email.html", nil)
171
- }
172
-
173
- func (s *SmtpEmailModule) showEmailInfo(c *gin.Context) {
174
- data := make(map[string]interface{})
175
- data["username"] = s.username
176
- data["smtpServerAddrPort"] = s.smtpServerAddrPort
177
- data["sender"] = s.sender
178
- data["receiver"] = s.receiver
179
-
180
- // Attention: password can't be outputted !!!
181
- c.JSON(200, data)
182
- }
183
-
184
- func (s *SmtpEmailModule) processEmailInfo(c *gin.Context) {
185
-
186
- // TODO: check email address, limit the length of username/password/email. Prevent injection attack
187
-
188
- username, ok := c.GetPostForm("username")
189
- if ok {
190
- s.username = username
191
- }
192
-
193
- password, ok := c.GetPostForm("password")
194
- if ok {
195
- s.password = password
196
- }
197
-
198
- smtpServerAddrPort, ok := c.GetPostForm("smtpServerAddrPort")
199
- if ok {
200
- s.smtpServerAddrPort = smtpServerAddrPort
201
- }
202
-
203
- sender, ok := c.GetPostForm("sender")
204
- if ok {
205
- s.sender = sender
206
- }
207
-
208
- receiverStr, ok := c.GetPostForm("receiver")
209
- if ok {
210
- receivers := strings.Fields(receiverStr)
211
- s.receiver = receivers
212
- }
213
-
214
- configModule := MaoCommon.ServiceRegistryGetConfigModule()
215
- if configModule == nil {
216
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get config module instance, can't save email info")
217
- } else {
218
- data := make(map[string]interface{})
219
- data["username"] = s.username
220
- data["smtpServerAddrPort"] = s.smtpServerAddrPort
221
- data["sender"] = s.sender
222
- data["receiver"] = s.receiver
223
-
224
- // Attention: password can't be outputted !!!
225
- configModule.PutConfig(EMAIL_INFO_CONFIG_PATH, data)
226
- }
227
-
228
- s.showEmailPage(c)
229
- }
@@ -1,12 +0,0 @@
1
- package Email
2
-
3
- import (
4
- "log"
5
- "testing"
6
- )
7
-
8
- func TestSmtpEmailModule_InitSmtpEmailModule(t *testing.T) {
9
- var receivers []string
10
-
11
- log.Println(len(receivers))
12
- }
@@ -1,269 +0,0 @@
1
- package GrpcKa
2
-
3
- import (
4
- MaoApi "MaoServerDiscovery/cmd/api"
5
- "MaoServerDiscovery/cmd/lib/MaoCommon"
6
- pb "MaoServerDiscovery/grpc.maojianwei.com/server/discovery/api"
7
- "MaoServerDiscovery/util"
8
- "errors"
9
- "fmt"
10
- "google.golang.org/grpc"
11
- "google.golang.org/grpc/peer"
12
- "net"
13
- "sort"
14
- "sync"
15
- "time"
16
- )
17
-
18
- const (
19
- MODULE_NAME = "GRPC-Detect-module"
20
- )
21
-
22
- type GrpcDetectModule struct {
23
- serverInfo sync.Map
24
- mergeChannel chan *MaoApi.GrpcServiceNode
25
- rttMergeChannel chan *MaoApi.GrpcServiceNode
26
-
27
- server *grpc.Server
28
- pb.UnimplementedMaoServerDiscoveryServer
29
-
30
- checkInterval uint32 // milliseconds
31
- leaveTimeout uint32 // milliseconds
32
- refreshShowingInterval uint32 // milliseconds
33
-
34
- // used for web showing, i.e. external get operation
35
- // used for processing aux data
36
- serverInfoMirror []*MaoApi.GrpcServiceNode
37
- }
38
-
39
- // implement pb.UnimplementedMaoServerDiscoveryServer
40
- func (g *GrpcDetectModule) Report(reportStream pb.MaoServerDiscovery_ReportServer) error {
41
- util.MaoLogM(util.DEBUG, MODULE_NAME, "Triggered new report session")
42
- ctx := reportStream.Context()
43
- peerCtx, okbool := peer.FromContext(ctx)
44
- if !okbool {
45
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get peerCtx, @Report")
46
- return errors.New("Fail to get peerCtx, @Report")
47
- }
48
- //peerMetadata, okbool := metadata.FromIncomingContext(ctx)
49
- //if !okbool {
50
- // util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get peerMetadata")
51
- // return errors.New("Fail to get peerMetadata")
52
- //}
53
- //transportstream := grpc.ServerTransportStreamFromContext(ctx)
54
-
55
- util.MaoLogM(util.INFO, MODULE_NAME, "New server comming: %s", peerCtx.Addr.String())
56
- _ = g.dealRecv(reportStream)
57
- return nil
58
- }
59
-
60
- func (g *GrpcDetectModule) dealRecv(reportStream pb.MaoServerDiscovery_ReportServer) error {
61
- ctx := reportStream.Context()
62
- peerCtx, okbool := peer.FromContext(ctx)
63
- var clientAddr string
64
- if !okbool {
65
- clientAddr = "Client-<unknown>"
66
- }
67
- clientAddr = peerCtx.Addr.String()
68
-
69
- var count uint64 = 1
70
- for {
71
- report, err := reportStream.Recv()
72
- if err != nil {
73
- util.MaoLogM(util.ERROR, MODULE_NAME, "Report err: <%s> %s", clientAddr, err)
74
- return err
75
- }
76
- util.MaoLogM(util.DEBUG, MODULE_NAME, "Report get: <%s> %s, %v", clientAddr, report.GetHostname(), report.GetIps())
77
- if report.GetOk() {
78
- g.mergeChannel <- &MaoApi.GrpcServiceNode{
79
- ReportTimes: count,
80
- Hostname: report.GetHostname(),
81
- Ips: report.GetIps(),
82
- ServerDateTime: report.GetNowDatetime(),
83
- OtherData: report.GetAuxData(),
84
- RealClientAddr: clientAddr,
85
- LocalLastSeen: time.Now(),
86
- Alive: true,
87
- }
88
- }
89
- count++
90
- }
91
- }
92
-
93
-
94
- func (g *GrpcDetectModule) RttMeasure(rttMeasureStream pb.MaoServerDiscovery_RttMeasureServer) error {
95
- util.MaoLogM(util.DEBUG, MODULE_NAME, "Triggered new RTT measure session")
96
- ctx := rttMeasureStream.Context()
97
- peerCtx, okbool := peer.FromContext(ctx)
98
- if !okbool {
99
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get peerCtx, @RttMeasure")
100
- return errors.New("Fail to get peerCtx, @RttMeasure")
101
- }
102
- //peerMetadata, okbool := metadata.FromIncomingContext(ctx)
103
- //transportstream := grpc.ServerTransportStreamFromContext(ctx)
104
-
105
- util.MaoLogM(util.INFO, MODULE_NAME, "New RTT measure session for %s", peerCtx.Addr.String())
106
- _ = g.doRttMeasure(rttMeasureStream, peerCtx.Addr.String())
107
- return nil
108
- }
109
-
110
- func (g *GrpcDetectModule) doRttMeasure(rttMeasureStream pb.MaoServerDiscovery_RttMeasureServer, clientAddr string) error {
111
- var count uint64 = 0
112
- for {
113
- count++
114
-
115
- echoRequest := pb.RttEchoRequest{Seq: count}
116
- t1 := time.Now()
117
- if err := rttMeasureStream.Send(&echoRequest); err != nil {
118
- util.MaoLogM(util.ERROR, MODULE_NAME, "Fail to send Rtt echo request to %s, %s", clientAddr, err)
119
- return err
120
- }
121
-
122
- // gRPC is based on TCP now, so we don't need to do timeout setting.
123
- // And, if the TCP connection broke, Recv() will return with error.
124
- echoResponse, err := rttMeasureStream.Recv()
125
- if err != nil {
126
- util.MaoLogM(util.ERROR, MODULE_NAME, "Fail to recv Rtt echo response from %s, %s", clientAddr, err)
127
- return err
128
- }
129
- t2 := time.Now()
130
- if echoResponse.Ack == echoRequest.Seq {
131
- duration := t2.Sub(t1) // nanosecond
132
- g.rttMergeChannel <- &MaoApi.GrpcServiceNode{
133
- Hostname: echoResponse.GetHostname(),
134
- RttDuration: duration,
135
- }
136
- util.MaoLogM(util.DEBUG, MODULE_NAME, "Calculated RTT delay %s for %s", duration.String(), echoResponse.GetHostname())
137
- }
138
-
139
- time.Sleep(1 * time.Second)
140
- }
141
- }
142
-
143
- func (g *GrpcDetectModule) runGrpcServer(listener net.Listener) {
144
- util.MaoLogM(util.INFO, MODULE_NAME, "Server running %s ...", listener.Addr().String())
145
- if err := g.server.Serve(listener); err != nil {
146
- util.MaoLogM(util.ERROR, MODULE_NAME, "%s", err)
147
- }
148
- util.MaoLogM(util.INFO, MODULE_NAME, "Serve over")
149
- }
150
-
151
-
152
-
153
-
154
- func (g *GrpcDetectModule) controlLoop() {
155
- checkTimer := time.NewTimer(time.Duration(g.checkInterval) * time.Millisecond)
156
- for {
157
- select {
158
- case serverNode := <-g.rttMergeChannel:
159
- value, ok := g.serverInfo.Load(serverNode.Hostname)
160
- if ok && value != nil {
161
- server := value.(*MaoApi.GrpcServiceNode)
162
- server.RttDuration = serverNode.RttDuration
163
- }
164
- case serverNode := <-g.mergeChannel:
165
- value, ok := g.serverInfo.Load(serverNode.Hostname)
166
- if ok && value != nil {
167
- server := value.(*MaoApi.GrpcServiceNode)
168
- if !server.Alive && serverNode.Alive {
169
- emailModule := MaoCommon.ServiceRegistryGetEmailModule()
170
- if emailModule == nil {
171
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get EmailModule, can't send UP notification")
172
- } else {
173
- emailModule.SendEmail(&MaoApi.EmailMessage{
174
- Subject: "Grpc UP notification",
175
- Content: fmt.Sprintf("Service: %s\r\nUp Time: %s\r\nDetail: %v\r\n",
176
- serverNode.Hostname, time.Now().String(), serverNode),
177
- })
178
- }
179
- }
180
- server.ReportTimes = serverNode.ReportTimes
181
- server.Hostname = serverNode.Hostname
182
- server.Ips = serverNode.Ips
183
- server.ServerDateTime = serverNode.ServerDateTime
184
- server.OtherData = serverNode.OtherData
185
- server.RealClientAddr = serverNode.RealClientAddr
186
- server.LocalLastSeen = serverNode.LocalLastSeen
187
- server.Alive = serverNode.Alive
188
- } else {
189
- // Attention, serverNode instance is not created always. 2023.07.24
190
- // TODO: other place may need to be check.
191
- g.serverInfo.Store(serverNode.Hostname, serverNode)
192
- }
193
- case <-checkTimer.C:
194
- // aliveness checking
195
- g.serverInfo.Range(func(key, value interface{}) bool {
196
- service := value.(*MaoApi.GrpcServiceNode)
197
- if service.Alive && time.Since(service.LocalLastSeen) > time.Duration(g.leaveTimeout) * time.Millisecond {
198
- service.Alive = false
199
- g.mergeChannel <- service
200
-
201
- emailModule := MaoCommon.ServiceRegistryGetEmailModule()
202
- if emailModule == nil {
203
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to get EmailModule, can't send DOWN notification")
204
- } else {
205
- emailModule.SendEmail(&MaoApi.EmailMessage{
206
- Subject: "Grpc DOWN notification",
207
- Content: fmt.Sprintf("Service: %s\r\nDOWN Time: %s\r\nDetail: %v\r\n",
208
- service.Hostname, time.Now().String(), service),
209
- })
210
- }
211
- }
212
- return true
213
- })
214
- checkTimer.Reset(time.Duration(g.checkInterval) * time.Millisecond)
215
- }
216
- }
217
- }
218
-
219
-
220
-
221
- func (g *GrpcDetectModule) refreshShowingService() {
222
- for {
223
- time.Sleep(time.Duration(g.refreshShowingInterval) * time.Millisecond)
224
- serversTmp := make([]*MaoApi.GrpcServiceNode, 0)
225
- g.serverInfo.Range(func(_, value interface{}) bool {
226
- serversTmp = append(serversTmp, value.(*MaoApi.GrpcServiceNode))
227
- return true
228
- })
229
- g.serverInfoMirror = serversTmp
230
- }
231
- }
232
-
233
- func (g *GrpcDetectModule) GetServiceInfo() []*MaoApi.GrpcServiceNode {
234
- servers := g.serverInfoMirror
235
- sort.Slice(servers, func(i, j int) bool {
236
- return servers[i].Hostname < servers[j].Hostname
237
- })
238
- return servers
239
- }
240
-
241
-
242
-
243
- func (g *GrpcDetectModule) InitGrpcModule(addrPort string) bool {
244
- g.mergeChannel = make(chan *MaoApi.GrpcServiceNode, 1024)
245
- g.rttMergeChannel = make(chan *MaoApi.GrpcServiceNode, 1024)
246
-
247
- g.checkInterval = 500
248
- g.leaveTimeout = 5000
249
- g.refreshShowingInterval = 1000
250
- g.serverInfoMirror = make([]*MaoApi.GrpcServiceNode, 0)
251
-
252
-
253
- listener, err := net.Listen("tcp", addrPort)
254
- if err != nil {
255
- util.MaoLogM(util.WARN, MODULE_NAME, "Fail to create listener at %s, err: %s", addrPort, err.Error())
256
- return false
257
- }
258
-
259
- g.server = grpc.NewServer()
260
- pb.RegisterMaoServerDiscoveryServer(g.server, g)
261
- go g.runGrpcServer(listener)
262
-
263
-
264
- go g.controlLoop()
265
- go g.refreshShowingService()
266
-
267
- return true
268
- }
269
-
@@ -1,26 +0,0 @@
1
- package GrpcKa
2
-
3
- import (
4
- MaoApi "MaoServerDiscovery/cmd/api"
5
- "fmt"
6
- "log"
7
- "testing"
8
- "time"
9
- )
10
-
11
- func TestGrpcDetectModule_GetServiceInfo(t *testing.T) {
12
- serverNode := &MaoApi.GrpcServiceNode{
13
- ReportTimes: 666,
14
- Hostname: "qingdao-hostname",
15
- Ips: nil,
16
- ServerDateTime: time.Now().String(),
17
- OtherData: "OtherDataOtherData",
18
- RealClientAddr: "1.1.1.1",
19
- LocalLastSeen: time.Now(),
20
- Alive: true,
21
- }
22
- s := fmt.Sprintf("Service: %s\r\nUp Time: %s\r\nDetail: %v\r\n",
23
- serverNode.Hostname, time.Now().String(), serverNode)
24
-
25
- log.Println(s)
26
- }