Feign整合最新SpringCloud CircuitBreaker (原hystrix)调用fallback不生效问题-解决
前几天给自己微服务项目添加个熔断器,由于用的feign,就直接选择了hystrix,三下五除二搞定,结果完美踩坑,始终报503,不进fallback,网上查了大量的资料,但我比较追新用的都是目前最新版本,没查到适用的解决,断断续续花了一天时间,记录下,给大家避避坑。主版本:springcloud-2022.0.4,JDK17
前言
前几天给自己微服务项目添加个熔断器,由于用的feign,就直接选择了hystrix,三下五除二搞定,结果完美踩坑,始终报503,不进fallback,网上查了大量的资料,但我比较追新用的都是目前最新版本,没查到适用的解决,断断续续花了一天时间,记录下,给大家避避坑。
主版本:springcloud-2022.0.4,JDK17
问题复现
- feign整合hystrix,直接加入最新依赖(要注意hystrix在2018年底,Netflix已经停止对Hystrix的开发和维护,并将其标记为处于维护模式)
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
<version>2.2.10.RELEASE</version>
</dependency>
- 主启动类加上注解@EnableHystrix(默认feign已经配置好)
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class CoursePriceApplication {
public static void main(String[] args) {
SpringApplication.run(CoursePriceApplication.class, args);
}
}
- 在我们这边的feign客户端加上fallback回调实现
@FeignClient(value = "course-list",fallback =CourseListClientHystrix.class)
public interface CourseListClient {
@GetMapping("/courses")
List<Course> courseList();
}
实现类:
@Component
public class CourseListClientHystrix implements CourseListClient{
@Override
public List<Course> courseList() {
List<Course> courses = new ArrayList<>();
Course course = new Course();
course.setCourseId(1);
course.setId(1);
course.setCourseName("默认课程");
course.setValid(1);
courses.add(course);
return courses;
}
}
- 配置文件
feign.hystrix.enabled=true
然后运行,这里我们关闭course-list服务,期望熔断并回调返回默认课程,启动运行后:
不慌看看报错:
完整描述:
feign.FeignException$ServiceUnavailable: [503] during [GET] to [http://course-list/courses] [CourseListClient#courseList()]: [Load balancer does not contain an instance for the service course-list]
不难看出,回调并没有被执行,以至于关闭course-list服务后,负载平衡器找不到服务实例
fallback不生效原因
1. 配置文件
这个配置说法确实多,但是版本问题都不再适用,这是2021.0.8版本以前(具体哪个版本的可以查官网)配置
feign.hystrix.enabled=true
以下是2021.0.8版本的配置
这是能查到主流的解决方案,但是如果你使用2022.0.4版本的话,你会发现以前主流的说法依旧不能解决你的问题,没错,配置又改了:
spring.cloud.openfeign.circuitbreaker.enabled=true
2.引入依赖
以前的feign可能确实集成了Hystrix,但是新版本必须手动添加依赖,由于我们先引入了依赖,这里提下是发现网上很多教程说集成了,而Hystrix社区现在活跃的确实不高,一般来说主要还是配置问题
最终解决方案
最后还是使用了Netflix推荐的resilience4j来替代Hystrix,具体解决:
- 移除hystrix依赖,加入resilience4j依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
</dependency>
- 主启动类移除@EnableHystrix
@SpringBootApplication
@EnableFeignClients
public class CoursePriceApplication {
public static void main(String[] args) {
SpringApplication.run(CoursePriceApplication.class, args);
}
}
3.配置文件移除原弃用,添加新配置
spring.cloud.openfeign.circuitbreaker.enabled=true
重启,打开:
成功熔断执行回调,问题解决
总结
主要就是选型问题,可以看到如果只是满足基本需求,本文最后的解决方案更加简洁有效,注意技术迭代,遇到问题优先参考官网的解决方案,尽量选择拥有活跃的社区的组件,当然了,有能力的话自己结合实际业务造的轮子肯定会更可靠,希望能对你有帮助!
更多推荐
所有评论(0)