Spring Cloud 2021.0.1 实践 Resilience4J

简介: Spring Cloud CircuitBreaker 提供了跨不同断路器实现的抽象。它提供了在您的应用程序中使用的一致 API,让您(开发人员)选择最适合您的应用程序需求的断路器实现。

Spring Cloud CircuitBreaker 提供了跨不同断路器实现的抽象。它提供了在您的应用程序中使用的一致 API,让您(开发人员)选择最适合您的应用程序需求的断路器实现。

Spring Cloud CircuitBreaker 项目包含 Resilience4J 和 Spring Retry 的实现。Spring Cloud CircuitBreaker 中实现的 API 位于 Spring Cloud Commons 中。


Spring Cloud 支持一下几种 CircuitBreaker


  • Resilience4J


  • Sentinel


  • Spring Retry


下文主要描述 Resilience4J  的使用


Resilience4J 介绍


Resilience4J 其实是参照 Netfix Hystrix 实现的的断路器


断路器 本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似保险熔断),向调用方法返回一个符合预期的,可处理的被选相应(FallBack), 而不是长时间的等待或者跑出调用方法无法处理的异常,这样就保证了服务调用方的线程不会长时间,不必要地占用,从而避免了故障在分布式系统中进行蔓延,从而导致雪崩效应。


Resilience4J 实现有两种 starter,一种用于 reactor 方式的依赖,另一种用于非 reactor 的 starter


依赖如下:


  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j 普通模式


  • org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j reactor 模式


reactor 模式的依赖可以配合 spring cloud gateway 使用


使用配置


默认配置


要为所有断路器提供默认配置,我们需要创建一个自定义 bean,该 bean被传递给Resilience4JCuitBreakerFactory 或 ReactiveResilience4JCuitBreakerFactory。

configureDefault 方法可用于提供默认配置。


@Bean
    public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
        return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
                // 默认超时时间 4s
                .timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build())
                // circuitBreaker 使用默认配置
                .circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
                .build());
    }


基于 YML 方式的配置


下面是断路器和时间限流配配置:


# 断路器配置
resilience4j.circuitbreaker:
 instances:
     # 配置服务
     backendA:
         registerHealthIndicator: true
         slidingWindowSize: 100
     backendB:
         registerHealthIndicator: true
         # 滑动窗口类型:COUNT_BASED 基于计数的滑动窗口, TIME_BASED 基于计时的滑动窗口
         slidingWindowType: TIME_BASED
         # 滑动窗口大小
         slidingWindowSize: 10
         # 当 circuitbreaker 处于 HalfOpen 允许通过的请求数量
         permittedNumberOfCallsInHalfOpenState: 3
         recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate
# 时间限流
resilience4j.timelimiter:
 instances:
     backendA:
         timeoutDuration: 2s
         cancelRunningFuture: true
     backendB:
         timeoutDuration: 1s
         cancelRunningFuture: false


Bulkhead 配置


Bulkhead作用是让一个应用中不同方法互不影响,避免某些方法调用异常危及整个应用。


Java 方式的配置


@Bean
public Customizer<Resilience4jBulkheadProvider> slowBulkheadProviderCustomizer() {
    return provider -> provider.configure(builder -> builder
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.ofDefaults()), "slowBulkhead");
}


YML 方式的配置


resilience4j.thread-pool-bulkhead:
    instances:
        backendA:
            # 配置最大线程数
            maxThreadPoolSize: 1
            # 核心线程数
            coreThreadPoolSize: 1
resilience4j.bulkhead:
    instances:
        backendB:
            maxConcurrentCalls: 10


举个例子


首先我们下先加入 gradle 的依赖


implementation 'org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j'


我们需要配置 feign 使用 circuitbreaker yml 配置文件如下:



feign:
  circuitbreaker:
    enabled: true
resilience4j.timelimiter:
 instances:
     default:
         timeoutDuration: 1s
         cancelRunningFuture: true      


如果通过 Fegin 调用 payment-service 服务 /payment/create feign 代码如下:


@FeignClient(name = "payment-service", path = "/payment")
public interface PaymentFeign {
    @PostMapping("/create")
    PaymentVo create(@RequestBody @Validated PaymentDto paymentDto);
}


如果超时会出现一下错误:


image.png 

参考文档




相关文章
|
7天前
|
XML Java 数据格式
🌱 深入Spring的心脏:Bean配置的艺术与实践 🌟
本文深入探讨了Spring框架中Bean配置的奥秘,从基本概念到XML配置文件的使用,再到静态工厂方式实例化Bean的详细步骤,通过实际代码示例帮助读者更好地理解和应用Spring的Bean配置。希望对你的Spring开发之旅有所助益。
45 3
|
22天前
|
XML Java 数据格式
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
48 14
|
18天前
|
缓存 Java 数据库连接
Spring框架中的事件机制:深入理解与实践
Spring框架是一个广泛使用的Java企业级应用框架,提供了依赖注入、面向切面编程(AOP)、事务管理、Web应用程序开发等一系列功能。在Spring框架中,事件机制是一种重要的通信方式,它允许不同组件之间进行松耦合的通信,提高了应用程序的可维护性和可扩展性。本文将深入探讨Spring框架中的事件机制,包括不同类型的事件、底层原理、应用实践以及优缺点。
47 8
|
23天前
|
消息中间件 监控 Java
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + RabbitMQ应用程序部署到Pivotal Cloud Foundry (PCF)
31 6
|
23天前
|
负载均衡 Java 开发者
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
深入探索Spring Cloud与Spring Boot:构建微服务架构的实践经验
74 5
|
20天前
|
XML 前端开发 安全
Spring MVC:深入理解与应用实践
Spring MVC是Spring框架提供的一个用于构建Web应用程序的Model-View-Controller(MVC)实现。它通过分离业务逻辑、数据、显示来组织代码,使得Web应用程序的开发变得更加简洁和高效。本文将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring MVC,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
48 2
|
23天前
|
Java 关系型数据库 MySQL
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot + MySQL应用程序部署到Pivotal Cloud Foundry (PCF)
42 5
|
23天前
|
缓存 监控 Java
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
如何将Spring Boot应用程序部署到Pivotal Cloud Foundry (PCF)
31 5
|
24天前
|
安全 Java 数据安全/隐私保护
如何使用Spring Boot进行表单登录身份验证:从基础到实践
如何使用Spring Boot进行表单登录身份验证:从基础到实践
40 5
|
24天前
|
监控 Java 数据安全/隐私保护
如何用Spring Boot实现拦截器:从入门到实践
如何用Spring Boot实现拦截器:从入门到实践
41 5