1. 程式人生 > >Dubbo RemotingException: message can not send, because channel is closed

Dubbo RemotingException: message can not send, because channel is closed

問題描述

  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

這樣的配置表示開啟了22埠和20880至20890(含)的埠。如需新增,那麼在新增後需要執行以下兩句命令

/etc/init.d/iptables restart
/etc/init.d/iptables save

關於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. 網路不通
    網路不通是不會成功註冊到註冊中心的。

(完)