3.0.2-SNAPSHOT
| 本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springboot.io - Spring Boot中文社区 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。 | 
1. 使用文档
Spring Cloud CircuitBreaker 项目包含 Resilience4J 和 Spring Retry 的实现。Spring Cloud CircuitBreaker 中实现的 API 在 Spring Cloud Commons 中存在。这些API的使用文档位于 Spring Cloud Commons 文档 中。
1.1. 配置 Resilience4J Circuit Breakers
1.1.1. Starter
Resilience4J 的实现有两个 starter,一个用于 Reactive (响应式)应用,一个用于非 Reactive 应用。
- 
org.springframework.cloud:spring-cloud-starter-circuitbreaker-resilience4j- 非 Reactive 应用。
- 
org.springframework.cloud:spring-cloud-starter-circuitbreaker-reactor-resilience4j- Reactive (响应式)应用。
1.1.2. 自动配置
你可以通过将 spring.cloud.circuitbreaker.resilience4j.enabled 设置为 false 来禁用 Resilience4J 的自动配置。
1.1.3. 默认配置
为了给所有的 circuit breakers(熔断器)提供一个默认的配置,创建一个 Customizer bean,它被传递给 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());
}
Reactive 示例
@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());
}
自定义 ExecutorService
如果你想配置执行 circuit breaker 的 ExecutorService,你可以使用 Resilience4JCircuitBreakerFactor 进行配置。
例如,如果你想使用一个 context 感知的 ExecutorService,你可以这样做。
@Bean
public Customizer<ReactiveResilience4JCircuitBreakerFactory> defaultCustomizer() {
    return factory -> {
        ContextAwareScheduledThreadPoolExecutor executor = ContextAwareScheduledThreadPoolExecutor.newScheduledThreadPool().corePoolSize(5)
            .build();
        factory.configureExecutorService(executor);
    };
}
1.1.4. 特定的 Circuit Breaker 配置
与提供默认配置类似,你可以创建一个 Customizer bean,它被传递给 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");
}
除了配置被创建的 circuit breaker 外,你还可以在 circuit breaker 被创建后但被返回给调用者之前对其进行自定义。要做到这一点,你可以使用 addCircuitBreakerCustomizer 方法。这对于向 Resilience4J circuit breaker 添加 event handler 很有用。
@Bean
public Customizer<Resilience4JCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.addCircuitBreakerCustomizer(circuitBreaker -> circuitBreaker.getEventPublisher()
    .onError(normalFluxErrorConsumer).onSuccess(normalFluxSuccessConsumer), "normalflux");
}
Reactive 示例
@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. Circuit Breaker Properties 配置
你可以在你的应用程序的配置 properties 文件中配置 CircuitBreaker 和 TimeLimiter 的配置或实例。属性配置比 Java Customizer 配置具有更高的优先级。
从上到下的优先级递减。
- 
Method(id) 配置 - 具体方法或操作上 
- 
Service(group) 配置 - 特定的应用服务或操作上 
- 
全局默认配置 
ReactiveResilience4JCircuitBreakerFactory.create(String id, String groupName)
Resilience4JCircuitBreakerFactory.create(String id, String groupName)
全局默认 Properties 配置
resilience4j.circuitbreaker:
    configs:
        default:
            registerHealthIndicator: true
            slidingWindowSize: 50
resilience4j.timelimiter:
    configs:
        default:
            timeoutDuration: 5s
            cancelRunningFuture: true配置 Properties 配置
resilience4j.circuitbreaker:
    configs:
        groupA:
            registerHealthIndicator: true
            slidingWindowSize: 200
resilience4j.timelimiter:
    configs:
        groupC:
            timeoutDuration: 3s
            cancelRunningFuture: true实例 Properties 配置
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- 
ReactiveResilience4JCircuitBreakerFactory.create("backendA")或Resilience4JCircuitBreakerFactory.create("backendA")会应用instances backendA properties
- 
ReactiveResilience4JCircuitBreakerFactory.create("backendA", "groupA")或Resilience4JCircuitBreakerFactory.create("backendA", "groupA")会应用instances backendA properties
- 
ReactiveResilience4JCircuitBreakerFactory.create("backendC")或Resilience4JCircuitBreakerFactory.create("backendC")会应用global default properties
- 
ReactiveResilience4JCircuitBreakerFactory.create("backendC", "groupC")或Resilience4JCircuitBreakerFactory.create("backendC", "groupC")会应用global default CircuitBreaker properties and config groupC TimeLimiter properties
关于 Resilience4j 属性配置的更多信息,见 Resilience4J Spring Boot 2 配置 。
1.1.6. Bulkhead pattern 支持
如果 classpath 上有 resilience4j-bulkhead,Spring Cloud CircuitBreaker 将用 Resilience4j Bulkhead 来包装所有方法。你可以通过设置 spring.cloud.circuitbreaker.bulkhead.resilience4j.enabled 为 false 来禁用 Resilience4j Bulkhead。
Spring Cloud CircuitBreaker Resilience4j 提供了两种 bulkhead pattern 的实现:
- 
使用 Semaphores 的 SemaphoreBulkhead。
- 
一个 FixedThreadPoolBulkhead,它使用一个有界队列和一个固定的线程池。
默认情况下,Spring Cloud CircuitBreaker Resilience4j 使用 FixedThreadPoolBulkhead。要修改默认行为以使用 SemaphoreBulkhead,请将属性 spring.cloud.circuitbreaker.resilience4j.enableSemaphoreDefaultBulkhead 设为 true。
关于实现 Bulkhead pattern 的更多信息,见 Resilience4j Bulkhead。
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 配置
同样地,为了提供一个默认的 'Bulkhead' 或 'ThreadPoolBulkhead' 配置,你可以创建一个 Customizer Bean,它被传递给 Resilience4jBulkheadProvider。
@Bean
public Customizer<Resilience4jBulkheadProvider> slowBulkheadProviderCustomizer() {
    return provider -> provider.configure(builder -> builder
        .bulkheadConfig(BulkheadConfig.custom().maxConcurrentCalls(1).build())
        .threadPoolBulkheadConfig(ThreadPoolBulkheadConfig.ofDefaults()), "slowBulkhead");
}
除了配置被创建的 Bulkhead 外,你还可以在 Bulkhead 和线程池 Bulkhead 被创建后但被返回给调用者之前对其进行自定义。要做到这一点,你可以使用 addBulkheadCustomizer 和 addThreadPoolBulkheadCustomizer 方法。
Bulkhead 示例
@Bean
public Customizer<Resilience4jBulkheadProvider> customizer() {
    return provider -> provider.addBulkheadCustomizer(bulkhead -> bulkhead.getEventPublisher()
        .onCallRejected(slowRejectedConsumer)
        .onCallFinished(slowFinishedConsumer), "slowBulkhead");
}
线程池 Bulkhead 示例
@Bean
public Customizer<Resilience4jBulkheadProvider> slowThreadPoolBulkheadCustomizer() {
    return provider -> provider.addThreadPoolBulkheadCustomizer(threadPoolBulkhead -> threadPoolBulkhead.getEventPublisher()
        .onCallRejected(slowThreadPoolRejectedConsumer)
        .onCallFinished(slowThreadPoolFinishedConsumer), "slowThreadPoolBulkhead");
}
1.1.8. Bulkhead Properties 配置
你可以在应用程序的配置 properties 文件中配置 ThreadPoolBulkhead 和 SemaphoreBulkhead 实例。属性配置比 Java 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 Circuit Breaker Resilience4j 包含自动配置功能,只要 classpath上 有正确的依赖项,就可以设置指标收集。要启用指标收集,你必须包括 org.springframework.boot:spring-boot-starter-actuator,以及 io.github.resilience4j:resilience4j-micrometer。关于存在这些依赖时产生的指标的更多信息,请参阅 Resilience4j 文档。
| 你不必直接包括 micrometer-core,因为它是由spring-boot-starter-actuator引入的。 | 
1.2. 配置 Spring Retry Circuit Breakers
Spring Retry为Spring应用程序提供声明式重试支持。这个项目的一个子集包括实现 circuit breaker 功能的能力。Spring Retry 通过它的 CircuitBreakerRetryPolicy 和 stateful retry 的组合来提供 circuit breaker 的实现。所有使用 Spring Retry 创建的 circuit breaker 都将使用 CircuitBreakerRetryPolicy 和 DefaultRetryState 创建。这两个类都可以使用 SpringRetryConfigBuilder 进行配置。
1.2.1. 默认配置
为了给所有的 circuit breaker 提供一个默认的配置,创建一个 Customizer bean,它被传递给 SpringRetryCircuitBreakerFactory。configureDefault 方法可以用来提供一个默认配置。
@Bean
public Customizer<SpringRetryCircuitBreakerFactory> defaultCustomizer() {
    return factory -> factory.configureDefault(id -> new SpringRetryConfigBuilder(id)
        .retryPolicy(new TimeoutRetryPolicy()).build());
}
1.2.2. 特定的 Circuit Breaker 配置
与提供默认配置类似,你可以创建一个 Customizer bean,它被传递给 SpringRetryCircuitBreakerFactory。
@Bean
public Customizer<SpringRetryCircuitBreakerFactory> slowCustomizer() {
    return factory -> factory.configure(builder -> builder.retryPolicy(new SimpleRetryPolicy(1)).build(), "slow");
}
除了配置被创建的 circuit breaker 外,你还可以在 circuit breaker 被创建后但被返回给调用者之前对其进行自定义。要做到这一点,你可以使用 addRetryTemplateCustomizers 方法。这对于向 RetryTemplate 添加 event handler 很有用。
@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),运行 mvn命令来代替下面例子中的./mvnw。如果你这样做,如果你的本地Maven设置不包含 spring 预发布 artifact 的 repository 声明,你可能还需要添加-P spring。 | 
| 请注意,您可能需要通过设置 MAVEN_OPTS环境变量,如-Xmx512m -XX:MaxPermSize=128m来增加Maven的可用内存。我们试图在.mvn配置中涵盖这一点,所以如果你发现你必须这样做才能使构建成功,请提出一个raise,将设置添加到 source control 中。 | 
需要中间件(如,Redis)进行测试的项目一般需要安装和运行 Docker 的本地实例。
2.2. 文档
spring-cloud-build 模块有一个 "docs" profile,如果你打开它,它将尝试从 src/main/asciidoc 构建 asciidoc 源。作为该过程的一部分,它将寻找 README.adoc,并通过加载所有内容来处理它,但不对其进行解析或渲染,只是将其复制到 ${main.basedir}(默认为 $C:\Users\KevinBlandy\Desktop\springdoc\spring-cloud-circuitbreaker-doc\docs,即项目的根目录)。如果README有任何改动,在Maven构建后就会以修改过的文件出现在正确位置。提交并推送修改内容即可。
2.3. 使用代码工作
如果你没有IDE的偏好,我们建议你在处理代码时使用 Spring Tools Suite 或 Eclipse。我们使用 m2eclipse eclipse插件来支持maven。其他IDE和工具只要使用Maven 3.3.3或更高版本,也应能顺利工作。
2.3.1. 激活 Spring Maven profile
Spring Cloud 项目需要激活 "spring" Maven profile,以解决spring里程碑和快照库的问题。使用你喜欢的IDE将该 profile 设置为 active 状态,否则你可能会遇到构建错误。
2.3.2. 用 m2eclipse 导入到 eclipse 中
在使用eclipse时,我们推荐使用 m2eclipse eclipse插件。如果你还没有安装m2eclipse,它可以从 "eclipse marketplace" 获得。
| 旧版本的m2e不支持Maven 3.3,所以一旦项目被导入Eclipse,你还需要告诉m2eclipse为项目使用正确的profile。如果你看到项目中与POMs有关的许多不同的错误,请检查你是否有一个最新的安装。如果你不能升级m2e,把 "spring" profile加入你的 settings.xml。或者你可以从父pom的 "spring" profile 中复制版本库设置到你的settings.xml中。 | 
2.3.3. 在没有 m2eclipse 的情况下导入 eclipse 中
如果你不愿意使用 m2eclipse,你可以用以下命令生成 eclipse 项目元数据。
$ ./mvnw eclipse:eclipse
生成的 eclipse 项目可以通过在 file 菜单中选择 import existing projects 来导入。
3. 贡献
Spring Cloud在非限制性的Apache 2.0许可下发布,并遵循非常标准的Github开发流程,使用Github tracker 处理 issue,并将 pull request 合并到 master。如果你想做出贡献,哪怕是一些微不足道的事情,请不要犹豫,但要遵循以下准则。
3.1. 签署贡献者许可协议
在我们接受一个补丁或 pull request 之前,我们需要你签署 贡献者许可协议。签署贡献者协议并不授予任何人对主仓库的提交权,但这意味着我们可以接受你的贡献,如果我们接受你的贡献,你将获得作者的荣誉。积极的贡献者可能会被要求加入核心团队,并被赋予合并 pull request 的能力。
3.2. 行为准则
本项目遵守 《贡献者公约》 的行为准则。通过参与,你被期望维护这一准则。请将不可接受的行为报告给 spring-code-of-conduct@pivotal.io 。
3.3. 准则公约和内部管理
这些都不是 pull request 的必要条件,但它们都会有帮助。它们也可以在原始 pull request 之后、合并之前添加。
- 
使用Spring框架的代码格式约定。如果你使用Eclipse,你可以使用 Spring Cloud Build 项目中的 eclipse-code-formatter.xml文件导入格式化设置。如果使用IntelliJ,你可以使用 Eclipse Code Formatter Plugin 来导入相同的文件。
- 
确保所有新的 .java文件都有一个简单的 Javadoc 类注释,至少有一个@author的标签来标识你,最好至少有一段关于类的用途。
- 
在所有新的 .java文件中添加ASF license header 注释(从项目中的现有文件中复制)。
- 
在你大量修改的 .java文件中加入自己作为@author(不仅仅是外观上的修改)。
- 
添加一些 Javadocs,如果你改变了命名空间,则添加一些XSD doc元素。 
- 
一些单元测试也会有很大的帮助—总得有人来做。 
- 
如果没有人在使用你的分支,请将其与当前的主干分支(或主项目中的其他目标分支)重新建立基线。 
- 
在写提交信息时,请遵循 这些惯例,如果你要修复一个现有的问题,请在提交信息的末尾加上 Fixes gh-XXXX(其中XXXX是 issue 编号)。
3.4. 检查风格(Checkstyle)
Spring Cloud Build自带一套检查风格(checkstyle)的规则。你可以在 spring-cloud-build-tools 模块中找到它们。该模块下最值得注意的文件是。
└── src ├── checkstyle │ └── checkstyle-suppressions.xml (3) └── main └── resources ├── checkstyle-header.txt (2) └── checkstyle.xml (1)
| 1 | 默认的检查风格规则 | 
| 2 | 文件头设置 | 
| 3 | 默认的 suppression 规则 | 
3.4.1. Checkstyle 配置
Checkstyle 规则默认是禁用的。要在你的项目中添加 checkstyle,只需定义以下属性和插件。
<properties>
<maven-checkstyle-plugin.failsOnError>true</maven-checkstyle-plugin.failsOnError> (1)
        <maven-checkstyle-plugin.failsOnViolation>true
        </maven-checkstyle-plugin.failsOnViolation> (2)
        <maven-checkstyle-plugin.includeTestSourceDirectory>true
        </maven-checkstyle-plugin.includeTestSourceDirectory> (3)
</properties>
<build>
        <plugins>
            <plugin> (4)
                <groupId>io.spring.javaformat</groupId>
                <artifactId>spring-javaformat-maven-plugin</artifactId>
            </plugin>
            <plugin> (5)
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
            </plugin>
        </plugins>
    <reporting>
        <plugins>
            <plugin> (5)
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-checkstyle-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>
</build>
| 1 | 构建时出现 Checkstyle error 而失败 | 
| 2 | 违反Checkstyle规定时,不合格。 | 
| 3 | Checkstyle还分析了test sources | 
| 4 | 添加Spring Java Format 插件,它将重新格式化你的代码,以通过大多数Checkstyle格式化规则。 | 
| 5 | 在你的构建和报告阶段添加checkstyle插件 | 
如果你需要抑制某些规则(例如,行长需要更长),那么你只需在 ${project.root}/src/checkstyle/checkstyle-suppressions.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>
建议将 ${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 .springformat3.5. IDE设置
3.5.1. Intellij IDEA
为了设置Intellij,你应该导入我们的编码惯例、检查配置文件并设置checkstyle插件。在 Spring Cloud Build 项目中可以找到以下文件。
└── src ├── checkstyle │ └── checkstyle-suppressions.xml (3) └── main └── resources ├── checkstyle-header.txt (2) ├── checkstyle.xml (1) └── intellij ├── Intellij_Project_Defaults.xml (4) └── Intellij_Spring_Boot_Java_Conventions.xml (5)
| 1 | 默认的Checkstyle规则 | 
| 2 | 文件头的设置 | 
| 3 | 默认的 suppression 规则 | 
| 4 | Intellij的项目默认值,适用于大多数Checkstyle规则 | 
| 5 | 适用于Intellij的项目风格惯例,适用于大多数Checkstyle规则 | 
 
进入 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 文件。
 
进入 File → Settings → Editor → Inspections。在那里点击 Profile 部分旁边的图标。在那里,点击 Import Profile 并导入 spring-cloud-build-tools/src/main/resources/intellij/Intellij_Project_Defaults.xml 文件。
为了让Intellij与Checkstyle一起工作,你必须安装 Checkstyle 插件。建议同时安装 Assertions2Assertj 来自动转换JUnit断言。
 
进入 File → Settings → Other settings → Checkstyle。在那里点击 Configuration file 部分的 + 图标。在那里,你必须定义检查风格规则应该从哪里提取。在上图中,我们从克隆的Spring Cloud Build资源库中挑选规则。不过,你也可以指向Spring Cloud Build的GitHub仓库(例如,对于 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的,spring-cloud-build-tools/src/main/resources/checkstyle-header.txt文件,无论是在你克隆的 repo 中还是通过raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/main/resources/checkstyle-header.txtURL。
- 
checkstyle.suppressions.file- 默认的 suppression 措施。请将其指向Spring Cloud Build的,spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xml文件,无论是在你克隆的 repo中还是通过raw.githubusercontent.com/spring-cloud/spring-cloud-build/master/spring-cloud-build-tools/src/checkstyle/checkstyle-suppressions.xmlURL。
- 
checkstyle.additional.suppressions.file- 这个变量对应于你本地项目中的suppression。例如,你在spring-cloud-contract上工作。然后指向project-root/src/checkstyle/checkstyle-suppressions.xml`文件夹。 `spring-cloud-contract的例子是。/home/username/spring-cloud-contract/src/checkstyle/checkstyle-suppressions.xml。
| 记住将扫描范围设置为所有来源,因为我们对生产和测试来源应用检查式规则。 | 
3.6. Duplicate Finder(重复搜索器)
Spring Cloud Build带来了 basepom:duplicate-finder-maven-plugin,它可以标记java classpath上重复和冲突的类和资源。
3.6.1. Duplicate Finder 配置
Duplicate finder 默认是启用的,会在Maven构建的 verify 阶段运行,但只有当你在项目的pom.xml build 部分添加了 duplicate-finder-maven-plugin,它才会在项目中生效。
<build>
    <plugins>
        <plugin>
            <groupId>org.basepom.maven</groupId>
            <artifactId>duplicate-finder-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>对于其他属性,我们已经设置了 插件文档 中列出的默认值。
你可以通过设置以 double-finder-maven-plugin 为前缀的选定属性的值来轻松覆盖它们。例如,将 double-finder-maven-plugin.skip 设为 true,以便在构建中跳过重复检查。
如果你需要在你的设置中添加 ignoredClassPatterns 或 ignoredResourcePatterns,请确保在你项目的 plugin configuration 部分添加它们。
<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>