纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

springcloud feign调用失败 怎样解决springcloud feign 首次调用100%失败的问题

lipengxs   2021-06-23 我要评论
想了解怎样解决springcloud feign 首次调用100%失败的问题的相关内容吗lipengxs在本文为您仔细讲解springcloud feign调用失败的相关知识和一些Code实例欢迎阅读和指正我们先划重点:springcloud,解决feign,首次调用失败下面大家一起来学习吧

叙述

在高并发情况下发布应用时经常会发现监控中有很多超时报错或者断路器打开下图中可以看到监控情况测试时也会偶现第一次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只需要创建一个接口并注解它具有可插拔的注解特性可使用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:  project1project2
    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.classname属性为注册中心其他服务的名称

/**
 * @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<LogFeignClient> {
    @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.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)

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

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

feign:
  hystrix:
    enabled: true

以上为个人经验希望能给大家一个参考也希望大家多多支持


相关文章

猜您喜欢

  • Qt 聊天室 Qt实现网络聊天室的代码实例

    想了解Qt实现网络聊天室的代码实例的相关内容吗进击的汪sir在本文为您仔细讲解Qt 聊天室的相关知识和一些Code实例欢迎阅读和指正我们先划重点:Qt,聊天室下面大家一起来学习吧..
  • OpenCV图像距离变换 OpenCV实现图像距离变换

    想了解OpenCV实现图像距离变换的相关内容吗我有一個夢想在本文为您仔细讲解OpenCV图像距离变换的相关知识和一些Code实例欢迎阅读和指正我们先划重点:OpenCV图像距离变换,OpenCV图像变换,OpenCV距离变换下面大家一起来学习吧..

网友评论

Copyright 2020 www.fresh-weather.com 【世纪下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式