Spring Boot2.5.2、SpringCloud、Fegin使用hystrix服务熔断

学习有关服务熔断的内容,又一次踩坑,并记录,仅供参考。
因为我使用的服务间调用方式是基于Spring Cloud Feign 的,资料上说Fegin已经依赖了Hystrix所以再不需要改动pom文件即可使用,正因如此遇到了一些问题

1.依赖版本

Spring Boot

<parent>
 	<groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.5.2</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

Spring CLoud

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>2020.0.3</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

要注意一点,Spring Boot和Spring Cloud的版本一定要按照官网上的说明对应起来,否则就会在启动时报bean注入异常。
Fegin

<!--Feign -->
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

然后还需要改配置文件

#开启熔断器
feign:
  hystrix:
    enabled: true

但是完成这一步之后idea报警告了:
在这里插入图片描述
本来没当回事,以为又是idea的问题
然后就去改代码

@FeignClient(name = "test-producer", fallback = TestHystrix.class)
public interface TestHystrixService {
    @GetMapping("/hello-fusing")
    public String hello();
}

实现上面的接口

@Component
public class TestHystrix implements TestHystrixService {
    @GetMapping("/hello")
    public String hello() {
    	return "实现熔断喽";
    }
}

controller类

@RestController
public class FeignTestController {

    @Autowired
    private TestHystrixService testHystrixService ;
    
    @RequestMapping("/feign/call-test")
    public String call() {
        // 像调用本地服务一样
        return testProducerService .hello();
    }
    
}

修改完代码,没有报错之后,直接尝试启动服务,可以成功启动。
以为以上的代码作为服务消费者。
当然还需要服务生产者,为其提供服务。
我当时有两个服务生产者,他们分别返回 producer1 和producer2两个字符串。
所以将所有服务都跑起来之后,开始测试。
用postman重复调用服务消费者的接口,因为之前已经用Feign实现负载均衡,所以反复调用会交替的得到两个服务生产者的返回值。
为了验证是否实现服务熔断。
我停掉了producer1服务,也就是说,理论上来讲,我反复调用消费者的接口,会交替的得到 “实现熔断喽” 和 ”producer2" 两个值。
然而,当轮到producer2服务时是正常的,紧接着再一次调用会在服务消费者的控制台出现异常:
java.net.ConnectException: Connection refused: connect
而postman也会返回500的状态码
很明显,这说明熔断机制没有正常实现。
我有想起上面修改配置文件时idea的警告,可能是真的找不到依赖
然后在网上找了好久,也没有一个合理的解决方案
直到我看到了这篇文章:https://www.cnblogs.com/devzxd/p/feign-hystrix-problem.html
虽然也并没有直接的解决方案,但让我意识到,在Fegin中可能没有Hystrix,之前的资料说
的Fegin中依赖了Hystrix可能在新版本中被移除
所以我又进行简单的验证:
在配置文件中删除:enabled: true
在这里插入图片描述
也无法解析hystrix,再删除hystrix:
在这里插入图片描述
仍然是无法解析
那么可以尝试用代码提示来找到正确的配置语句:
在这里插入图片描述
我已经把滚动条拉到底了,很明显,没有。
所以要使用Hystrix,可以把它作为一个新的依赖进行添加
所以先找maven
在这里插入图片描述

点进去,发现会有很多信息,但没有Hystrix直接的仓库,都多了些描述,所以先观察一波(我也是凭感觉来的。。)
在这里插入图片描述
由上图我们发现有两个很相似的,Spring Cloud Starter Netflix Hystrix 和 Spring Cloud Starter Hystrix
而(2)写着 (deprecated, please use spring-cloud-starter-netflix-hystrix) ,我们又是用的Spring Cloud
所以可以尝试使用(1)中的信息,点击(1)
在这里插入图片描述
直接上最新版:

<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>2.2.9.RELEASE</version>
</dependency>

改完pom,按照套路应该改配置文件,那怎么改呢?
由依赖信息我们可以发现,它“属于”Spring Cloud,所以我们可以尝试使用代码提示来搞定:
在这里插入图片描述
我尝试再cloud下输入hystrix,果然有相关的提示,回车确认:
在这里插入图片描述
这看上去和我们之前第一次写的形式很像。
过程漫长,篇幅有限,接下来直接贴代码写用法
在启动类上添加注解:@EnableHystrix
在新版本不要在使用@EnableCircuitBreaker了,因为@EnableHystrix 包含@EnableCircuitBreaker
在这里插入图片描述
然后处理Controller类,

@RestController
public class FeignTestController {

    @Autowired
    private TestHystrixService testHystrixService ;
    
    @RequestMapping("/feign/call-test")
    @HystrixCommand(fallbackMethod = "helloError")
     //fallbackMethod 一定是一个方法
    public String call() {
        // 像调用本地服务一样
        return testProducerService .hello();
    }
   	
   	//添加熔断回调方法,与上面fallbackMethod一定要对应 
    public String helloError(){
        return "终于熔断了...";
    }
    
}

最后只保留的接口即可,删掉一开始写的实现类

@FeignClient(name = "test-producer", fallback = TestHystrix.class)
public interface TestHystrixService {
    @GetMapping("/hello-fusing")
    public String hello();
}

TestHystrix (实现类)可以删掉了,它的作用也相当与一个回调函数,(如果不删掉idea会在@Autowired注解,报错,无法自动装配)
@Component
public class TestHystrix implements TestHystrixService {
@GetMapping("/hello")
public String hello() {
return “实现熔断喽”;
}
}

再次启动服务,一切正常,实现服务熔断。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值