說來真巧,2018年下半年時使用Thrift作為局域網服務rpc通信框架,整理了一下Thrift常見問題,博客訪問量較高,也有同學私信討論Thrift遇到的問題。此后的工作中,用dubbo比較多,好腦袋不如爛筆頭,經常排查dubbo問題,還是整理一下分享出來。
【詞匯】
payload-負載,最大負荷,有效負荷;
■ com.alibaba.dubbo.rpc.RpcException: No provider available for service
異常描述1(dubbo2.5.3):
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method *** in the service com..**Service. No provider available for the service test/com..***Service from registry 192.168.40.21:2181 on the consumer 192.168.40.51 using the dubbo version 2.5.3. Please check if the providers have been started and registered.
異常描述2(dubbo2.7.3):
org.apache.dubbo.rpc.RpcException: No provider available from registry 192.168.40.84:2181 for service dev/com..**Service on consumer 192.168.48.96 use dubbo version 2.7.3, please check status of providers(disabled, not registered or in blacklist).
異常堆棧:
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method getAgent in the service com.emaxcard.agent.modules.agent.service.AgentService.
No provider available for the service test/com.emaxcard.agent.modules.agent.service.AgentService from registry 192.168.40.21:2181
on the consumer 192.168.40.51 using the dubbo version 2.5.3. Please check if the providers have been started and registered. at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.checkInvokers(AbstractClusterInvoker.java:246) at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:55) at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227) at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72) at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) at com.alibaba.dubbo.common.bytecode.proxy1.getAgent(proxy1.java) at com.yft.service.impl.TAgentServiceImpl.getAgentInfo(TAgentServiceImpl.java:86)
產生原因:
No provider available--很明顯,就是說指定的服務在注冊中心不存在。
Please check if the providers have been started and registered.-請確保服務提供者已經啟動,並且已經注冊到注冊中心。
1. dubbo服務沒有啟動
2. dubbo服務不可用 / 在dubboadmin上做了disable操作

3. 如果使用了dubbo分組(group),可能是指定為這個group的dubbo服務沒有啟動
■ org.apache.dubbo.rpc.RpcException: Failed to invoke remote proxy method
下面case里異常的cause很明顯,rpc接口服務中不存在指定的接口方法。
org.apache.dubbo.rpc.RpcException: Failed to invoke remote proxy method getById to registry://*.*.2.8:2181/org.apache.dubbo.registry.RegistryService?application=task-provider&backup=*.*.2.9:2181,*.*.2.10:2181,*.*.0.103:2181,*.*.0.104:2181&dubbo=2.0.2&export=見下方dubbourl&pid=1&qos.enable=false®istry=zookeeper&release=2.7.3×tamp=1694520804438, cause: Not found method "getById" in class com.emaxcard.boss.modules.task.service.TaskService.
上面registry url中export參數值是一個dubbo url,解碼后是→ dubbo://10.244.1.223:20789/com.emaxcard.boss.modules.task.service.TaskService?anyhost=true&application=task-provider&bean.name=ServiceBean:com.emaxcard.boss.modules.task.service.TaskService&bind.ip=10.244.1.223&bind.port=20789&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=prod&interface=com.emaxcard.boss.modules.task.service.TaskService&methods=updateBatch,getTaskforTaskStatus,getSimpleVOById,saveTaskInfo,removeById,saveSaleTask,save,getTotalCount,saveEtlTask,listWaitNotifyTask,pubTask,getByIds,page2,removeByIds,audit,getTaskAndProjectByTaskId,updateTaskInfoSelective,releaseTask,getCountInfo,closeTask,getSimpleVOByTaskId,batchCloseByTaskIdAndProviderId,queryByEnterpriseId,edit,saveBatch,getTaskByTaskId,updateFailedTask,getTaskByEntId,importServicePo,list,getByTaskId,updateTaskAndRequireById,updateById,updateTaskAndProject,sumTotalCount,endTask,updateLevyTaskStatus,page,taskToChannel,exportTaskList&pid=1&qos.enable=false®ister=true&release=2.7.3&side=provider&timeout=15000×tamp=1694520804438
■ org.apache.dubbo.remoting.RemotingException:Server side threadpool is exhausted
異常信息(IP地址中的.改為了_):
2023-09-18 10:37:11.638 [TID:464335dde660458fb1e1e1f48477a901.350.16950046314814569] [7e6905cb709d47b4805b0d589492834b] [SimpleAsyncTaskExecutor-10250] ERROR o.s.a.i.SimpleAsyncUncaughtExceptionHandler:39 -
Unexpected exception occurred invoking async method: public void com.emax.user.sign.service.UserSignCallbackProxy.updateYoufuSignStatus(UserSign,TaxSignStatusEnum,String,Boolean)
org.apache.dubbo.rpc.RpcException: Failed to invoke the method updateBossKgSignStatus in the service com.emaxcard.boss.modules.user.service.UserSignCallbackService.
Tried 1 times of the providers [10_244_9_50:20880] (1/7) from the registry 10_0_2_8:2181 on the consumer 10_244_9_44 using the dubbo version 2.7.3.
Last error is: Failed to invoke remote method: updateBossKgSignStatus,
provider: dubbo://10_244_9_50:20880/com.emaxcard.boss.modules.user.service.UserSignCallbackService?anyhost=true&application=zhenghe-provider&bean.name=ServiceBean:com.emaxcard.boss.modules.user.service.UserSignCallbackService&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=prod&interface=com.emaxcard.boss.modules.user.service.UserSignCallbackService&lazy=false&methods=updateBossKgSignStatus&pid=1&qos.enable=false&reference.filter=tracing®ister=true®ister.ip=10_244_9_44&release=2.7.3&remote.application=bosskg-server-provider&retries=0&revision=1.0.1-SNAPSHOT&side=consumer&sticky=false&timeout=30000×tamp=1694954526841,
cause: org.apache.dubbo.remoting.RemotingException:Server side(10_244_9_50,20880) threadpool is exhausted ,detail msg:Thread pool is EXHAUSTED! Thread Name: DubboServerHandler-10_244_9_50:20880, Pool Size: 200 (active: 200, core: 200, max: 200, largest: 200), Task: 20776 (completed: 20576), Executor status:(isShutdown:false, isTerminated:false, isTerminating:false), in dubbo://10_244_9_50:20880!
at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInv
產生原因:
"threadpool is exhausted"異常是由於 Dubbo 框架中的線程池資源耗盡所引起的。Dubbo 是一種高性能的分布式服務框架,而線程池是 Dubbo 用於處理請求和響應的關鍵組件之一。
當系統的並發請求超過了線程池的最大容量時,就會發生線程池資源耗盡的情況,從而導致"threadpool is exhausted"異常。這表示當前線程池無法再接受更多的任務,無法處理新的請求。
要解決"Dubbo threadpool is exhausted"異常,可以考慮以下幾個方面:
1. 調整線程池配置:檢查當前線程池的配置參數,例如核心線程數、最大線程數、隊列容量等。根據系統負載和預期的並發量,適當調整這些參數,增加線程池的容量,以滿足更多的請求。
2. 增加機器資源:如果線程池已經配置到最大容量,仍然無法滿足需求,可以考慮增加機器的資源,例如增加服務器數量或者升級服務器的配置,以提供更多的計算資源。
3. 優化服務性能:分析服務的性能瓶頸,找到導致高負載的原因,並進行優化。可能需要優化代碼、數據庫訪問、網絡通信等方面,以減少每個請求的處理時間,從而減少線程池的壓力。
4. 使用合適的線程池類型:Dubbo 提供了多種線程池類型,例如固定大小線程池、可緩存線程池、可伸縮線程池等。根據應用場景和需求,選擇合適的線程池類型,以滿足不同的並發需求。
5. 監控和調優:使用監控工具對線程池的使用情況進行監控,及時發現線程池資源不足的問題,並進行調優。可以根據監控數據進行容量規划和性能優化。
■ com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed
異常描述:
com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method *** in the service com..***Service. Tried 1 times of the providers [192.168.40.83:20899] (1/1) from the registry 192.168.40.21:2181 on the consumer 192.168.40.51 using the dubbo version 2.5.3.----Caused by: com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed .
異常堆棧:
2021-11-04 13:55:36.596 [ERROR] [riskOder_synchronizePlatOrder_1636005060003S457] [com.yft.service.impl.TAgentServiceImpl:89] *****獲得渠道商信息,dubbo調用異常: com.alibaba.dubbo.rpc.RpcException: Failed to invoke the method getAgent in the service com.emaxcard.agent.modules.agent.service.AgentService.
Tried 1 times of the providers [192.168.40.83:20899] (1/1) from the registry 192.168.40.21:2181 on the consumer 192.168.40.51 using the dubbo version 2.5.3.
Last error is: Failed to invoke remote method: getAgent,
provider: dubbo://192.168.40.83:20899/com.emaxcard.agent.modules.agent.service.AgentService?anyhost=true&application=youfu-merchant-consumer&bean.name=ServiceBean:com.emaxcard.agent.modules.agent.service.AgentService&check=false&default.check=false&default.group=test&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=test&interface=com.emaxcard.agent.modules.agent.service.AgentService&methods=saveAgent,selectSecondAndThirdAgent,getAgentByAgentCode,changeLoginPass,selectFirstAgent,listAgentByAgentName,initPassword,updateAgent,page,agentList,getAgentByName&pid=17492®ister=true&release=2.7.3&retries=0&revision=1.0.1-SNAPSHOT&side=consumer&timeout=3000×tamp=1635997957739,
cause: message can not send, because channel is closed .
url:dubbo://192.168.40.83:20899/com.emaxcard.agent.modules.agent.service.AgentService?anyhost=true&application=youfu-merchant-consumer&bean.name=ServiceBean:com.emaxcard.agent.modules.agent.service.AgentService&check=false&codec=dubbo&default.check=false&default.group=test&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=test&heartbeat=60000&interface=com.emaxcard.agent.modules.agent.service.AgentService&methods=saveAgent,selectSecondAndThirdAgent,getAgentByAgentCode,changeLoginPass,selectFirstAgent,listAgentByAgentName,initPassword,updateAgent,page,agentList,getAgentByName&pid=17492®ister=true&release=2.7.3&retries=0&revision=1.0.1-SNAPSHOT&side=consumer&timeout=3000×tamp=1635997957739 at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:101) at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:227) at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72) at com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:52) at com.alibaba.dubbo.common.bytecode.proxy1.getAgent(proxy1.java) at com.yft.service.impl.TAgentServiceImpl.getAgentInfo(TAgentServiceImpl.java:86) at ... Caused by: com.alibaba.dubbo.remoting.RemotingException: message can not send, because channel is closed .
url:dubbo://192.168.40.83:20899/com.emaxcard.agent.modules.agent.service.AgentService?anyhost=true&application=youfu-merchant-consumer&bean.name=ServiceBean:com.emaxcard.agent.modules.agent.service.AgentService&check=false&codec=dubbo&default.check=false&default.group=test&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=test&heartbeat=60000&interface=com.emaxcard.agent.modules.agent.service.AgentService&methods=updateStateAgent,saveAgent,selectSecondAndThirdAgent,getAgentByAgentCode,changeLoginPass,listAgentByName,getAgent,selectFirstAgent,listAgentByAgentName,initPassword,belongingSubordinate,reset,updateAgent,getHomeInfo,page,agentList,getAgentByName&pid=17492®ister=true&release=2.7.3&retries=0&revision=1.0.1-SNAPSHOT&side=consumer&timeout=3000×tamp=1635997957739 at com.alibaba.dubbo.remoting.transport.AbstractClient.send(AbstractClient.java:268) at com.alibaba.dubbo.remoting.transport.AbstractPeer.send(AbstractPeer.java:51) at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeChannel.request(HeaderExchangeChannel.java:112) at com.alibaba.dubbo.remoting.exchange.support.header.HeaderExchangeClient.request(HeaderExchangeClient.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.ReferenceCountExchangeClient.request(ReferenceCountExchangeClient.java:81) at com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker.doInvoke(DubboInvoker.java:96) at com.alibaba.dubbo.rpc.protocol.AbstractInvoker.invoke(AbstractInvoker.java:144) at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke$original$YXlgcHUl(MonitorFilter.java:75) at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke$original$YXlgcHUl$accessor$WxlrIuUu(MonitorFilter.java) at com.alibaba.dubbo.monitor.support.MonitorFilter$auxiliary$LX9nuPMk.call(Unknown Source) at org.apache.skywalking.apm.agent.core.plugin.interceptor.enhance.InstMethodsInter.intercept(InstMethodsInter.java:86) at com.alibaba.dubbo.monitor.support.MonitorFilter.invoke(MonitorFilter.java) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter.invoke(FutureFilter.java:53) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.filter.ConsumerContextFilter.invoke(ConsumerContextFilter.java:48) at com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper$1.invoke(ProtocolFilterWrapper.java:91) at com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper.invoke(ListenerInvokerWrapper.java:74) at com.alibaba.dubbo.rpc.protocol.InvokerWrapper.invoke(InvokerWrapper.java:53) at com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:77) ... 69 more
產生原因:
dubbo服務沒有啟動/dubbo服務掛掉了。此時,consumer會嘗試重新建立連接重新調用。重試次數取決於為屬性dubbo.consumer.retries配置的值。retries的默認值為2,對於增刪改操作,服務端要注意做冪等控制,避免出現重復處理的情況。當然,為了避免重復調用,有時我們會設置dubbo.consumer.retries=0,上面異常里Tried 1 times就是未重試。
■ org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer
異常描述:
Failed to invoke the method *** in the service com..***Service. Tried 1 times of the providers [192.168.40.48:20881] (1/1) from the registry 192.168.40.20:2181 on the consumer 192.168.40.85 using the dubbo version 2.7.3. Last error is: Invoke remote method timeout. cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout. start time: 2021-09-26 10:09:04.842, end time: 2021-09-26 10:09:34.871, client elapsed: 1 ms, server elapsed: 30028 ms, timeout: 30000 ms.
異常堆棧:
2021-09-26 10:09:27.888 [][] [DubboServerHandler-192.168.40.85:20888-thread-199] INFO com.emax.zhenghe.common.tracking.DubboTraceFilter:62 - found slow method:com.emax.zhenghe.portalapi.modules.enterprise.service.EnterpriseInfoApi:onlineAuthEnterpriseStatus,exec time:30030 ms 2021-09-26 10:09:34.873 [][] [EnterpriseInfoApiImpl_onlineAuthEnterpriseStatus1632622144838] ERROR c.e.z.rpcapi.provider.portal.EnterpriseInfoApiImpl:95 - 在線企業認證狀態獲取失敗 org.apache.dubbo.rpc.RpcException: Failed to invoke the method queryOrganizationStatus in the service com.auth.api.service.ContractSignOrganizationService.
Tried 1 times of the providers [192.168.40.48:20881] (1/1) from the registry 192.168.40.20:2181 on the consumer 192.168.40.85 using the dubbo version 2.7.3.
Last error is: Invoke remote method timeout. method: queryOrganizationStatus,
provider: dubbo://192.168.40.48:20881/com.auth.api.service.ContractSignOrganizationService?anyhost=true&application=zhenghe-provider&bean.name=ServiceBean:com.auth.api.service.ContractSignOrganizationService&check=false&deprecated=false&dubbo=2.0.2&dynamic=true&generic=false&group=test&interface=com.auth.api.service.ContractSignOrganizationService&lazy=false&methods=organizationStatusUpdate,getListByParam,getContractSignInfo,queryOrganizationStatus,organizationCreate,update,insert,list,updateOrganizationCreateStatus&pid=29399&qos.enable=false®ister=true®ister.ip=192.168.40.85&release=2.7.3&remote.application=auth-service-channel&retries=0&side=consumer&sticky=false&timeout=30000×tamp=1632622128250,
cause: org.apache.dubbo.remoting.TimeoutException: Waiting server-side response timeout by scan timer. start time: 2021-09-26 10:09:04.842, end time: 2021-09-26 10:09:34.871, client elapsed: 0 ms, server elapsed: 30028 ms, timeout: 30000 ms, request: Request [id=71603, version=2.0.2, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=queryOrganizationStatus, parameterTypes=[class java.lang.String], arguments=[1626769691952966], attachments={input=696, path=com.auth.api.service.ContractSignOrganizationService, sw8-x=0- , sw8=1-M2EyNWZlODhlZGUzNDAwNjlhYmFiMmYzZWJhZWMyYjkuNzkuMTYzMjYyMjE0NDgxNzAyMjc=-NTVmOTViYWI1M2UwNGI4ZWE1ZTMxZTA5NmY4ZDM1MDEuMzgwLjE2MzI2MjIxNDQ4Mzg1MDc4-6-emhlbmdoZS1ycGNhcGktcHJvdmlkZXI=-emhlbmdoZS1ycGNhcGktcHJvdmlkZXJAYm9nb24=-dGVzdC9jb20uZW1heC56aGVuZ2hlLnBvcnRhbGFwaS5tb2R1bGVzLmVudGVycHJpc2Uuc2VydmljZS5FbnRlcnByaXNlSW5mb0FwaS5vbmxpbmVBdXRoRW50ZXJwcmlzZVN0YXR1cyhMb25nKQ==-MTkyLjE2OC40MC40ODoyMDg4MQ==, sw8-correlation=, interface=com.auth.api.service.ContractSignOrganizationService, version=0.0.0, timeout=30000, group=test}]], channel: /192.168.40.85:55882 -> /192.168.40.48:20881 at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:113) at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:248) at org.apache.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:78) at org.apache.dubbo.rpc.proxy.InvokerInvocationHandler.invoke(InvokerInvocationHandler.java:55) at org.apache.dubbo.common.bytecode.proxy10.queryOrganizationStatus(proxy10.java) at ... Caused by: java.util.concurrent.ExecutionException: org.apache.dubbo.remoting.TimeoutException:
Waiting server-side response timeout by scan timer. start time: 2021-09-26 10:09:04.842, end time: 2021-09-26 10:09:34.871, client elapsed: 0 ms, server elapsed: 30028 ms, timeout: 30000 ms,
request: Request [id=71603, version=2.0.2, twoway=true, event=false, broken=false, data=RpcInvocation [methodName=queryOrganizationStatus, parameterTypes=[class java.lang.String], arguments=[1626769691952966], attachments={input=696, path=com.auth.api.service.ContractSignOrganizationService, sw8-x=0- , sw8=1-M2EyNWZlODhlZGUzNDAwNjlhYmFiMmYzZWJhZWMyYjkuNzkuMTYzMjYyMjE0NDgxNzAyMjc=-NTVmOTViYWI1M2UwNGI4ZWE1ZTMxZTA5NmY4ZDM1MDEuMzgwLjE2MzI2MjIxNDQ4Mzg1MDc4-6-emhlbmdoZS1ycGNhcGktcHJvdmlkZXI=-emhlbmdoZS1ycGNhcGktcHJvdmlkZXJAYm9nb24=-dGVzdC9jb20uZW1heC56aGVuZ2hlLnBvcnRhbGFwaS5tb2R1bGVzLmVudGVycHJpc2Uuc2VydmljZS5FbnRlcnByaXNlSW5mb0FwaS5vbmxpbmVBdXRoRW50ZXJwcmlzZVN0YXR1cyhMb25nKQ==-MTkyLjE2OC40MC40ODoyMDg4MQ==, sw8-correlation=, interface=com.auth.api.service.ContractSignOrganizationService, version=0.0.0, timeout=30000, group=test}]],
channel: /192.168.40.85:55882 -> /192.168.40.48:20881 at java.util.concurrent.CompletableFuture.reportGet(CompletableFuture.java:357) at java.util.concurrent.CompletableFuture.get(CompletableFuture.java:1915) at org.apache.dubbo.rpc.protocol.AsyncToSyncInvoker.invoke(AsyncToSyncInvoker.java:56) at com.emax.zhenghe.common.tracking.DubboTraceFilter.invoke(DubboTraceFilter.java:32) at ... 78 common frames omitted
產生原因:
dubbo調用超時。服務端處理超時。dubbo超時時間通過dubbo.provider.timeout或dubbo.consumer.timeout來設置。dubbo默認超時時間是1000ms=1秒。客戶端dubbo調用超時后會嘗試重試,重試次數取決於上文的retries屬性。see dubbo超時重試
在生產環境,要控制dubbo超時時間,尤其是consumer端。timeout過長容易引起雪崩。
■ com.alibaba.dubbo.rpc.RpcException: Forbid consumer *** access service *** from registry *** use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).
異常描述:
com.alibaba.dubbo.rpc.RpcException: Forbid consumer *.*.2.224 access service com.emax.zhenghe.portalapi.modules.sms.service.EmaxSettlementSmsRecordService from registry *.*.2.8:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist).

異常堆棧:
2021-09-16 22:24:03.290 [ERROR] [a54f25179c9a4062abe4457cebb65a34] [paymentQuery_timer_1631802240392CA90D] [com.cn.yft.bank.p600001.own.PaymentTransQueryByOWN:298] 獲取下發成功人員信息失敗,發送通知短信異常: com.alibaba.dubbo.rpc.RpcException: Forbid consumer *.*.2.224 access service com.emax.zhenghe.portalapi.modules.sms.service.EmaxSettlementSmsRecordService from registry *.*.2.8:2181 use dubbo version 2.5.3, Please check registry access list (whitelist/blacklist). at com.alibaba.dubbo.registry.integration.RegistryDirectory.doList(RegistryDirectory.java:579) at com.alibaba.dubbo.rpc.cluster.directory.AbstractDirectory.list(AbstractDirectory.java:73) at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.list(AbstractClusterInvoker.java:260) at com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker.invoke(AbstractClusterInvoker.java:219) at com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker.invoke(MockClusterInvoker.java:72)
產生原因:
當某個服務的provider有變化時就會被調用,例如zookeeper上某個服務的provider目錄里的內容發生變化,則zk監聽器會被觸發,由於provider的數量會發生變化,例如有一個新的provider啟動了,有一個provider下線了,所以必須刷新本地的對provider的連接。這時會涉及到服務提供者與消費者的分組(group)、版本(version)、接口名,如果不一致,就會報這個“forbid consumer access service”的錯誤。可參見csdn這篇帖子。
■ org.apache.dubbo.remoting.transport.ExceedPayloadLimitException:Data length too large: ***, max payload: 8,388,608, channel: ...
異常描述:
dubbo並不適合大數據傳輸。當調用dubbo接口傳輸數據比較大時,比如圖片字節流,文件字節流,一旦超過設定的閾值(dubbo默認值是8M=8*1024*1024),就會拋出這個ExceedPayloadLimitException異常--超出最大負荷。

源碼參見org.apache.dubbo.remoting.transport.AbstractCodec#checkPayload

基於此,改造方案可以是:① 如果是圖片等文件,可考慮傳遞文件路徑; ② 如果傳輸數據量比較大,比如返回了上萬條數據記錄,並且單條數據量比較大,建議用分頁多次調用; ③ 改用http請求
