Java異常 - Dubbo RemotingException: message can not send, because channel is closed
阿新 • • 發佈:2018-12-25
問題描述
- Dubbo應用啟動成功
- 在Dubbo Admin可以看到服務狀態為正常(存在提供者和消費者)。
- 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。經過實踐分析,以下情況並不會導致該問題的出現。
- 服務端未正常執行
如果服務端沒有正常執行,或者禁用了消費者對某介面的呼叫,將會出現Failed to invoke the method xxx in the service com.xxx.xxx.XxxService. No provider available for the service ...
- dubbo對外發布介面不正常
介面不正常要麼介面本身出現異常,要麼導致Dubbo應用無法啟動,不會導致該問題的出現。 - 網路不通
網路不通是不會成功註冊到註冊中心的。
(完)