一、telnet命令
dubbo服務發佈之後,我們可以利用telnet命令進行調試、管理。
1、預備工作
代碼:Dubbo入門Demo https://github.com/MiaoPlus/dubbodemo.git
a、啓動 zookeeper 註冊中心
雙擊 zookeeper/bin 目錄下的 zkServer.cmd
b、啓動服務提供者
2、連接服務
打開cmd,測試Dubbo服務對應的 IP 和 端口號 是否能成功連接
如下所示即爲連接成功,進入Telnet窗口:
3、查看服務列表
命令
ls
顯示服務列表。
ls -l
顯示服務詳細信息列表。
ls XxxService
顯示服務的方法列表。
ls -l XxxService
顯示服務的方法詳細信息列表。
a、查看服務
b、查看服務接口
c、查看服務接口詳細信息
4、調用服務接口
invoke XxxService.xxxMethod({"prop": "value"}): 調用服務的方法
invoke xxxMethod({"prop": "value"}): 調用服務的方法(自動查找包含此方法的服務)
5、查看服務狀態
count XxxService: 統計 1 次服務任意方法的調用情況
count XxxService 10: 統計 10 次服務任意方法的調用情況
count XxxService xxxMethod: 統計 1 次服務方法的調用情況
count XxxService xxxMethod 10: 統計 10 次服務方法的調用情況
二、Dubbo常見錯誤解決方法
1、地址找不到:No provider available
找不到服務,這時候可能有這麼幾種情況:
-
Provider 服務沒啓動,或者註冊中心(比如 ZooKeeper,Nacos,Consul)宕機了。
-
Dubbo 的服務配置有誤差,必須保證服務名,組別(默認是 Dubbo ),version 三者都正確。
-
訪問的環境有誤:通常我們會有開發環境、測試環境、線上生產環境等多套環境。有時候發佈的服務到了測試環境,而訪問調用時卻走了開發環境。
排查步驟
-
訪問註冊中心的 Ops 系統,查詢對應的服務是否有提供者列表;同時檢查調用者應用所在服務器的日誌(一般每種註冊服務的客戶端都會有對應的日誌記錄),查看是否有地址信息的推送/拉取記錄。
-
如無,則表明發佈者發佈服務失敗,檢查發佈者的應用啓動是否成功。
-
如有服務,則檢查調用者應用所連接的註冊中心,確認跟預期的環境要匹配。
-
如上述都沒有問題,檢查是否配置了路由過濾的規則等。
2、調用超時:client-side timeout
一般超時是調用端發生在請求發出後,無法在指定的時間內獲得對應的響應。原因大概有以下幾種情況:
-
服務端確實處理比較慢,無法在指定的時間返回結果,調用端就自動返回一個超時的異常響應來結束此次調用。
-
服務端如果響應的比較快,但當客戶端 Load 很高,負載壓力很大的時候,會因爲客戶端請求發不出去、響應卡在 TCP Buffer 等問題,造成超時。因爲客戶端接收到服務端發來的數據或者請求服務端的數據,都會在系統層面排隊,如果系統負載比較高,在內核態的時間佔比就會加長,從而造成客戶端獲取到值時已經超時。
-
通常是業務處理太慢,可在服務提供方機器上執行:jstack [PID] > jstack.log 分析線程都卡在哪個方法調用上,這裏就是慢的原因。如果不能調優性能,請調高 timeout 閾值。
排查和解決步驟
-
兩邊可能有 GC ,檢查服務端和客戶端 GC 日誌,耗時很長的 GC,會導致超時。超時的發生很可能意味着調用端或者服務端的資源(CPU,內存或者網絡)出現了瓶頸,需要檢查服務端的問題還是調用端的問題來排除GC抖動等嫌疑。
-
檢查服務端的網絡質量,比如重傳率來排除網絡嫌疑。
-
藉助鏈路跟蹤的分析服務(比如阿里的 ARMS,開源的 OpenTracing 系的實現 Zipkin、SkyWalking 等)來分析下各個點的耗時情況。
3、服務端的線程資源耗盡:Thread pool is EXHAUSTED
Dubbo 服務端的業務線程數是 200 個,如果多個併發請求量超過了 200,就會拒絕新的請求,拋出此錯誤。這種問題有這麼幾種解決辦法:
排查和解決步驟
-
調整 Provider 端的 dubbo.provider.threads 參數的大小,調大一些即可。
-
調整 Consumer 端的 dubbo.consumer.actives 參數的大小,調小一些即可。
-
增加 Provider 服務的數量,分擔壓力。
4、Hessian 序列化失敗:HessianRuntimeException
-
檢查服務方法的傳入傳出參數是否實現 Serializable 接口。
-
檢查服務方法的傳入傳出參數是否繼承了 Number、Date、ArrayList、HashMap 等 Hessian 特殊化處理的類。
5、啓動時 Configuration problem: Unable to locate Spring NamespaceHandler for XML schema
表示 Spring 找不到 <dubbo:...> 配置的解析處理器。通常是 Dubbo 的 jar 包沒有被引入,請添加對 Dubbo 的依賴;或者是 ClassLoader 隔離,查看是否有使用 OSGI 或其它熱加載機制。