OpenFeign的9个坑,每个都能让你的系统奔溃
源 / 文/
坑一:用对Http Client
1.1 feign中http client
feign.httpclient.enabled=true
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-httpclient</artifactId>
<version>9.3.1</version>
</dependency>
feign.okhttp.enabled=true
<dependency>
<groupId>io.github.openfeign</groupId>
<artifactId>feign-okhttp</artifactId>
<version>10.2.0</version>
</dependency>
1.2 ribbon中的Http Client
ribbon.okhttp.enabled=true
坑二:全局超时时间
feign.client.config.default.connectTimeout=2000
feign.client.config.default.readTimeout=60000
如果不配置超时时间,默认是连接超时10s,读超时60s,在源码feign.Request的内部类Options中定义。
坑三:单服务设置超时时间
feign.client.config.serviceC.connectTimeout=2000
feign.client.config.serviceC.readTimeout=60000
坑四:熔断超时时间
feign.hystrix.enabled=true
@FeignClient(value = "serviceC"configuration = FeignMultipartSupportConfig.class)
public interface ServiceCClient {
@GetMapping("/interface5")
String interface5(String param);
}
hystrix.command.ServiceCClient#interface5(param).execution.isolation.thread.timeoutInMilliseconds=60000
4.1 使用feign超时
if (config.getConnectTimeout() != null && config.getReadTimeout() != null) {
builder.options(new Request.Options(config.getConnectTimeout(), config.getReadTimeout()));
}
4.2 使用ribbon超时
public RibbonResponse execute(RibbonRequest request, IClientConfig configOverride)
throws IOException {
Request.Options options;
if (configOverride != null) {
RibbonProperties override = RibbonProperties.from(configOverride);
options = new Request.Options(
override.connectTimeout(this.connectTimeout),
override.readTimeout(this.readTimeout));
}
else {
options = new Request.Options(this.connectTimeout, this.readTimeout);
}
//这个request里面的client就是OkHttpClient
Response response = request.client().execute(request.toRequest(), options);
return new RibbonResponse(request.getUri(), response);
}
4.3 使用自定义Options
public class RestTemplateConfiguration {
@Bean
public OkHttp3ClientHttpRequestFactory okHttp3RequestFactory(){
OkHttp3ClientHttpRequestFactory requestFactory = new OkHttp3ClientHttpRequestFactory();
requestFactory.setConnectTimeout(2000);
requestFactory.setReadTimeout(60000);
return requestFactory;
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(OkHttp3ClientHttpRequestFactory okHttp3RequestFactory){
return new RestTemplate(okHttp3RequestFactory);
}
}
为了使用ribbon负载均衡,上面加了@LoadBalanced
坑五:ribbon超时时间
ribbon.ConnectTimeout=2000
ribbon.ReadTimeout=11000
坑六:重试默认不开启
@Bean
@ConditionalOnMissingBean
public Retryer feignRetryer() {
return Retryer.NEVER_RETRY;
}
Retryer retryer = new Retryer.Default(100, 1000, 2);
坑七:Ribbon重试
7.1 拉取服务列表
serviceC.ribbon.ServerListRefreshInterval=3
7.2 重试
serviceC.ribbon.MaxAutoRetries=1
这个次数不包括首次调用,配置了1,重试策略会先尝试在失败的实例上重试一次,如果失败,请求下一个实例。
serviceC.ribbon.MaxAutoRetriesNextServer=1
serviceC.ribbon.OkToRetryOnAllOperations=false
serviceC.retryableStatusCodes=404,408,502,500
坑八:hystrix超时
如果Ribbon不重试,MaxAutoRetries=0
hystrix.command.ServiceCClient#interface5(param).execution.isolation.thread.timeoutInMilliseconds=15000
ribbon.ReadTimeout=8000
坑九:使用OpenFeign做http客户端
不用配置ribbon相关参数 使用RestTemplate调用时,不考虑负载均衡 使用过程中OpenFeign要组装出自己的一套请求,跟直接使用http客户端比,会有一定开销
使用OpenFeign有很多配置上的坑,对于没有注册中心的情况,建议直接使用http客户端
推荐阅读
中国唯一一座没有高楼大厦的新一线城市,也太佛了吧
华为最美小姐姐被外派墨西哥后...
国内有程序员电视剧了,结果看了一分钟,就吐了...
男女洗澡前后区别,太形象了!
END
顶级程序员:topcoding
做最好的程序员社区:Java后端开发、Python、大数据、AI
一键三连「分享」、「点赞」和「在看」
评论