Spring Cloud Circuit Breaker

时间:2022-11-29 11:24:34

Spring Cloud Circuit Breaker

1. 使用文档

Spring Cloud Breaker 项目包含 Resilience4J 和 Spring Retry 的实现。 Spring Cloud Breaker中实现的API存在于Spring Cloud Commons中。使用文档 这些 API 位于Spring Cloud Commons 文档中。

1.1. 配置弹性4J断路器

1.1.1. 启动器

Resilience4J 实现有两个启动器,一个用于响应式应用程序,另一个用于非响应式应用程序。

  • ​org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j​​- 非反应性应用
  • ​org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j​​- 反应式应用

1.1.2. 自动配置

您可以通过设置来禁用弹性 4J 自动配置。​​spring.cloud.circuitbreaker.resilience4j.enabled​​​​false​

1.1.3. 默认配置

要为所有断路器提供默认配置,请创建传递 aor 的 abean。 该方法可用于提供默认配置。​​Customize​​​​Resilience4JCircuitBreakerFactory​​​​ReactiveResilience4JCircuitBreakerFactory​​​​configureDefault​

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build())
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.build());
}
反应式示例
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new Resilience4JConfigBuilder(id)
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(4)).build()).build());
}

1.1.4. 特定断路器配置

与提供默认配置类似,您可以创建 abean 这是传递的 aor。​​Customize​​​​Resilience4JCircuitBreakerFactory​​​​ReactiveResilience4JCircuitBreakerFactory​

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
return factory -> factory.configure(builder -> builder.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults())
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build()), "slow");
}

In addition to configuring the circuit breaker that is created you can also customize the circuit breaker after it has been created but before it is returned to the caller. To do this you can use the method. This can be useful for adding event handlers to Resilience4J circuit breakers.​​addCircuitBreakerCustomizer​

@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
return factory -> factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
.onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
}
反应式示例
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> slowCustomizer() {
return factory -> {
factory.configure(builder -> builder
.timeLimiterConfig(TimeLimiterConfig.custom().timeoutDuration(Duration.ofSeconds(2)).build())
.circuitBreakerConfig(CircuitBreakerConfig.ofDefaults()), "slow", "slowflux");
factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
.onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
};
}

1.1.5. 断路器属性配置

您可以在应用程序的配置属性文件中配置实例。 属性配置的优先级高于 Javaconfiguration。​​CircuitBreaker​​​​TimeLimiter​​​​Customizer​

resilience4j.circuitbreaker:
instances:
backendA:
registerHealthIndicator: true
slidingWindowSize: 100
backendB:
registerHealthIndicator: true
slidingWindowSize: 10
permittedNumberOfCallsInHalfOpenState: 3
slidingWindowType: TIME_BASED
recordFailurePredicate: io.github.robwin.exception.RecordFailurePredicate

resilience4j.timelimiter:
instances:
backendA:
timeoutDuration: 2s
cancelRunningFuture: true
backendB:
timeoutDuration: 1s
cancelRunningFuture: false

有关 Resilience4j 属性配置的详细信息,请参阅Resilience4J Spring Boot 2 配置。

1.1.6. 隔板模式支持

在类路径上,Spring Cloud Breaker 将使用 Resilience4j Bulkhead 包装所有方法。 您可以通过设置来禁用弹性4j隔板。​​resilience4j-bulkhead​​​​spring.cloud.circuitbreaker.bulkhead.resilience4j.enabled​​​​false​

Spring Cloud Breaker Resilience4j 提供两种隔板模式实现:

  • a使用信号量SemaphoreBulkhead
  • a使用有界队列和固定线程池。FixedThreadPoolBulkhead

默认情况下,Spring Cloud Breaker Resilience4j 使用。修改默认行为以使用设置属性。​​FixedThreadPoolBulkhead​​​​SemaphoreBulkhead​​​​spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead​​​​true​

有关实施的更多信息 的舱壁模式参见Resilience4j 舱壁。

可用于提供默认值和配置。​​Customizer<Resilience4jBulkheadProvider>​​​​Bulkhead​​​​ThreadPoolBulkhead​

@Bean
public Customizer<Resilience4jBulkheadProvider> defaultBulkheadCustomizer() {
return provider -> provider.configureDefault(id -> new Resilience4jBulkheadConfigurationBuilder()
.bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(4).build())
.threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.custom().coreThreadPoolSize(1).maxThreadPoolSize(1).build())
.build()
);
}

1.1.7. 特定隔板配置

与证明默认的“Bulkhead”或“ThreadPoolBulkhead”配置类似,您可以创建abean this 被传递 a。​​Customize​​​​Resilience4jBulkheadProvider​

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

除了配置创建的隔板之外,您还可以自定义隔板和线程池隔板 已创建,但在它们返回给调用方之前。为此,您可以使用 theand 方法。​​addBulkheadCustomizer​​​​addThreadPoolBulkheadCustomizer​

舱壁示例
@Bean
public Customizer<Resilience4jBulkheadProvider> customizer() {
return provider -> provider.addBulkheadCustomizer(bulkhead -> bulkhead.getEventPublisher()
.onCallRejected(slowRejectedConsumer)
.onCallFinished(slowFinishedConsumer), "slowBulkhead");
}
线程池隔板示例
@Bean
public Customizer<Resilience4jBulkheadProvider> slowThreadPoolBulkheadCustomizer() {
return provider -> provider.addThreadPoolBulkheadCustomizer(threadPoolBulkhead -> threadPoolBulkhead.getEventPublisher()
.onCallRejected(slowThreadPoolRejectedConsumer)
.onCallFinished(slowThreadPoolFinishedConsumer), "slowThreadPoolBulkhead");
}

1.1.8. 舱壁属性配置

您可以在应用程序的配置属性文件中配置 ThreadPoolBulkhead 和 SemaphoreBulkhead 实例。 属性配置的优先级高于 Javaconfiguration。​​Customizer​

resilience4j.thread-pool-bulkhead:
instances:
backendA:
maxThreadPoolSize: 1
coreThreadPoolSize: 1
resilience4j.bulkhead:
instances:
backendB:
maxConcurrentCalls: 10

有关 Resilience4j 属性配置的更多信息,请参阅Resilience4J Spring Boot 2 配置。

1.1.9. 收集指标

Spring Cloud 断路器弹性4j 包括自动配置,只要正确设置指标收集 依赖项位于类路径上。若要启用指标收集,必须包括 和。有关指标的更多信息,请 当存在这些依赖项时生成,请参阅Resilience4j 文档。​​org.springframework.boot:spring-boot-starter-actuator​​​​io.github.resilience4j:resilience4j-micrometer​

您不必直接包含,因为它是由​​micrometer-core​​​​spring-boot-starter-actuator​

1.2. 配置弹簧重试断路器

Spring 重试为 Spring 应用程序提供声明式重试支持。 该项目的子集包括实现断路器功能的能力。 Spring 重试通过其断路器重试策略和有状态重试的组合提供断路器实现。 使用 Spring 重试创建的所有断路器都将使用 和DefaultRetryState 创建。 这两个类都可以使用 进行配置。​​CircuitBreakerRetryPolicy​​​​SpringRetryConfigBuilder​

1.2.1. 默认配置

要为所有断路器提供默认配置,请创建传递 a. 该方法可用于提供默认配置。​​Customize​​​​SpringRetryCircuitBreakerFactory​​​​configureDefault​

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> defaultCustomizer() {
return factory -> factory.configureDefault(id -> new SpringRetryConfigBuilder(id)
.retryPolicy(new TimeoutRetryPolicy()).build());
}

1.2.2. 特定断路器配置

与提供默认配置类似,您可以创建传递 a 的 abean。​​Customize​​​​SpringRetryCircuitBreakerFactory​

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
return factory -> factory.configure(builder -> builder.retryPolicy(new SimpleRetryPolicy(1)).build(), "slow");
}

除了配置创建的断路器之外,您还可以在创建断路器之后但在将其返回给调用方之前自定义断路器。 为此,您可以使用该方法。 这对于向 添加事件处理程序很有用。​​addRetryTemplateCustomizers​​​​RetryTemplate​

@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
return factory -> factory.addRetryTemplateCustomizers(retryTemplate -> retryTemplate.registerListener(new RetryListener() {

@Override
public <T, E extends Throwable> boolean open(RetryContext context, RetryCallback<T, E> callback) {
return false;
}

@Override
public <T, E extends Throwable> void close(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {

}

@Override
public <T, E extends Throwable> void onError(RetryContext context, RetryCallback<T, E> callback, Throwable throwable) {

}
}));
}

2. 建筑

2.1. 基本编译和测试

要构建源代码,您需要安装 JDK 17。

Spring Cloud 使用 Maven 进行大多数与构建相关的活动,而您 应该能够通过克隆 您感兴趣的项目和键入的内容

$ ./mvnw install

您也可以自己安装 Maven (>=3.3.3) 并运行命令 代替以下示例。如果你这样做,你也 可能需要添加如果您的本地 Maven 设置没有 包含 Spring 预发布工件的存储库声明。​​mvn​​​​./mvnw​​​​-P spring​

请注意,您可能需要增加内存量 通过设置 a 环境变量 一个值,比如。我们尝试在 配置,所以如果你发现你必须这样做才能做出一个 构建成功,请提出票证以将设置添加到 源代码管理。​​MAVEN_OPTS​​​​-Xmx512m -XX:MaxPermSize=128m​​​​.mvn​

一般需要中间件(即 Redis)进行测试的项目 要求安装并运行 [Docker](www.docker.com/get-started) 的本地实例。

2.2. 文档

spring-cloud-build模块有一个“docs”配置文件,如果你切换 在它上面将尝试从中构建ASCIIDOC源。作为该过程的一部分,它将通过加载所有包含来查找并处理它,但不是 解析或渲染它,只需将其复制到(默认为,即项目的根目录)。如果有 自述文件中的任何更改都将在 Maven 构建后显示为 修改后的文件位于正确的位置。只需提交它并推动更改即可。​​src/main/asciidoc​​​​README.adoc​​​​${main.basedir}​​​​$/tmp/releaser-1667489304382-0/spring-cloud-circuitbreaker/docs​

2.3. 使用代码

如果您没有 IDE 首选项,我们建议您在处理代码时使用Spring Tools Suite或Eclipse。我们使用m2eclipse eclipse插件来获得 maven 支持。其他 IDE 和工具 只要他们使用 Maven 3.3.3 或更高版本,也应该可以毫无问题地工作。

2.3.1. 激活 Spring Maven 配置文件

Spring Cloud 项目需要激活“spring”Maven 配置文件才能解析 Spring 里程碑和快照存储库。使用首选 IDE 进行此设置 配置文件处于活动状态,否则您可能会遇到生成错误。

2.3.2. 使用 m2eclipse 导入到 eclipse 中

我们建议使用m2eclipse eclipse插件 日蚀。如果您还没有安装 m2eclipse,可以从“eclipse 市场”。

旧版本的 m2e 不支持 Maven 3.3,因此一旦 项目被导入到 Eclipse 中,你还需要告诉 M2Eclipse 为项目使用正确的配置文件。如果你 查看与项目中的 POM 相关的许多不同错误,请检查 您有最新的安装。如果您无法升级 m2e, 将“弹簧”配置文件添加到您的。或者,您可以 从父级的“spring”配置文件中复制存储库设置 pom 进入你的。​​settings.xml​​​​settings.xml​

2.3.3. 导入到 eclipse 而不使用 m2eclipse

如果您不想使用 m2eclipse,则可以使用 以下命令:

$ ./mvnw eclipse:eclipse

生成的日食项目可以通过从菜单中选择来导入。​​import existing projects​​​​file​

3. 贡献

Spring Cloud 在非限制性 Apache 2.0 许可证下发布, 并遵循非常标准的Github开发流程,使用Github。 跟踪问题并将拉取请求合并到主服务器。如果需要帮助, 即使是微不足道的贡献,请不要犹豫,但是 请遵循以下准则。

3.1. 签署贡献者许可协议

在我们接受重要的补丁或拉取请求之前,我们需要您签署贡献者许可协议。 签署贡献者协议并不授予任何人对主节点的提交权限 存储库,但这确实意味着我们可以接受您的贡献,您将获得 作者信用,如果我们这样做。活跃的贡献者可能会被要求加入核心团队,并且 给定合并拉取请求的能力。

3.2. 行为准则

本项目遵守贡献者盟约准则 行为。通过参与,您应该遵守此准则。请举报 ​​spring-code-of-conduct@pivotal.io​​ 不可接受的行为。

3.3. 守则惯例和内务管理

这些对于拉取请求都不是必需的,但它们都会有所帮助。它们也可以是 在原始拉取请求之后但在合并之前添加。

  • 使用 Spring 框架代码格式约定。如果您使用 Eclipse 您可以使用 Spring 中的文件导入格式化程序设置 云构建项目。如果使用 IntelliJ,则可以使用Eclipse Code 格式化程序 用于导入相同文件的插件。eclipse-code-formatter.xml
  • 确保所有新文件都有一个简单的Javadoc类注释,至少带有antag来标识你,最好至少有一个关于类是什么的段落 为。.java@author
  • 将 ASF 许可证标头注释添加到所有新文件(从现有文件复制) 在项目中).java
  • 将自己添加为您大幅修改的.java文件(更多 比外观变化)。@author
  • 添加一些 Javadoc,如果更改命名空间,则添加一些 XSD 文档元素。
  • 一些单元测试也会有很大帮助——必须有人去做。
  • 如果没有其他人正在使用您的分支,请根据当前主节点(或 主项目中的其他目标分支)。
  • 编写提交消息时,请遵循以下约定, 如果您正在修复现有问题,请在提交末尾添加 消息(其中 XXXX 是问题编号)。Fixes gh-XXXX

3.4. 检查样式

Spring Cloud Build 附带了一组检查样式规则。您可以在模块中找到它们。该模块下最值得注意的文件是:​​spring-cloud-build-tools​

弹簧云构建工具/

└── src
├── checkstyle
│ └── checkstyle-suppressions.xml
└── main
└── resources
├── checkstyle-header.txt
└── checkstyle.xml

默认检查样式规则

文件头设置

默认抑制规则

3.4.1. 校验样式配置

默认情况下,检查样式规则处于禁用状态。要将检查样式添加到项目中,只需定义以下属性和插件。

绒球.xml

<properties>
<maven-checkstyle-plugin.failsOnError>true</maven-checkstyle-plugin.failsOnError>
<maven-checkstyle-plugin.failsOnViolation>true
</maven-checkstyle-plugin.failsOnViolation>
<maven-checkstyle-plugin.includeTestSourceDirectory>true
</maven-checkstyle-plugin.includeTestSourceDirectory>
</properties>

<build>
<plugins>
<plugin>
<groupId>io.spring.javaformat</groupId>
<artifactId>spring-javaformat-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
</plugins>

<reporting>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
</plugin>
</plugins>
</reporting>
</build>

在出现检查样式错误时构建失败

在检查样式冲突时生成失败

Checkstyle 还分析测试源

添加 Spring Java 格式插件,该插件将重新格式化您的代码以通过大多数 Checkstyle 格式化规则

将检查样式插件添加到构建和报告阶段

如果您需要隐含某些规则(例如,行长需要更长),那么在隐含下定义一个文件就足够了。例:​​${project.root}/src/checkstyle/checkstyle-suppressions.xml​

projectRoot/src/checkstyle/checkstyle-suppresions.xml

<?xml version="1.0"?>
<!DOCTYPE suppressions PUBLIC
"-//Puppy Crawl//DTD Suppressions 1.1//EN"
"https://www.puppycrawl.com/dtds/suppressions_1_1.dtd">
<suppressions>
<suppress files=".*ConfigServerApplication\.java" checks="HideUtilityClassConstructor"/>
<suppress files=".*ConfigClientWatch\.java" checks="LineLengthCheck"/>
</suppressions>

建议将 theand复制到您的项目中。这样,将应用一些默认格式规则。您可以通过运行以下脚本来执行此操作:​​${spring-cloud-build.rootFolder}/.editorconfig​​​​${spring-cloud-build.rootFolder}/.springformat​

$ curl https://raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/.editorconfig -o .editorconfig
$ touch .springformat

​3.5. IDE设置​

​3.5.1. 智能理念​

为了设置 Intellij,您应该导入我们的编码约定、检查配置文件并设置检查样式插件。 可以在Spring Cloud Build项目中找到以下文件。

弹簧云构建工具/

└── src
├── checkstyle
│ └── checkstyle-suppressions.xml
└── main
└── resources
├── checkstyle-header.txt
├── checkstyle.xml
└── intellij
├── Intellij_Project_Defaults.xml
└── Intellij_Spring_Boot_Java_Conventions.xml

默认检查样式规则

文件头设置

默认抑制规则

应用大多数检查样式规则的 Intellij 的项目默认值

适用于应用大多数检查样式规则的 Intellij 项目样式约定

转到→→→。在那里单击该部分旁边的图标。在那里,单击值并选择选项。导入文件。​​File​​​​Settings​​​​Editor​​​​Code style​​​​Scheme​​​​Import Scheme​​​​Intellij IDEA code style XML​​​​spring-cloud-build-tools/src/main/resources/intellij/Intellij_Spring_Boot_Java_Conventions.xml​

Spring Cloud Circuit Breaker

图2.检测配置文件

转到→→→。在那里单击该部分旁边的图标。在那里,单击并导入文件。​​File​​​​Settings​​​​Editor​​​​Inspections​​​​Profile​​​​Import Profile​​​​spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml​

格纹样式

要让Intellij与Checkstyle一起工作,您必须安装插件。建议还安装自动转换 JUnit 断言​​Checkstyle​​​​Assertions2Assertj​

Spring Cloud Circuit Breaker

转到→→→。那里点击该部分中的图标。在那里,您必须定义应从何处选择检查样式规则。在上图中,我们从克隆的 Spring Cloud Build 存储库中选取了规则。但是,您可以指向Spring Cloud Build的GitHub存储库(例如:)。我们需要提供以下变量:​​File​​​​Settings​​​​Other settings​​​​Checkstyle​​​​+​​​​Configuration file​​​​checkstyle.xml​​​​raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle.xml​

  • ​checkstyle.header.file​​- 请将其指向Spring Cloud Build的文件,无论是在您的克隆存储库中还是通过URL。spring-cloud-build-tools/src/main/resources/checkstyle-header.txtraw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txt
  • ​checkstyle.suppressions.file​​- 默认抑制。请将其指向Spring Cloud Build的文件,无论是在您的克隆存储库中还是通过URL。spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xmlraw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml
  • ​checkstyle.additional.suppressions.file​​- 此变量对应于本地项目中的隐含。例如,您正在处理。然后指向该文件夹。示例将是:。spring-cloud-contractproject-root/src/checkstyle/checkstyle-suppressions.xmlspring-cloud-contract/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml

请记住设置 theto,因为我们对生产和测试源应用检查样式规则。​​Scan Scope​​​​All sources​

3.6. 重复查找器

Spring Cloud Build 带来了 ,它可以标记 java 类路径上的重复和冲突类和资源。​​basepom:duplicate-finder-maven-plugin​

3.6.1. 重复查找器配置

默认情况下,重复查找器处于启用状态,并将在 Maven 构建的阶段运行,但只有在将项目添加到项目部分时,它才会在您的项目中生效。​​verify​​​​duplicate-finder-maven-plugin​​​​build​​​​pom.xml​

绒球.xml

<build>
<plugins>
<plugin>
<groupId>org.basepom.maven</groupId>
<artifactId>duplicate-finder-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

对于其他属性,我们设置了插件文档中列出的默认值。

您可以轻松覆盖它们,但设置以 为前缀的所选属性的值。例如,settoin 为了跳过重复项检查您的构建。​​duplicate-finder-maven-plugin​​​​duplicate-finder-maven-plugin.skip​​​​true​

如果您需要添加您的设置,请确保将它们添加到项目的插件配置部分:​​ignoredClassPatterns​​​​ignoredResourcePatterns​

<build>
<plugins>
<plugin>
<groupId>org.basepom.maven</groupId>
<artifactId>duplicate-finder-maven-plugin</artifactId>
<configuration>
<ignoredClassPatterns>
<ignoredClassPattern>org.joda.time.base.BaseDateTime</ignoredClassPattern>
<ignoredClassPattern>.*module-info</ignoredClassPattern>
</ignoredClassPatterns>
<ignoredResourcePatterns>
<ignoredResourcePattern>changelog.txt</ignoredResourcePattern>
</ignoredResourcePatterns>
</configuration>
</plugin>
</plugins>
</build>

Spring Cloud Circuit Breaker