今天来聊一聊前段时间看到的一个面试题,也是在实际项目中需要考虑的一个问题,Feign的超时时间如何设置?
Feign的超时时间设置方式并不固定,它取决于Feign在项目中是如何使用的,不同的使用方式,超时时间设置方式也不大相同,甚至还可能有坑。
前置知识
由于文章会涉及到Feign的底层知识,如果不懂点Feign的基本概念的话,后面就看不下去了
所以为了方便不了解Feign的小伙伴也能够读得懂文章,这里我就简单地说说Feign的原理,点到为止,虽然不深入,但足够应付这篇文章了
Feign的作用
在项目中,我们经常需要调用第三方提供的Http接口,此时我们就可以使用一些Http框架来实现,比如HttpClient
java
复制代码
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
就是本文的主题,封装了超时时间。
返回值Response
就是封装了一些响应码status、响应头之类的
所以通过方法的参数和返回值也可以猜出来,这个Client
作用是用来组装Http请求参数,发送Http请求的
并且http请求超时时间是根据传给Client
的Options
参数来决定的
如果想更深一步了解Feign原理,可在公众号三友的java日记菜单栏springcloud分类中查看
Feign单独使用时超时时间设置
Feign本身就是一个http客户端,可独立使用,Feign提供