背景:我使用的框架是beego,网络请求用的是Go自带的net/http,没有设置过超时时间,app的首页列表请求了15个接口,有一天其中一个接口请求了三方服务挂了,导致整个列表全凉了。
期望:其中5个主要接口成功就能显示列表,主流程能跑得通。
分析:可是客户端是同时发15个接口等全部返回后一起解析,如果拆分5个接口成功渲染一次列表,另外10个成功一次渲染一次列表,方案可行,但体验很差,多年的业务逻辑代码拆起来也容易出错,可以说是代价比较大,那么就在接口上处理,请求其他服务出错时返回正常状态码和空数组,不就可以了嘛?
看一眼接口代码,也是按上面分析处理的,那为什么还是导致全凉呢?
后来发现真正的原因是网关超时了,客户端的代码执行了网络请求失败的逻辑,那么我们就需要在服务器接口上加超时设置,超时返回正常状态码和空数组并打印日志。
搬个砖原出处,设置超时代码如下:
client := http.Client{ Timeout: 30*time.Second }
resp, err := client.Get(reqUrl)
截屏2022-05-06 下午2.15.28.png
网友评论