1. 程式人生 > 實用技巧 >springcloud org.apache.catalina.connector.ClientAbortException: java.io.IOException

springcloud org.apache.catalina.connector.ClientAbortException: java.io.IOException

  今天產品測試同事在測試平臺上測出了一個bug。就是在學習專案中新增一場考試的時候,新增不成功。

  於是我先去檢視考試微服務的報錯資訊,並在本地環境復現,確實存在這樣的bug,如下:

  

  因為該介面是提供給另外一個服務呼叫的,所以初步判斷是介面業務邏輯處理時間長導致的超時。

  產品的技術棧是springcloud,在網管gateway中有各個子服務的路由轉發,這裡是前端跟後端建立的連線,如果gatewaay超時,則會響應給前端504。但這裡前端響應的是後端提供的錯誤碼。

所以應該是服務消費方出了問題,檢視服務消費方的日誌,如下:

  確實顯示的也是請求超時問題。

  在微服務中遠端呼叫都是基於ribbon進行http請求呼叫的,所以在服務消費方添加了如下配置,設定超時時間:

ribbon:
  ReadTimeout: 60000
  ConnectTimeout: 60000

  再次呼叫就Ok了。

  當然,服務提供方首先要保證自己提供的介面業務處理時長不能過長。

  減少處理時長可以有如下常用方法:

  • 如果有多個sql需要執行,想辦法整成一個sql,減少跟資料庫的互動;
  • 對應的sql也需要加上需要的索引,減少sql執行時長;
  • 比較耗時的業務邏輯,又不需要響應給服務消費方,可以採用非同步io非阻塞的辦法,即開始新執行緒進行處理。