BraveheartStone opened a new issue, #6143:
URL: https://github.com/apache/shenyu/issues/6143

   ### Is there an existing issue for this?
   
   - [x] I have searched the existing issues
   
   ### Current Behavior
   
   通过nacos发现服务时,服务只有一个实例的情况下,重启下游服务,会偶现nacos实例为空的情况。导致通过shenyu调用下游服务时报错:
   ```
   "Can not find healthy upstream url, please check your configuration!"
   ```
   
   ### Expected Behavior
   
   只有一个服务重新完成后,能够正常识别应用。
   
   ### Steps To Reproduce
   
   1. Divide中添加 Selector,通过 nacos 发现服务
   2. 下游服务只有一个实例
   3. 重启下游服务时,偶现上面错误
   
   ### Environment
   
   ```markdown
   ShenYu version(s):2.7.0.2
   ```
   
   ### Debug logs
   
   错误日志:
   ``` java
   [nacos.publisher-com.alibaba.nacos.client.naming.event.InstancesChangeEvent] 
ERROR
    com.alibaba.nacos.common.notify.NotifyCenter - Event callback exception: 
   java.lang.NullPointerException: Cannot invoke "String.equals(Object)" 
because the return value of "com.alibaba.nacos.api.naming.po
   jo.Instance.getInstanceId()" is null
           at 
org.apache.shenyu.registry.nacos.NacosInstanceRegisterRepository.lambda$compareInstances$3(NacosInstanceRegisterRepository.ja
   va:188)
           at 
java.base/java.util.stream.MatchOps$1MatchSink.accept(MatchOps.java:90)
           at 
java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
           at 
java.base/java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:129)
           at 
java.base/java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:527)
           at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:513)
           at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
           at 
java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:230)
           at 
java.base/java.util.stream.MatchOps$MatchOp.evaluateSequential(MatchOps.java:196)
           at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
           at 
java.base/java.util.stream.ReferencePipeline.anyMatch(ReferencePipeline.java:632)
           at 
org.apache.shenyu.registry.nacos.NacosInstanceRegisterRepository.lambda$compareInstances$4(NacosInstanceRegisterRepository.ja
   va:188)
           at 
java.base/java.util.stream.ReferencePipeline$2$1.accept(ReferencePipeline.java:178)
           at 
java.base/java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1625)
           at 
java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509)
           at 
java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
           at 
java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:921)
           at 
java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
           at 
java.base/java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:682)
           at 
org.apache.shenyu.registry.nacos.NacosInstanceRegisterRepository.compareInstances(NacosInstanceRegisterRepository.java:189)
           at 
org.apache.shenyu.registry.nacos.NacosInstanceRegisterRepository.lambda$watchInstances$0(NacosInstanceRegisterRepository.java
   :135)
           at 
com.alibaba.nacos.client.naming.event.InstancesChangeNotifier.onEvent(InstancesChangeNotifier.java:126)
           at 
com.alibaba.nacos.client.naming.event.InstancesChangeNotifier.onEvent(InstancesChangeNotifier.java:42)
           at 
com.alibaba.nacos.common.notify.DefaultPublisher.lambda$notifySubscriber$0(DefaultPublisher.java:199)
           at 
com.alibaba.nacos.common.notify.DefaultPublisher.notifySubscriber(DefaultPublisher.java:206)
           at 
com.alibaba.nacos.common.notify.DefaultPublisher.receiveEvent(DefaultPublisher.java:190)
           at 
com.alibaba.nacos.common.notify.DefaultPublisher.openEventHandler(DefaultPublisher.java:112)
           at 
com.alibaba.nacos.common.notify.DefaultPublisher.run(DefaultPublisher.java:95)
   ```
   
   ### Anything else?
   
   建议修改后的方案:
   org/apache/shenyu/registry/nacos/NacosInstanceRegisterRepository.java:188 :
   
   ```java
           Set<Instance> updatedInstances = currentInstances.stream()
               .filter(currentInstance -> currentInstance.getInstanceId() != 
null &&
                   previousInstances.stream()
                       .anyMatch(previousInstance ->
                           previousInstance.getInstanceId() != null &&
                               
currentInstance.getInstanceId().equals(previousInstance.getInstanceId()) &&
                               !currentInstance.equals(previousInstance)))
               .collect(Collectors.toSet());
   ```


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@shenyu.apache.org.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to