今天来聊一聊前段时间看到的一个面试题,也是在实际项目中需要考虑的一个问题,Feign的超时时间如何设置?
Feign的超时时间设置方式并不固定,它取决于Feign在项目中是如何使用的,不同的使用方式,超时时间设置方式也不大相同,甚至还可能有坑。
前置知识由于文章会涉及到Feign的底层知识,如果不懂点Feign的基本概念的话,后面就看不下去了
所以为了方便不了解Feign的小伙伴也能够读得懂文章,这里我就简单地说说Feign的原理,点到为止,虽然不深入,但足够应付这篇文章了
Feign的作用在项目中,我们经常需要调用第三方提供的Http接口,此时我们就可以使用一些Http框架来实现,比如HttpClient
public class HttpClientDemo {
public static void main(String[] args) throws Exception {
//创建一个HttpClient
HttpClient httpClient = HttpClientBuilder.create().build();
//构建一个get请求
HttpGet httpGet = new HttpGet("http://192.168.100.1:8080/order/1");
//发送请求,获取响应
HttpResponse httpResponse = httpClient.execute(httpGet);
HttpEntity httpEntity = httpResponse.getEntity();
//读出响应值
String response = EntityUtils.toString(httpEntity);
System.out.println("Response: " response);
}
}
如果项目中只有一两个这种第三方接口这样写还行,但是一旦这种三方接口过多的话,每次都得这样组装参数,发送请求,写一堆同样的代码,就显然很麻烦了。
所以为了简化发送Http请求的开发,减少重复代码,Feign就出现了。
Feign是一个声明式的Http框架
当你需要调用Http接口时,你需要声明一个接口,加一些注解就可以了
而像组装参数、发送Http请求等重复性的工作都交给Feign来完成。
Feign的原理虽然有了接口,但是仅仅有接口是不够的,因为接口又不能创建对象,我们得需要对象。
Feign为了方便我们为接口创建对象,提供的Feign.Builder这个内部类
这个类的作用就是解析接口的上的注解,为接口生成一个动态代理对象,后面通过这个代理对象就可以发送请求了。
这个内部类有很多属性,这些属性都是Feign的核心组件。
在这些核心的组件中有一个叫Client的,上图中我圈出来了。
这个Client类划个重点,非常非常重要,本文讨论的东西跟他有密切关系。
它只有一个方法Response execute(Request request, Options options)
方法的第一个参数Request就是封装了http请求的url、请求方法,请求头、请求体之类的参数
第二个参数Options就是本文的主题,封装了超时时间。