前言

前几天给自己微服务项目添加个熔断器,由于用的feign,就直接选择了hystrix,三下五除二搞定,结果完美踩坑,始终报503,不进fallback,网上查了大量的资料,但我比较追新用的都是目前最新版本,没查到适用的解决,断断续续花了一天时间,记录下,给大家避避坑。
主版本:springcloud-2022.0.4JDK17

问题复现

  1. 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>
  1. 主启动类加上注解@EnableHystrix(默认feign已经配置好)
@SpringBootApplication
@EnableFeignClients
@EnableHystrix
public class CoursePriceApplication {
    public static void main(String[] args) {
        SpringApplication.run(CoursePriceApplication.class, args);
    }
}
  1. 在我们这边的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;
    }
}
  1. 配置文件
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,具体解决:

  1. 移除hystrix依赖,加入resilience4j依赖
<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-circuitbreaker-resilience4j</artifactId>
        </dependency>
  1. 主启动类移除@EnableHystrix
@SpringBootApplication
@EnableFeignClients
public class CoursePriceApplication {
    public static void main(String[] args) {
        SpringApplication.run(CoursePriceApplication.class, args);
    }
}

3.配置文件移除原弃用,添加新配置

spring.cloud.openfeign.circuitbreaker.enabled=true

重启,打开:
在这里插入图片描述
成功熔断执行回调,问题解决

总结

主要就是选型问题,可以看到如果只是满足基本需求,本文最后的解决方案更加简洁有效,注意技术迭代,遇到问题优先参考官网的解决方案,尽量选择拥有活跃的社区的组件,当然了,有能力的话自己结合实际业务造的轮子肯定会更可靠,希望能对你有帮助!

Logo

鸿蒙生态一站式服务平台。

更多推荐