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

当使用Feign进行远程服务调用时,如果并发量达到了10个以上的请求,由于某些原因,服务器无法处理这么多的请求,就会导致Feign出现熔断Feign是一种基于注解的声明式Web服务客户端,它简化了远程服务调用的过程。其内部使用了Hystrix作为默认的容错和熔断器实现。Hystrix是一个弹性、容错和容灾的库,当底层服务不可用或超过阈值时,它会自动断开请求的链路,从而保护系统的稳定性。 当Feign的并发量达到10个后,说明系统的负载已经相当高。如果此时继续发送请求,服务器可能无法处理这么多的请求,导致服务出现延迟甚至崩溃。为了保护系统的稳定性,Hystrix会自动触发熔断机制。 熔断机制的主要目的是快速失败,而不是一直等待服务恢复正常。一旦Feign发现熔断条件已满足,它会停止发送请求给服务器,并返回事先定义好的降级结果。这个降级结果通常是由开发者预先配置的,比如返回一个错误提示或者一个默认值。 熔断机制会在一段时间后尝试发送新的请求,检测服务器是否已经恢复正常。如果服务器恢复正常,熔断器会逐渐关闭,Feign可以继续发送请求。但如果服务器仍然不能处理高并发的请求,熔断器会保持打开状态,直到服务器的负载下降到可接受的范围。 总结来说,当使用Feign进行远程服务调用时,如果并发量达到10个后熔断了,这意味着系统的负载已经超出了可承受的范围,Hystrix触发熔断机制来保护系统的稳定性,避免进一步的请求导致服务崩溃。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

麦神-mirson

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

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

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

打赏作者

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

抵扣说明:

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

余额充值