feign设置超时时间
feign的 本质是 调用 http请求,如果不设置超时时间,请求长时间连接着,占用系统资源,影响用户体验。
feign设置超时时间,可以通过 Request.Options 来设置。
FeignClientFactoryBean :
调用 feign ,会调用 FeignClientFactoryBean 类的 feign() 方法,再用 configureFeign() 配置 feign 。
protected Feign.Builder feign(FeignContext context) {FeignLoggerFactory loggerFactory = get(context, FeignLoggerFactory.class);Logger logger = loggerFactory.create(this.type);Feign.Builder builder = get(context, Feign.Builder.class)// required values.logger(logger).encoder(get(context, Encoder.class)).decoder(get(context, Decoder.class)).contract(get(context, Contract.class));//配置 feign。configureFeign(context, builder);return builder;}
在 内部的 configureUsingConfiguration() 可以看到:
// Request.Options 配置的超时时间,会在这里 添加到 feign配置中。Request.Options options = getOptional(context, Request.Options.class);if (options != null) {builder.options(options);}
代码示例:
- FeignTimeoutConfiguration 配置类:
@Configuration
public class FeignTimeoutConfiguration {@Value("${feign.connect.time:10000}")private int connectTimeout;@Value("${feign.read.time:5000}")private int readTimeout;@Beanpublic Request.Options options() {return new Request.Options(connectTimeout, readTimeout);}
}
- FeignClient 注解 指定配置:
在 configuration 属性中,指定配置为 以上设置的 FeignTimeoutConfiguration 即可。
@FeignClient(name = "myService", configuration = FeignTimeoutConfiguration.class)
@RequestMapping("/myService")
public interface MyFeignService {}