1. 说明
在实际项目中,需要针对单个服务屏蔽Hystrix,但又不想影响对其他服务调用的熔断降级功能。我们知道hystrix有default默认全局配置, 也有根据HystrixCommandKey针对接口做具体配置,但是某个服务可能会有很多接口, 并不能解决针对单个服务屏蔽Hystrix功能,有没有简便快速的实现方法? 查阅官方资料,是可以支持的。
2. 实现
官方的文档写得比较粗略,没有实际的实例,而且在实际运用中, 没有配置正确会有额外的问题。
整体思路是创建一个独立的Feign实例,提供给需要屏蔽的服务, 其他仍走系统初始化的可以支持Hystrix的Fegin实例。
-
创建独立的配置类
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)})
-
指定配置类
在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. 验证
-
不需要熔断降级的接口访问,会直接出现错误
-
其他的接口会正常进入熔断降级
4. 问题补充
-
排除扫描不生效的问题
如果是通过ComponentScan排除扫描,但不生效, 这个时候需要检查系统是否有其他地方也配置了ComponentScan进行了同样的目录扫描, 这个时候是会覆盖, 不能有效控制,需要一并排除。
@ComponentScan(basePackages = "com", excludeFilters = { @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = BaseAutoConfiguration.class), @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = FeignClientWithoutHystrixConfig.class)})
-
FeignClient中指定了配置类, 但仍会进入Hystrix熔断
这个时候需要检查FeignClient名称不能重名, 如果重名,会被覆盖不生效。
备注: 已上传提供源码示例,地址: https://download.youkuaiyun.com/download/hxx688/21719912