今天產品測試同事在測試平台上測出了一個bug。就是在學習項目中添加一場考試的時候,添加不成功。
於是我先去查看考試微服務的報錯信息,並在本地環境復現,確實存在這樣的bug,如下:
因為該接口是提供給另外一個服務調用的,所以初步判斷是接口業務邏輯處理時間長導致的超時。
產品的技術棧是springcloud,在網管gateway中有各個子服務的路由轉發,這里是前端跟后端建立的連接,如果gatewaay超時,則會響應給前端504。但這里前端響應的是后端提供的錯誤碼。
所以應該是服務消費方出了問題,查看服務消費方的日志,如下:
確實顯示的也是請求超時問題。
在微服務中遠程調用都是基於ribbon進行http請求調用的,所以在服務消費方添加了如下配置,設置超時時間:
ribbon: ReadTimeout: 60000 ConnectTimeout: 60000
再次調用就Ok了。
當然,服務提供方首先要保證自己提供的接口業務處理時長不能過長。
減少處理時長可以有如下常用方法:
- 如果有多個sql需要執行,想辦法整成一個sql,減少跟數據庫的交互;
- 對應的sql也需要加上需要的索引,減少sql執行時長;
- 比較耗時的業務邏輯,又不需要響應給服務消費方,可以采用異步io非阻塞的辦法,即開始新線程進行處理。