Dubbo error (2026-03)

Log

CCS log
01:58:27.575 [pool-14-thread-1] INFO CCS - [logInfo,41] - ZLC ==> ACC, 9000 :002990000000000600030101095000030003010090000000072BC8F800000000301020260307015827ACFF 01:58:27.661 [pool-14-thread-2] INFO CCS - [logInfo,41] - recieve len = 38 01:58:27.661 [pool-14-thread-2] INFO CCS - [logInfo,41] - ACC ==> ZLC : 002490000000000600030101095000030003010090000000072BC8F80000000212300000B8F4 01:58:27.662 [pool-14-thread-2] INFO CCS - [logInfo,41] - messageheader ok, senderid = 0003010109500003 01:58:28.136 [DubboServerHandler-172.1.100.35:20883-thread-7] INFO CCS - [logInfo,41] - Start Distributeeod, deviceId = [0003010111523800] 01:58:28.137 [DubboServerHandler-172.1.100.35:20883-thread-7] ERROR CCS - [logError,74] - DistributeEOD Error,No provider available from registry 172.1.100.30:8848 for service com.panda.eod.api.service.IRemoteEodService on consumer 172.1.100.35 use dubbo version 2.7.18, please check status of providers(disabled, not registered or in blacklist). org.apache.dubbo.rpc.RpcException: No provider available from registry 172.1.100.30:8848 for service com.panda.eod.api.service.IRemoteEodService on consumer 172.1.100.35 use dubbo version 2.7.18, please check status of providers(disabled, not registered or in blacklist). at org.apache.dubbo.registry.integration.DynamicDirectory.doList(DynamicDirectory.java:169) at org.apache.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:99) at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:297) at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:262) at org.apache.dubbo.rpc.cluster.interceptor.ClusterInterceptor.intercept(ClusterInterceptor.java:47) at org.apache.dubbo.rpc.cluster.support.wrapper.AbstractCluster$InterceptorInvokerNode.invoke(AbstractCluster.java:92) at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:98) at org.apache.dubbo.registry.client.migration.MigrationInvoker.invoke(MigrationInvoker.java:170) at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:96) at org.apache.dubbo.common.bytecode.proxy4.sendEodFiles(proxy4.java) at com.panda.ccs.service.impl.CCSInterfaceImp.distributeEOD(CCSInterfaceImp.java:99) at org.apache.dubbo.common.bytecode.Wrapper8.invokeMethod(Wrapper8.java) at org.apache.dubbo.rpc.proxy.javassist.JavassistProxyFactory$1.doInvoke(JavassistProxyFactory.java:47) at org.apache.dubbo.rpc.proxy.AbstractProxyInvoker.invoke(AbstractProxyInvoker.java:84) at org.apache.dubbo.config.invoker.DelegateProviderMetaDataInvoker.invoke(DelegateProviderMetaDataInvoker.java:56) at org.apache.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:56) at com.panda.common.dubbo.filter.DubboRequestFilter.invoke(DubboRequestFilter.java:43) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.protocol.dubbo.filter.TraceFilter.invoke(TraceFilter.java:77) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.filter.TimeoutFilter.invoke(TimeoutFilter.java:44) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java:91) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.filter.ExceptionFilter.invoke(ExceptionFilter.java:52) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.filter.GenericFilter.invoke(GenericFilter.java:192) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.filter.ClassLoaderFilter.invoke(ClassLoaderFilter.java:38) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.filter.EchoFilter.invoke(EchoFilter.java:41) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.filter.ContextFilter.invoke(ContextFilter.java:129) at org.apache.dubbo.rpc.protocol.FilterNode.invoke(FilterNode.java:61) at org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol$1.reply(DubboProtocol.java:148) at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.handleRequest(HeaderExchangeHandler.java:100) at org.apache.dubbo.remoting.exchange.support.header.HeaderExchangeHandler.received(HeaderExchangeHandler.java:175) at org.apache.dubbo.remoting.transport.DecodeHandler.received(DecodeHandler.java:51) at org.apache.dubbo.remoting.transport.dispatcher.ChannelEventRunnable.run(ChannelEventRunnable.java:57) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at org.apache.dubbo.common.threadlocal.InternalRunnable.run(InternalRunnable.java:41) at java.lang.Thread.run(Thread.java:748) 01:58:28.828 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:58:33.829 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:58:38.829 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:58:43.829 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:58:48.829 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:58:53.830 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:58:57.547 [pool-14-thread-3] INFO CCS - [logInfo,41] - start to HeartBeatTask 01:58:57.548 [pool-14-thread-3] INFO CCS - [logInfo,41] - getSendMessage = 9000 01:58:57.548 [pool-14-thread-3] INFO CCS - [logInfo,41] - ====updateMessgeList====== 01:58:57.548 [pool-14-thread-3] INFO CCS - [logInfo,41] - Senderid = 0003010109500003,Messagetype = 9000,Sessionflagmap = 0 01:58:57.548 [pool-14-thread-3] INFO CCS - [logInfo,41] - sendmessagelist size = 0 01:58:57.600 [pool-14-thread-1] INFO CCS - [logInfo,41] - upsendmessagetmp.getMessage() is not null 01:58:57.600 [pool-14-thread-1] INFO CCS - [logInfo,41] - ZLC ==> ACC, 9000 :002990000000000600030101095000030003010090000000072BD1F8000000003010202603070158574227 01:58:57.711 [pool-14-thread-2] INFO CCS - [logInfo,41] - recieve len = 38 01:58:57.711 [pool-14-thread-2] INFO CCS - [logInfo,41] - ACC ==> ZLC : 002490000000000600030101095000030003010090000000072BD1F800000002123000000225 01:58:57.712 [pool-14-thread-2] INFO CCS - [logInfo,41] - messageheader ok, senderid = 0003010109500003 01:58:58.830 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:59:03.830 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:59:08.831 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:59:13.831 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:59:18.831 [Thread-33] INFO CCS - [logInfo,41] - send down start 01:59:23.832 [Thread-33] INFO CCS - [logInfo,41] - send down start

分析

错误含义:Dubbo 消费者(调用方)在 Nacos 注册中心里,找不到可以调用的服务提供者(被调用方)。
  • 注册中心 (Registry): 172.1.100.30:8848(Nacos 服务器)。
  • 消费者 (Consumer): 172.1.100.35(当前正在运行的这个 CCS 服务)。
  • 目标服务 (Service): com.panda.eod.api.service.IRemoteEodService
  • 错误现象: CCS 服务里的 distributeEOD 方法,试图通过 Dubbo RPC 调用 IRemoteEodService 接口。于是它去向 Nacos 查询谁能提供这个接口。但 Nacos 的回答是目前没有人提供这个服务(provider)。于是 Dubbo 抛出了 RpcException
因为这个错误只是有时会出现,这说明程序的 Java 代码大概率没有问题,问题可能出在运行时的状态或网络环境上。

可能的故障原因

1. 服务提供者(Provider)状态不稳定

  • 现象: 提供 IRemoteEodService 接口的那个微服务可能经常重启,或者因为内存溢出(OOM)、频繁 Full GC 导致服务假死。
  • 结果: 当服务假死或重启时,它无法向 Nacos 发送心跳。Nacos 一旦在规定时间内收不到心跳,就会把这个服务节点从注册表里剔除(下线)。此时如果有请求进来,就会报日志里显示的这个错误。
  • 排查建议: 查看提供 IRemoteEodService 接口的那个服务的日志,看看在 01:52:52 这个时间点附近,它是否发生了重启、报了 Error 或者有超长的 GC 停顿。

2. Provider 与 Nacos 之间的网络抖动

  • 现象: 服务提供者本身运行正常,但是它所在的服务器跟 Nacos 服务器(172.1.100.30)之间的网络不稳定。
  • 结果: 网络丢包导致心跳发送失败,Nacos 误以为提供者挂了,将其强制下线。等网络恢复,心跳重新连上,服务又会自动上线。这就会导致“有时报错,有时又正常”。
  • 排查建议: 检查 Nacos 服务端的日志,看看有没有频繁的实例下线、上线的记录(deregister / register)。

3. Nacos 性能瓶颈或脑裂

  • 现象: Nacos 本身的负载太高,处理心跳请求不过来,或者 Nacos 集群之间的数据同步出现了短暂的延迟。
  • 结果: 导致消费者从 Nacos 拉取服务列表时,拉取到的是一个空的列表。
  • 排查建议: 观察 Nacos 控制台的监控,看看 CPU、内存和网络 I/O 是否在当时有飙高的现象。

4. Dubbo 线程池耗尽 (Provider 端)

  • 现象: 服务提供者的并发量太大,导致 Dubbo 用于处理请求的线程池满了(默认是 200 个线程)。
  • 结果: 此时 Provider 可能会拒绝新的连接,或者 Nacos 健康检查机制受到影响,导致暂时处于不可用状态。

建议下一步排查步骤

  1. 登录 Nacos 控制台: 找到服务列表,搜索 providers:com.panda.eod.api.service.IRemoteEodService,看看有几个实例在线。
  1. 对比时间点: 重点查看 Provider 服务01:52:5001:53:00 之间的应用日志和 GC 日志,寻找是否有异常或卡顿。
  1. 增加 Dubbo 消费端的重试机制(workaround): 如果 IRemoteEodService 这个接口是幂等的(多次调用不会产生副作用),可以在消费端加上重试配置,例如 @Reference(retries = 2),这样在遇到短暂的网络抖动时,Dubbo 会自动重试,能在一定程度上缓解这种偶发性的网络中断。