@@ -20,6 +20,7 @@ package nacos
2020import (
2121 "bytes"
2222 "fmt"
23+ "math"
2324 "strconv"
2425 "strings"
2526 "time"
@@ -158,94 +159,83 @@ func (nr *nacosRegistry) UnRegister(url *common.URL) error {
158159 return nil
159160}
160161
161- func (nr * nacosRegistry ) subscribe (conf * common.URL ) (registry.Listener , error ) {
162- return NewNacosListener (conf , nr .URL , nr .namingClient )
163- }
164-
165162// Subscribe returns nil if subscribing registry successfully. If not returns an error.
166163func (nr * nacosRegistry ) Subscribe (url * common.URL , notifyListener registry.NotifyListener ) error {
167- // TODO
168164 role , _ := strconv .Atoi (url .GetParam (constant .RegistryRoleKey , "" ))
169165 if role != common .CONSUMER {
170166 return nil
171167 }
172168 serviceName := url .GetParam (constant .InterfaceKey , "" )
173- if serviceName == "*" {
174- // Subscribe to all services
175- for {
176- if ! nr .IsAvailable () {
177- logger .Warnf ("event listener game over." )
178- return perrors .New ("nacosRegistry is not available." )
179- }
180-
181- services , err := nr .getAllSubscribeServiceNames ()
182- if err != nil {
183- if ! nr .IsAvailable () {
184- logger .Warnf ("event listener game over." )
185- return err
186- }
187- logger .Warnf ("getAllServices() = err:%v" , perrors .WithStack (err ))
188- time .Sleep (time .Duration (RegistryConnDelay ) * time .Second )
189- continue
190- }
191-
192- for _ , service := range services {
193- listener , err := nr .subscribeToService (url , service )
194- metrics .Publish (metricsRegistry .NewSubscribeEvent (err == nil ))
195- if err != nil {
196- logger .Warnf ("Failed to subscribe to service '%s': %v" , service , err )
197- continue
198- }
199-
200- nr .handleServiceEvents (listener , notifyListener )
201- }
169+ var serviceNames []string
170+ var err error
171+ if serviceName == constant .AnyValue {
172+ serviceNames , err = nr .getAllSubscribeServiceNames (url )
173+ if err != nil {
174+ return err
202175 }
203176 } else {
204- // Subscribe to a specific service
205- for {
206- if ! nr .IsAvailable () {
207- logger .Warnf ("event listener game over." )
208- return perrors .New ("nacosRegistry is not available." )
209- }
177+ serviceNames = []string {getSubscribeName (url )}
178+ }
179+ return nr .subscribe (serviceNames , notifyListener )
180+ }
210181
211- listener , err := nr .subscribe (url )
182+ // subscribe subscribe services
183+ func (nr * nacosRegistry ) subscribe (serviceNames []string , notifyListener registry.NotifyListener ) error {
184+ if len (serviceNames ) == 0 {
185+ logger .Warnf ("No services to listen to." )
186+ return nil
187+ }
188+ for {
189+ if ! nr .IsAvailable () {
190+ logger .Warnf ("event listener game over." )
191+ return perrors .New ("nacosRegistry is not available." )
192+ }
193+ var err error
194+ for _ , serviceName := range serviceNames {
195+ listener := NewNacosListenerWithServiceName (serviceName , nr .URL , nr .namingClient )
196+ err = listener .listenService (serviceName )
212197 metrics .Publish (metricsRegistry .NewSubscribeEvent (err == nil ))
213198 if err != nil {
214- if ! nr .IsAvailable () {
215- logger .Warnf ("event listener game over." )
216- return err
217- }
218- logger .Warnf ("getListener() = err:%v" , perrors .WithStack (err ))
199+ logger .Warnf ("getAllServices() = err:%v" , perrors .WithStack (err ))
219200 time .Sleep (time .Duration (RegistryConnDelay ) * time .Second )
220- continue
201+ break
221202 }
222- nr .handleServiceEvents (listener , notifyListener )
203+ go nr .handleServiceEvents (listener , notifyListener )
204+ }
205+ if err == nil {
206+ break
223207 }
224208 }
209+ return nil
225210}
226211
227212// getAllServices retrieves the list of all services from the registry
228- func (nr * nacosRegistry ) getAllSubscribeServiceNames () ([]string , error ) {
213+ func (nr * nacosRegistry ) getAllSubscribeServiceNames (url * common. URL ) ([]string , error ) {
229214 services , err := nr .namingClient .Client ().GetAllServicesInfo (vo.GetAllServiceInfoParam {
230215 GroupName : nr .GetParam (constant .RegistryGroupKey , defaultGroup ),
231216 PageNo : 1 ,
232- PageSize : 10 ,
217+ PageSize : math . MaxInt32 ,
233218 })
234- subScribeServiceNames := []string {}
219+ if err != nil {
220+ logger .Errorf ("query services error: %v" , err )
221+ return nil , err
222+ }
223+ var subScribeServiceNames []string
224+ categories := strings .Split (url .GetParam (constant .CategoryKey , constant .DefaultCategory ), constant .CommaSeparator )
235225 for _ , dom := range services .Doms {
236- if strings .HasPrefix (dom , "providers:" ) {
237- subScribeServiceNames = append (subScribeServiceNames , dom )
226+ if strings .Contains (dom , constant .NacosServiceNameSeparator ) {
227+ realCategory := strings .Split (dom , constant .NacosServiceNameSeparator )[0 ]
228+ for _ , item := range categories {
229+ if item == realCategory {
230+ subScribeServiceNames = append (subScribeServiceNames , dom )
231+ }
232+ }
238233 }
239234 }
240235
241236 return subScribeServiceNames , err
242237}
243238
244- // subscribeToService subscribes to a specific service in the registry
245- func (nr * nacosRegistry ) subscribeToService (url * common.URL , service string ) (listener registry.Listener , err error ) {
246- return NewNacosListenerWithServiceName (service , url , nr .URL , nr .namingClient )
247- }
248-
249239// handleServiceEvents receives service events from the listener and notifies the notifyListener
250240func (nr * nacosRegistry ) handleServiceEvents (listener registry.Listener , notifyListener registry.NotifyListener ) {
251241 for {
@@ -262,7 +252,7 @@ func (nr *nacosRegistry) handleServiceEvents(listener registry.Listener, notifyL
262252
263253// UnSubscribe :
264254func (nr * nacosRegistry ) UnSubscribe (url * common.URL , _ registry.NotifyListener ) error {
265- param := createSubscribeParam (url , nr .URL , nil )
255+ param := createSubscribeParam (getSubscribeName ( url ) , nr .URL , nil )
266256 if param == nil {
267257 return nil
268258 }
@@ -294,28 +284,7 @@ func (nr *nacosRegistry) LoadSubscribeInstances(url *common.URL, notify registry
294284 return nil
295285}
296286
297- func createSubscribeParam (url , regUrl * common.URL , cb callback ) * vo.SubscribeParam {
298- serviceName := getSubscribeName (url )
299- groupName := regUrl .GetParam (constant .RegistryGroupKey , defaultGroup )
300- if cb == nil {
301- v , ok := listenerCache .Load (serviceName + groupName )
302- if ! ok {
303- return nil
304- }
305- listener , ok := v .(* nacosListener )
306- if ! ok {
307- return nil
308- }
309- cb = listener .Callback
310- }
311- return & vo.SubscribeParam {
312- ServiceName : serviceName ,
313- SubscribeCallback : cb ,
314- GroupName : groupName ,
315- }
316- }
317-
318- func createSubscribeParamWithServiceName (serviceName string , regUrl * common.URL , cb callback ) * vo.SubscribeParam {
287+ func createSubscribeParam (serviceName string , regUrl * common.URL , cb callback ) * vo.SubscribeParam {
319288 groupName := regUrl .GetParam (constant .RegistryGroupKey , defaultGroup )
320289 if cb == nil {
321290 v , ok := listenerCache .Load (serviceName + groupName )
0 commit comments