@@ -16,13 +16,12 @@ import (
16
16
type NodeStateChangeCallback func (state discovery.NodeState , node * discovery.Node )
17
17
18
18
type Client struct {
19
- nc * nats.Conn
20
- sub * nats.Subscription
21
- nodes map [string ]* discovery.Node
22
- nodeLock sync.Mutex
23
- ctx context.Context
24
- cancel context.CancelFunc
25
- handleNodeStateChange NodeStateChangeCallback
19
+ nc * nats.Conn
20
+ sub * nats.Subscription
21
+ nodes map [string ]* discovery.Node
22
+ nodeLock sync.Mutex
23
+ ctx context.Context
24
+ cancel context.CancelFunc
26
25
}
27
26
28
27
func (c * Client ) Close () {
@@ -42,9 +41,11 @@ func NewClient(nc *nats.Conn) (*Client, error) {
42
41
return c , nil
43
42
}
44
43
45
- func (c * Client ) Get (service string ) (* discovery.GetResponse , error ) {
46
- data , err := util .Marshal (& discovery.KeepAlive {
47
- Action : discovery .Get , Node : discovery.Node {},
44
+ func (c * Client ) Get (service string , params map [string ]interface {}) (* discovery.GetResponse , error ) {
45
+ data , err := util .Marshal (& discovery.Request {
46
+ Action : discovery .Get ,
47
+ Service : service ,
48
+ Params : params ,
48
49
})
49
50
if err != nil {
50
51
log .Errorf ("%v" , err )
@@ -61,21 +62,21 @@ func (c *Client) Get(service string) (*discovery.GetResponse, error) {
61
62
var resp discovery.GetResponse
62
63
err = util .Unmarshal (msg .Data , & resp )
63
64
if err != nil {
64
- log .Errorf ("Get: error parsing offer : %v" , err )
65
+ log .Errorf ("Get: error parsing discovery.GetResponse : %v" , err )
65
66
return nil , err
66
67
}
67
68
68
69
log .Infof ("nodes %v" , resp .Nodes )
69
70
return & resp , nil
70
71
}
71
72
72
- func (c * Client ) handleMsg (msg * nats.Msg ) error {
73
+ func (c * Client ) handleNatsMsg (msg * nats.Msg , callback NodeStateChangeCallback ) error {
73
74
log .Infof ("handle discovery message: %v" , msg .Subject )
74
75
75
76
c .nodeLock .Lock ()
76
77
defer c .nodeLock .Unlock ()
77
78
78
- var event discovery.KeepAlive
79
+ var event discovery.Request
79
80
err := util .Unmarshal (msg .Data , & event )
80
81
if err != nil {
81
82
log .Errorf ("connect: error parsing offer: %v" , err )
@@ -87,31 +88,38 @@ func (c *Client) handleMsg(msg *nats.Msg) error {
87
88
if _ , ok := c .nodes [nid ]; ! ok {
88
89
log .Infof ("node.save" )
89
90
c .nodes [nid ] = & event .Node
90
- c . handleNodeStateChange (discovery .NodeUp , & event .Node )
91
+ callback (discovery .NodeUp , & event .Node )
91
92
}
92
93
case discovery .Update :
93
94
if _ , ok := c .nodes [nid ]; ok {
94
95
log .Infof ("node.update" )
95
- c . handleNodeStateChange (discovery .NodeKeepalive , & event .Node )
96
+ callback (discovery .NodeKeepalive , & event .Node )
96
97
}
97
98
case discovery .Delete :
98
99
if _ , ok := c .nodes [nid ]; ok {
99
100
log .Infof ("node.delete" )
100
- c . handleNodeStateChange (discovery .NodeDown , & event .Node )
101
+ callback (discovery .NodeDown , & event .Node )
101
102
}
102
103
delete (c .nodes , nid )
103
104
default :
104
- log .Warnf ("unkonw message: %v" , string (msg .Data ))
105
- return fmt .Errorf ("unkonw message: %v" , msg .Data )
105
+ err = fmt .Errorf ("unkonw message: %v" , msg .Data )
106
+ log .Warnf ("handleNatsMsg: err => %v" , err )
107
+ return err
106
108
}
107
109
108
110
return nil
109
111
}
110
112
111
- func (c * Client ) Watch (service string , onStateChange NodeStateChangeCallback ) error {
113
+ func (c * Client ) Watch (service string , handleNodeState NodeStateChangeCallback ) error {
112
114
var err error
113
- subj := discovery .DefaultDiscoveryPrefix + "." + service + ".>"
114
115
116
+ if handleNodeState == nil {
117
+ err = fmt .Errorf ("Watch callback must be set for %v" , service )
118
+ log .Warnf ("Watch: err => %v" , err )
119
+ return err
120
+ }
121
+
122
+ subj := discovery .DefaultDiscoveryPrefix + "." + service + ".>"
115
123
msgCh := make (chan * nats.Msg )
116
124
117
125
if c .sub , err = c .nc .Subscribe (subj , func (msg * nats.Msg ) {
@@ -120,16 +128,14 @@ func (c *Client) Watch(service string, onStateChange NodeStateChangeCallback) er
120
128
return err
121
129
}
122
130
123
- c .handleNodeStateChange = onStateChange
124
-
125
131
go func () error {
126
132
for {
127
133
select {
128
134
case <- c .ctx .Done ():
129
135
return c .ctx .Err ()
130
136
case msg , ok := <- msgCh :
131
137
if ok {
132
- err := c .handleMsg (msg )
138
+ err := c .handleNatsMsg (msg , handleNodeState )
133
139
if err != nil {
134
140
return err
135
141
}
@@ -147,11 +153,11 @@ func (c *Client) KeepAlive(node discovery.Node) error {
147
153
t := time .NewTicker (discovery .DefaultLivecycle )
148
154
149
155
defer func () {
150
- c .SendAction (node , discovery .Delete )
156
+ c .sendAction (node , discovery .Delete )
151
157
t .Stop ()
152
158
}()
153
159
154
- c .SendAction (node , discovery .Save )
160
+ c .sendAction (node , discovery .Save )
155
161
156
162
for {
157
163
select {
@@ -160,24 +166,37 @@ func (c *Client) KeepAlive(node discovery.Node) error {
160
166
log .Errorf ("keepalive abort: err %v" , err )
161
167
return err
162
168
case <- t .C :
163
- c .SendAction (node , discovery .Update )
164
- break
169
+ c .sendAction (node , discovery .Update )
165
170
}
166
171
}
167
172
}
168
173
169
- func (c * Client ) SendAction (node discovery.Node , action string ) error {
170
- data , err := util .Marshal (& discovery.KeepAlive {
174
+ func (c * Client ) sendAction (node discovery.Node , action discovery. Action ) error {
175
+ data , err := util .Marshal (& discovery.Request {
171
176
Action : action , Node : node ,
172
177
})
173
178
if err != nil {
174
179
log .Errorf ("%v" , err )
175
180
return err
176
181
}
177
182
subj := discovery .DefaultPublishPrefix + "." + node .Service + "." + node .ID ()
178
- if err := c .nc .Publish (subj , data ); err != nil {
183
+ msg , err := c .nc .Request (subj , data , time .Duration (time .Second * 15 ))
184
+ if err != nil {
179
185
log .Errorf ("node start error: err=%v, id=%v" , err , node .ID ())
180
186
return nil
181
187
}
188
+
189
+ var resp discovery.Response
190
+ err = util .Unmarshal (msg .Data , & resp )
191
+ if err != nil {
192
+ log .Errorf ("sendAction: [%v] parsing discovery.Response error: %v" , action , err )
193
+ return err
194
+ }
195
+
196
+ if ! resp .Success {
197
+ err := fmt .Errorf ("[%v] response error %v" , action , resp .Reason )
198
+ log .Errorf ("sendAction: error: %v" , err )
199
+ return err
200
+ }
182
201
return nil
183
202
}
0 commit comments