Failed to invoke the method xxx in the service com.xxx.xxx.XxxService. No provider available for the

转自 Caesar Liu 原文 

 

问题描述

  1. Dubbo应用启动成功
  2. 在Dubbo Admin可以看到服务状态为正常(存在提供者和消费者)。
  3. Zookeeper所在服务器能ping通Dubbo应用所在服务器。

在这种情况下,消费者请求服务时一直提示message can not send, because channel is closed

问题分析(仅供参考)

message can not send, because channel is closed,意为管道关闭,消息无法发送。为什么要发送消息,是因为消费者A发起请求提供者B时,注册中心找到了提供者B,此时需要通知需要提供者B执行服务,而执行什么服务,参数是什么,就是注册中心要发送的消息。

问题排查

出现这个问题,原因只有一个——端口未开放。我们知道每个Dubbo应用都会占用一个系统端口,默认为20880。当Dubbo应用增多,需要开放的端口也需要增多。这也是经常被忽略的一点。可以通过以下方式检查:

通过vim /etc/sysconfig/iptables查看端口设置,如下

-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 20880:20890 -j ACCEPT
  • 1
  • 2

这样的配置表示开启了22端口和20880至20890(含)的端口。如需新增,那么在新增后需要执行以下两句命令

/etc/init.d/iptables restart
/etc/init.d/iptables save
  • 1
  • 2

关于iptables更详细的内容请参阅博文《Linux - iptables》

其它情况

有网友表示以下情况也会导致message can not send, because channel is closed。经过实践分析,以下情况并不会导致该问题的出现。

  1. 服务端未正常运行
    如果服务端没有正常运行,或者禁用了消费者对某接口的调用,将会出现Failed to invoke the method xxx in the service com.xxx.xxx.XxxService. No provider available for the service ...
  2. dubbo对外发布接口不正常
    接口不正常要么接口本身出现异常,要么导致Dubbo应用无法启动,不会导致该问题的出现。
  3. 网络不通
    网络不通是不会成功注册到注册中心的。

(完)-------特别注明:转载自  Caesar Liu 原文 

你可能感兴趣的:(java)