• SpringCloud Fegin CircuitBreaker (原hystrix) 熔断失效原因


    前言

    今天想着给自己的微服务项目添加一个熔断的功能,正好项目内远程调用是用的feign,那就直接用hystrix好了,也比较方便。

    然后呢,我以为比较简单的东西,却一直不生效,资料查了个遍,硬是弄了我一上午+一下午的时间,所以记录一下,给大家避坑。

    当前环境

    如果你的环境跟我差的有点多,那这篇文章可能对你的帮助不大。

    • JDK8
    • SpringBoot2.6.6
    • openfeign3.1.2 (是我写这篇文章时比较新的版本了)

       

    不生效的原因

    原因主要有二

    1. 配置文件

      网上很多教程都是给的旧版本的配置文件,都是feign.hystrix.enabled: true,但在新版本这是不生效的 ,正确的配置应该是下面我这样:

      1. feign:
      2. circuitbreaker:
      3. enabled: true

      可以参考官网文档:docs.spring.io/spring-clou…

    1. 引入依赖

      网上很多教程说fegin集成了hystrix,可能旧版本确实集成了,但是新版本必须要手动添加依赖。不过这一点我没在官网上找到,鬼知道官网为什么不写,害我找了半天 ,可能是我眼神不好。

      1. <dependency>
      2. <groupId>org.springframework.cloud</groupId>
      3. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
      4. <version>2.2.10.RELEASE</version>
      5. </dependency>

      引用一位博主的话,我想说的也跟他差不多:

      网上说的fegin集成hystrix误导人,害我以为添加的openfegin已经内置了hystrix,但实际是我找遍openfegin都没有看到hystrix依赖。所以需要自己添加hystrix依赖。

    2. 如果上面两个都不是的话,那你可能需要检查一下下面几个基本问题:

      • 是否添加了 openfegin 的依赖

      • 是否在启动类正确添加了@EnableFeignClients注解

      • 或者你是否正确使用了@FeignClient的fallback参数

      • 熔断处理的实现类是否有被Spring管控

      以上差不多就是我想到的全部条件了。

    附使用代码

    ResourceClient.java:

    1. package cn.sticki.resource.client;
    2. import cn.sticki.common.result.RestResult;
    3. import org.springframework.cloud.openfeign.FeignClient;
    4. import org.springframework.http.MediaType;
    5. import org.springframework.web.bind.annotation.GetMapping;
    6. import org.springframework.web.bind.annotation.PostMapping;
    7. import org.springframework.web.bind.annotation.RequestParam;
    8. import org.springframework.web.bind.annotation.RequestPart;
    9. import org.springframework.web.multipart.MultipartFile;
    10. /**
    11. * @author 阿杆
    12. */
    13. @FeignClient(value = "resource-server", fallback = ResourceClientResolver.class)
    14. public interface ResourceClient {
    15. /**
    16. * 上传图片接口
    17. *
    18. * @param file 图片
    19. * @return 图片链接
    20. */
    21. @PostMapping(value = "/private/resource/image", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    22. RestResult uploadBlogImage(@RequestPart MultipartFile file);
    23. }

    ResourceClientResolver.java:

    1. package cn.sticki.resource.client;
    2. import cn.sticki.common.result.RestResult;
    3. import lombok.extern.slf4j.Slf4j;
    4. import org.springframework.stereotype.Component;
    5. import org.springframework.web.multipart.MultipartFile;
    6. /**
    7. * @author 阿杆
    8. */
    9. @Slf4j
    10. @Component
    11. public class ResourceClientResolver implements ResourceClient{
    12. /**
    13. * 上传图片接口
    14. *
    15. * @param file 图片
    16. * @return 图片链接
    17. */
    18. @Override
    19. public RestResult<String> uploadBlogImage(MultipartFile file) {
    20. log.error("Resource 服务异常:uploadBlogImage 请求失败");
    21. return new RestResult<>(503,"fail");
    22. }
    23. }

    上面两个文件所需要的主要依赖:

    1. <!--feign客户端依赖-->
    2. <dependency>
    3. <groupId>org.springframework.cloud</groupId>
    4. <artifactId>spring-cloud-starter-openfeign</artifactId>
    5. </dependency>
    6. <dependency>
    7. <groupId>org.springframework.cloud</groupId>
    8. <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    9. <version>2.2.10.RELEASE</version>
    10. </dependency>
  • 相关阅读:
    【性能测试】Linux下Docker安装与docker-compose管理容器(超细整理)
    数据结构与算法之希尔排序
    [ruby on rails] array、jsonb字段
    git如何修改注释
    AEB强制标配?今年乘用车前装搭载率预计突破50%
    用 p5.js 写个五子棋
    园子周边第2季:黑色大鼠标垫已上架,大气简洁与五彩缤纷的融合
    Cisco ASA基础——安全算法与基本配置
    Zookeeper系列文章—入门
    基于模糊神经网络算法预测电价(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/LBWNB_Java/article/details/127699612