当前位置:   article > 正文

springCloud之熔断降级_springcloud 统一降级熔断

springcloud 统一降级熔断

        熔断降级是通过对服务之间的依赖关系进行管理来实现的。当一个服务调用另一个服务时,如果被调用的服务出现故障或响应时间过长,调用方可以使用熔断器来中断对该服务的调用,从而避免整个系统的瘫痪。

 一、代码案例

        案例使用的熔断依赖包为springCloud自带的,Hystrix已经不维护了,推荐使用SpringCloud自带依赖,以下为springboot及springCloud的版本生命,及熔断的依赖包

  1. <!-- SpringBoot的依赖配置-->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-dependencies</artifactId>
  5. <version>2.6.11</version>
  6. <type>pom</type>
  7. <scope>import</scope>
  8. </dependency>
  9. <!-- springCloud版本 -->
  10. <dependency>
  11. <groupId>org.springframework.cloud</groupId>
  12. <artifactId>spring-cloud-dependencies</artifactId>
  13. <version>2021.0.1</version>
  14. <type>pom</type>
  15. <scope>import</scope>
  16. </dependency>
  17. <!-- springCloud版本对应的alibabaCloud版本 -->
  18. <dependency>
  19. <groupId>com.alibaba.cloud</groupId>
  20. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  21. <version>2021.0.4.0</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. <!-- 熔断降级的依赖包 -->
  26. <dependency>
  27. <groupId>org.springframework.cloud</groupId>
  28. <artifactId>spring-cloud-starter-circuitbreaker-reactor-resilience4j</artifactId>
  29. </dependency>

增加自定义熔断配置类

  1. package com.zhangzz.gateway.config;
  2. import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig;
  3. import io.github.resilience4j.timelimiter.TimeLimiterConfig;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.cloud.circuitbreaker.resilience4j.ReactiveResilience4JCircuitBreakerFactory;
  6. import org.springframework.cloud.circuitbreaker.resilience4j.Resilience4JConfigBuilder;
  7. import org.springframework.cloud.client.circuitbreaker.Customizer;
  8. import org.springframework.context.annotation.Bean;
  9. import org.springframework.context.annotation.Configuration;
  10. import java.time.Duration;
  11. /**
  12. * 自定义熔断配置 设置默认超时时间为30s
  13. *
  14. * @author 大蒜是只猫
  15. * @since 2023/6/24
  16. */
  17. @Configuration
  18. public class Resilience4JConfig {
  19. @Value("${resilience.timeout:30}")
  20. private int timeOut ;
  21. @Bean
  22. public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
  23. TimeLimiterConfig timeLimiterConfig = TimeLimiterConfig.custom()
  24. .timeoutDuration(Duration.ofSeconds(timeOut))
  25. .build();
  26. return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
  27. .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
  28. .timeLimiterConfig(timeLimiterConfig)
  29. .build());
  30. }
  31. }

自定义熔断后的响应路径

  1. import org.springframework.web.bind.annotation.RequestMapping;
  2. import org.springframework.web.bind.annotation.RestController;
  3. import reactor.core.publisher.Mono;
  4. @RestController
  5. public class FallbackHandler {
  6. @RequestMapping("/error")
  7. public Mono<String> error() {
  8. return Mono.just("Service Unreachable");
  9. }
  10. }

 因为我的路由信息采用动态路由,全部由前端http请求添加的,springCloud之Gateway动态路由_昵称无限重复的博客-CSDN博客可参考我的上一篇。以下为动态路由的实现参数:

  1. {
  2. "id":"test1",
  3. "name":"routeTest1",
  4. "description":"路由测试1",
  5. "order":1,
  6. "predicateDefinitions":[
  7. {
  8. "name":"Path",
  9. "args":{
  10. "_genkey_0":"/b3/**",
  11. "_genkey_1":"/b4/**"
  12. }
  13. }
  14. ],
  15. "filters":[
  16. {
  17. "name":"StripPrefix",
  18. "args":{
  19. "_genkey_0":"1"
  20. }
  21. },
  22. {
  23. "name":"CircuitBreaker", //固定名称
  24. "args":{
  25. "name":"defaultBreaker", //map的key值,名称任意,但全局不可重复
  26. "fallbackUri":"forward:/error" //进入熔断后的响应路径
  27. }
  28. }
  29. ],
  30. "url":"lb://content"
  31. }

启动服务后,输出地址。http://localhost/b3/get,可在/get方法中,使用线程等待,使其超过30秒,就可以看见熔断错误页面的响应。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/843081
推荐阅读
相关标签
  

闽ICP备14008679号