如何解决springcloud feign 首次调用100%失败的问题

网友投稿 1737 2023-01-05

如何解决springcloud feign 首次调用100%失败的问题

如何解决springcloud feign 首次调用100%失败的问题

叙述

在高并发情况下发布应用时,经常会发现监控中有很多超时报错或者断路器打开,下图中可以看到监控情况,测试时也会偶现第一次feign调用出错,第二次就会恢复正常。

分析

大家都知道,这里feign底层是集成的ribbon,这里ribbon也会有http连接池,这里的连接池是长连接,定时初始化一批并销毁旧连接,这里还包括一些上下文需要初始化,但是在容器初始化好时,ribbon底层的client是未初始化的,当第一次调用时,有一个初始化过程会导致超时,一般情况下会说需要调整超时时间,但是在电商高并发情况下,这里肯定时不现实的,响应请求都需要ms级别。

解决方案

ribbon饥饿加载

这里可以通过配置ribbon饥饿加载来减少出错次数,如下:

ribbon:

# 饥饿加载

eager-load:

# 是否开启饥饿加载

enabled: true

# 饥饿加载的服务

clients: demo-goods,demo-product

这里为什么说不能完全解决呢?因为在发布时流量切换的瞬间,流量太大,并不是仅仅ribbon需要初始化,hystrix、web容器线程池等都需要初始化或者扩容,这里也需要耗时,所以这里的饥饿加载仅仅只是做到了发布时减少错误数。

zuul饥饿加载

网关作为对外请求的入口,zuul内部使用Ribbon调用其他服务,Spring Cloud默认在第一次调用时懒加载Ribbon客户端。zuul同样需要维护一个相对的子应用环境的上下文,所以也需要启动时饥饿加载。

zuul:

ribbon:

eager-load:

enabled: true

springcloud 中Feign调用常见问题

注: 本文基于Springcloud Edgware版本

一、Feign调用首次失败问题

1、Feign简介:

Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。它http://具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解,Feign 整合了Ribbon。

2、原因分析:

Feign整合Hystrix组件后,Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入自定义的fallback代码,往往首次请求会比较慢(由于Ribbon是懒加载的,在首次请求时,才会开始初始化相关类),这个响应时间可能就大于1秒了,出现调用失败

3、解决方案

(1)增加Hystrix的超时时间,默认为1s

hystrix:

command:

default:

execution:

isolation:

thread:

timeoutInMilliseconds: 10000

(2)配置饿加载(推荐使用)

ribbon:

eager-load:

clients: project1,project2

enabled: true

(3)禁用Hystrix超时(不推荐使用)

hystrix:

command:

default:

execution:

timeout:

enabled: false

(4)为fegin全局禁用hystrix(此种方式较为极端,不建议使用)

feign:

hystrix:

enabled: false

二、Feign整合Hystrix之后日志显示问题

1、解决方案

Feign整合Hystrix之后,当调用失败会走fallback逻辑,造成日志不显示,往往我们需要看日志分析原因,进行故障排查。

(1)在application中配置,开区Feign对Hystrix的支持

feign:

hystrix:

enabled: true

(2)编写Feigin的客户端以及回滚类

在客户端FeignClient注解配置相对应的回滚类,fallbackFactory = LogFallbackFactory.class,name属性为注册中心其他服务的名称

/**

* @description:fegin调用客户端

*

* @author: LUOYUAN

* @date: 2019-08-07-10:33

* @function:

*/

@FeignClient(name = "eureka-log",path = "/api/log",fallbackFactory = LogFallbackFactory.class)

public interface LogFeignClient {

@RequestMapping(value = "list", method = RequestMethod.GET)

public String logList();

}

/**

* @description:feign调用失败逻辑

* @author: LUOYUAN

* @date: 2019-08-07-10:34

* @function:

*/

@Slf4j

public class LogFallbackFactory implements FallbackFactory {

@Override

public LogFeignClient create(Throwable throwable) {

return new LogFeignClient() {

@Override

public String logList() {

log.info("query log fallback reason was:",throwable);

return null;

}

};

}

}

调用失败会打印异常信息

query log fallback reason was:

feign.RetryableException: Connection refused: connect executing GET http://eureka-log/api/log/list

at feign.FeignException.errorExecuting(FeignException.java:132)

at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:113)

at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:78)

at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:109)

at com-flix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)

at com-flix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)

三、Feign调用时定义的fallback不生效

Springcloud Dalston之前得到版本,Feign默认已经开启了Hystrix熔断器,从Dalaton版本开始,默认关闭Hystrix支持,需手动开启,在application.yaml中添加如下配置

feign:

hystrix:

enabled: true

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浅谈安卓移动应用开发(安卓移动开发基础)
下一篇:怎么申请招商银行小程序(招商银行如何申请)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~