spring cloud feign启动熔断后为何直接执行fallback内的方法?

问题描述

在使用feign过程中,通过配置 feign.hystrix.enabled=true 开启熔断。但启动后将直接执行fallback也不会判断调用是否成功。在未配置熔断启动的情况下调用正常,当前需要开启熔断后先尝试调用,在调用失败后才调用fallback的回退方法。

相关代码

Feign 客户端

@FeignClient(name = ServiceConstant.HNISTER_SECURITY,fallback = ResourceRestApiFallback.class,path = "api")
public interface ResourceRestApi {
    @GetMapping(path = "resources")
    List<ResourceDTO> findAll();

    @GetMapping(path = "resources/status/{status}")
    List<ResourceDTO> findByStatus(@PathVariable(name = "status") Integer status);
}

Fallback

@Component
public class ResourceRestApiFallback implements ResourceRestApi {
    private Logger logger = LoggerFactory.getLogger(ResourceRestApiFallback.class);


    @Override
    public List<ResourceDTO> findAll() {
        logger.error("#hnister# feign client ResourceRestApiFallback.findAll() fail");
        return Lists.newArrayList();
    }

    @Override
    public List<ResourceDTO> findByStatus(Integer status) {
        logger.error("#hnister# feign client ResourceRestApiFallback.findByStatus() fail");
        return Lists.newArrayList();
    }
}
阅读 15.9k
4 个回答
新手上路,请多包涵

遇到同样的问题,解决了吗?

新手上路,请多包涵

我这边开始是因为没用Feign调用,用了restTemplate,所以在主程序里面加了@EnableHystrix,后面整合了Feign之后,也是出现你这个问题,把主程序的@EnableHystrix去掉之后就正常了,不知道你是不是这个问题。

主要原因应该是Hystrix默认超时时间过短,导致直接进入fallback。

yml中的修复配置

Hystrix默认的超时时间是1秒,如果超过这个时间尚未响应,将会进入fallback代码。而首次请求往往会比较慢(由于Ribbon是懒加载的,在首次请求时,才会开始初始化相关类),这个响应时间可能就大于1秒了。

法一 Ribbon配置饥饿加载(最佳推荐) 自行整理yml中的格式

ribbon:
eager-load:

enabled: true # 开启即时加载(默认延迟加载),默认情况下Ribbon是懒加载的——首次请求Ribbon相关类才会初始化,这会导致首次请求过慢的问题,你可以配置饥饿加载,让Ribbon在应用启动时就初始化。
clients: microservice-provider-xxx # 多个用,分隔  此处为hystrix整合的ribbon调用的目标服务名称
新手上路,请多包涵

调用端,eureka.client.fetch-registy: true,就可以了

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题