關於http調用第三方API,如果第三方API異常,http的耗時問題

      最近項目出現了一個bug,同事在他的項目中使用http調用了我在其他項目中的接口,我的接口拋出異常,導致同事的項目出現了問題。趕快解決自己接口中的bug,改完後,就能正常使用了。但是感覺很不妥,我們一般儘量避免使用http或者rpc調用其他項目的接口的。在無法避免的情況下,一定要做好調用失敗或者調用超時的處理工作。於是看了一下同事的代碼,發現他在同步的情況下直接使用了我的接口的返回值作爲他的接口的返回值。這樣我的接口出錯,就沒有返回值了,同事的接口也沒有返回值,耦合太強。

      由於我的接口的邏輯很簡單,也不會頻繁的更改邏輯,最後建議同事自己實現我原來接口的功能,代價就是同事需要多配置一個數據源。還有一個不需要使用我的接口返回值的接口調用,建議同事採用異步的方式調用我的接口。避免出現http調用超時的情況,影響他接口的當前線程。最後有幾個疑惑自己解惑了一下:

     1:http超時情況之一:競爭http連接資源。原來自己實現http時都要關閉連接。使用RestTemplate時,擔心連接不關閉,於是查看它的方法,它是在finally塊內關閉了連接,釋放了資源。

     2:http調用的第三方接口拋出異常時,http是直接返回還是等待重傳。自己驗證了一下:

調用代碼:

    @RequestMapping(value = "test", method = RequestMethod.GET)
    public Response get() {
        long startTime = System.currentTimeMillis();
        String forObject = new RestTemplate().getForObject(testUrl, String.class);
        log.info(" forObject:" + forObject);
        log.info("time :" + (System.currentTimeMillis() - startTime));
        return Response.ok();
    }

第三方接口:

@Controller
@RequestMapping("homePage")
public class WebController {

    private static final String BUY_URL = "gobuy";

    @RequestMapping(value = "go/buy", method = RequestMethod.GET)
    public String hello(ModelMap modelMap) throws BindDeviceExceededException{
        modelMap.put("hello","歡迎購買");
        // throw new BindDeviceExceededException();
        return BUY_URL;
    }
}
BindDeviceExceededException是自定義的異常。

當第三方接口,不拋出異常時,time = 805ms,拋出自定義異常時,time = 137ms,拋出RunTimeException異常時,time =145ms。不拋異常反而耗時短,是因爲代碼正常往下執行,返回了一個頁面,比較耗時。拋異常耗時短,說明http遇到異常的接口就直接返回了。

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