关于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遇到异常的接口就直接返回了。

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