太刺激了,太刺激了,熬了一个晚上,终于发现了服务熔断无效不是我的错,而是在SpringCloud的新版中,对断路器配置上有了变动;作者此处所使用的SpringCloud 和Spring Boot版本为Release Train Version: 2020.0.3;Supported Boot Version: 2.4.6。
如果比较急,可以跳过前文的扯淡环节,直接到文章最后查看解决方案。
起先,在按照正常流程,搭建完成框架,做简单测试时,发现Feign整合Hystrix进行服务降级不好用了,没有按照正常流程输出信息,而是直接报错。

初步判断为未在配置文件中开启feign对hystrix的支持,但是当我查看yml文件后,发现已添加支持
1 feign: 2 hystrix: 3 enabled: true
随后,我又猜测会不会是未在feign中指定如果发生回退,要指定的类,打开查看发现也已添加。
1 @FeignClient(name = "HOMEWORK-PRODUCT",configuration = {FeignLogConfig.class},fallbackFactory = UserFeignClientFallback.class) 2public interface UserFeignClient { 3 4 @GetMapping("/get/{id}") 5 HttpResult getUser(@PathVariable("id") String id); 6}
紧接着,我又瞄了一眼启动类,发现相关的注解和扫描包也在,况且启动的时候没有报异常
1@SpringBootApplication 2@EnableFeignClients(basePackages = {"com.demo.student.service.feign"}) 3@EnableHystrix 4public class HomeworkStudentFeignHystrixApplication { 5 6 public static void main(String[] args) { 7 SpringApplication.run(HomeworkStudentFeignHystrixApplication.class, args); 8 } 9 10}
既然都没问题,那肯定是电脑或者IDEA的问题咯!随后我就合上了电脑睡了一觉。醒来我猜测我猜测它已经好了,结果,很打脸!!!
别的,咱也想不出哪有问题了啊,只能面向百度编程,查了好久的feign和Hystrix服务熔断失效,翻来翻去,也就只有之前我查看过没问题的那几个点,找了3个多小时,实在是没解决,感觉屋内些许闷,想出去找个厕所顺便吹吹风。
就在去的途中,突然想起来,为啥就不能去翻翻官方文档嘞!去官方文档瞅瞅吧!
好家伙,不看不知道,进去之后我就发现Feign的断路回退方式在新版已经改变了。
If Spring Cloud CircuitBreaker is on the classpath and feign.circuitbreaker.enabled=true, Feign will wrap all methods with a circuit breaker.
然后,就没了然后,很快服务熔断的问题就解决了,具体的方式如下: 在yml文件中添加相关配置
1feign: 2 circuitbreaker: 3 enabled: true 4
其余的类可以保持不变; 详细如下: Feign调用接口
1@FeignClient(name = "HOMEWORK-PRODUCT",configuration = {FeignLogConfig.class},fallbackFactory = UserFeignClientFallback.class) 2public interface UserFeignClient { 3 4 @GetMapping("/get/{id}") 5 HttpResult getUser(@PathVariable("id") String id); 6}
发生回退时的调用类
1@Component 2public class UserFeignClientFallback implements FallbackFactory<UserFeignClient> { 3 @Override 4 public UserFeignClient create(Throwable cause) { 5 return new UserFeignClient() { 6 @Override 7 public HttpResult getUser(String id) { 8 return HttpResult.error("id:"+id+", 未查询到相关的信息"); 9 } 10 }; 11 } 12}
结果:成功!!!
注:此类需要实现FallbackFactory接口,若不实现,会报IllegalStateException异常,原因请参照官方文档讲述
1Caused by: java.lang.IllegalStateException: Incompatible fallbackFactory instance. Fallback/fallbackFactory of type class com.demo.student.service.feign.UserFeignClientFallback is not assignable to interface org.springframework.cloud.openfeign.FallbackFactory for feign client HOMEWORK-PRODUCT,
