telnet 命令演示 以及 Dubbo常見錯誤解決方法

 

一、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 或其它熱加載機制。

參考文章:https://mp.weixin.qq.com/s/kCCjcAQjioJZO3wVD-0R8A

                  https://www.cnblogs.com/feiqihang/p/4387330.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章