太刺激了,太刺激了,熬了一个晚上,终于发现了服务熔断无效不是我的错,而是在SpringCloud的新版中,对断路器配置上有了变动;作者此处所使用的SpringCloud 和Spring Boot版本为Release Train Version: 2020.0.3;Supported Boot Version: 2.4.6。
如果比较急,可以跳过前文的扯淡环节,直接到文章最后查看解决方案。
起先,在按照正常流程,搭建完成框架,做简单测试时,发现Feign整合Hystrix进行服务降级不好用了,没有按照正常流程输出信息,而是直接报错。
初步判断为未在配置文件中开启feign对hystrix的支持,但是当我查看yml文件后,发现已添加支持
feign:
hystrix:
enabled: true
随后,我又猜测会不会是未在feign中指定如果发生回退,要指定的类,打开查看发现也已添加。
@FeignClient(name = "HOMEWORK-PRODUCT",configuration = {FeignLogConfig.class},fallbackFactory = UserFeignClientFallback.class)
public interface UserFeignClient {
@GetMapping("/get/{id}")
HttpResult getUser(@PathVariable("id") String id);
}
紧接着,我又瞄了一眼启动类,发现相关的注解和扫描包也在,况且启动的时候没有报异常
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.demo.student.service.feign"})
@EnableHystrix
public class HomeworkStudentFeignHystrixApplication {
public static void main(String[] args) {
SpringApplication.run(HomeworkStudentFeignHystrixApplication.class, args);
}
}
既然都没问题,那肯定是电脑或者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文件中添加相关配置
feign:
circuitbreaker:
enabled: true
其余的类可以保持不变; 详细如下: Feign调用接口
@FeignClient(name = "HOMEWORK-PRODUCT",configuration = {FeignLogConfig.class},fallbackFactory = UserFeignClientFallback.class)
public interface UserFeignClient {
@GetMapping("/get/{id}")
HttpResult getUser(@PathVariable("id") String id);
}
发生回退时的调用类
@Component
public class UserFeignClientFallback implements FallbackFactory<UserFeignClient> {
@Override
public UserFeignClient create(Throwable cause) {
return new UserFeignClient() {
@Override
public HttpResult getUser(String id) {
return HttpResult.error("id:"+id+", 未查询到相关的信息");
}
};
}
}
结果:成功!!! 注:此类需要实现FallbackFactory接口,若不实现,会报IllegalStateException异常,原因请参照官方文档讲述
Caused 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,