Feign如何针对单个服务屏蔽Hystrix熔断功能

1. 说明

在实际项目中,需要针对单个服务屏蔽Hystrix,但又不想影响对其他服务调用的熔断降级功能。我们知道hystrix有default默认全局配置, 也有根据HystrixCommandKey针对接口做具体配置,但是某个服务可能会有很多接口, 并不能解决针对单个服务屏蔽Hystrix功能,有没有简便快速的实现方法? 查阅官方资料,是可以支持的。

file

2. 实现

官方的文档写得比较粗略,没有实际的实例,而且在实际运用中, 没有配置正确会有额外的问题。

整体思路是创建一个独立的Feign实例,提供给需要屏蔽的服务, 其他仍走系统初始化的可以支持Hystrix的Fegin实例。

  1. 创建独立的配置类

    FeignClientWithoutHystrixConfig

    // @Configuration
    public class FeignClientWithoutHystrixConfig {
    
        private final Logger log = LoggerFactory.getLogger(this.getClass());
    
        /**
         * 创建独立的Fegin调用实例
         * @return
         */
        @Bean
        @Scope("prototype")
        public Feign.Builder feignBuilder() {
            log.debug("Creating feign builder without hystrix");
            return Feign.builder();
        }
    }
    

    说明: @Configuration注解实质上是可以注释的, 如果不想注释, 需要排除扫描, 否则会覆盖默认的Feign实例。

    @ComponentScan(basePackages = "com",
          excludeFilters = {@ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = FeignClientWithoutHystrixConfig.class)})
    
    
  2. 指定配置类

    在FeignClient中指定配置类FeignClientWithoutHystrixConfig

    @FeignClient(name = "withoutHystrix",
          url = "conrad.fake",
          fallback = FeignClientWithoutHystrix.FallbackThatShouldNotOccur.class,
          configuration = FeignClientWithoutHystrixConfig.class)
    public interface FeignClientWithoutHystrix {
    
       @RequestMapping(method = RequestMethod.GET, value = "/fake/url")
       String getFromFakeUrl();
    
       @Component
       class FallbackThatShouldNotOccur implements FeignClientWithoutHystrix {
    
          private final Logger log = LoggerFactory.getLogger(this.getClass());
    
          @Override
          public String getFromFakeUrl() {
             log.error("This fallback shouldn't occur");
             return "Fallback";
          }
       }
    
    }
    

3. 验证

  1. 不需要熔断降级的接口访问,会直接出现错误

    file

  2. 其他的接口会正常进入熔断降级

    file

4. 问题补充

  1. 排除扫描不生效的问题

    如果是通过ComponentScan排除扫描,但不生效, 这个时候需要检查系统是否有其他地方也配置了ComponentScan进行了同样的目录扫描, 这个时候是会覆盖, 不能有效控制,需要一并排除。

    @ComponentScan(basePackages = "com",
          excludeFilters = {
          @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = BaseAutoConfiguration.class),
          @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = FeignClientWithoutHystrixConfig.class)})
    
  2. FeignClient中指定了配置类, 但仍会进入Hystrix熔断

    这个时候需要检查FeignClient名称不能重名, 如果重名,会被覆盖不生效。

    file

备注: 已上传提供源码示例,地址: https://download.csdn.net/download/hxx688/21719912

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

麦神-mirson

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值