背景:我使用的框架是beego,網(wǎng)絡(luò)請(qǐng)求用的是Go自帶的net/http,沒(méi)有設(shè)置過(guò)超時(shí)時(shí)間,app的首頁(yè)列表請(qǐng)求了15個(gè)接口干毅,有一天其中一個(gè)接口請(qǐng)求了三方服務(wù)掛了,導(dǎo)致整個(gè)列表全涼了泼返。
期望:其中5個(gè)主要接口成功就能顯示列表硝逢,主流程能跑得通。
分析:可是客戶端是同時(shí)發(fā)15個(gè)接口等全部返回后一起解析绅喉,如果拆分5個(gè)接口成功渲染一次列表渠鸽,另外10個(gè)成功一次渲染一次列表,方案可行柴罐,但體驗(yàn)很差徽缚,多年的業(yè)務(wù)邏輯代碼拆起來(lái)也容易出錯(cuò),可以說(shuō)是代價(jià)比較大革屠,那么就在接口上處理凿试,請(qǐng)求其他服務(wù)出錯(cuò)時(shí)返回正常狀態(tài)碼和空數(shù)組,不就可以了嘛似芝?
看一眼接口代碼红省,也是按上面分析處理的,那為什么還是導(dǎo)致全涼呢国觉?
后來(lái)發(fā)現(xiàn)真正的原因是網(wǎng)關(guān)超時(shí)了,客戶端的代碼執(zhí)行了網(wǎng)絡(luò)請(qǐng)求失敗的邏輯虾啦,那么我們就需要在服務(wù)器接口上加超時(shí)設(shè)置麻诀,超時(shí)返回正常狀態(tài)碼和空數(shù)組并打印日志。
搬個(gè)磚原出處傲醉,設(shè)置超時(shí)代碼如下:
client := http.Client{ Timeout: 30*time.Second }
resp, err := client.Get(reqUrl)
截屏2022-05-06 下午2.15.28.png