diff --git a/CHANGELOG.md b/CHANGELOG.md index 573cea5c3..ccb77dc41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,3 +6,4 @@ - [feat:support circuit breaker metrics reporting.](https://github.com/Tencent/spring-cloud-tencent/pull/1495) - [feat: support gateway context, feign eager-load support default value.](https://github.com/Tencent/spring-cloud-tencent/pull/1496) - [feat:use polaris-all for shading third-party dependencies.](https://github.com/Tencent/spring-cloud-tencent/pull/1498) +- [feat:support default instance circuit breaker rule.](https://github.com/Tencent/spring-cloud-tencent/pull/1499) diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/common/CircuitBreakerConfigModifier.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/common/CircuitBreakerConfigModifier.java index 4e24acf12..3bce4bab8 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/common/CircuitBreakerConfigModifier.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/common/CircuitBreakerConfigModifier.java @@ -18,6 +18,7 @@ package com.tencent.cloud.polaris.circuitbreaker.common; import com.tencent.cloud.common.constant.OrderConstant; +import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties; import com.tencent.cloud.polaris.context.PolarisConfigModifier; import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties; import com.tencent.polaris.api.config.consumer.ServiceRouterConfig; @@ -33,8 +34,12 @@ public class CircuitBreakerConfigModifier implements PolarisConfigModifier { private final RpcEnhancementReporterProperties properties; - public CircuitBreakerConfigModifier(RpcEnhancementReporterProperties properties) { + private final PolarisCircuitBreakerProperties polarisCircuitBreakerProperties; + + public CircuitBreakerConfigModifier(RpcEnhancementReporterProperties properties, + PolarisCircuitBreakerProperties polarisCircuitBreakerProperties) { this.properties = properties; + this.polarisCircuitBreakerProperties = polarisCircuitBreakerProperties; } @Override @@ -53,6 +58,17 @@ public class CircuitBreakerConfigModifier implements PolarisConfigModifier { // Update modified config to source properties configuration.getConsumer().getServiceRouter() .setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, recoverRouterConfig); + + configuration.getConsumer().getCircuitBreaker() + .setDefaultRuleEnable(polarisCircuitBreakerProperties.isDefaultRuleEnabled()); + configuration.getConsumer().getCircuitBreaker() + .setDefaultErrorCount(polarisCircuitBreakerProperties.getDefaultErrorCount()); + configuration.getConsumer().getCircuitBreaker() + .setDefaultErrorPercent(polarisCircuitBreakerProperties.getDefaultErrorPercent()); + configuration.getConsumer().getCircuitBreaker() + .setDefaultInterval(polarisCircuitBreakerProperties.getDefaultInterval()); + configuration.getConsumer().getCircuitBreaker() + .setDefaultMinimumRequest(polarisCircuitBreakerProperties.getDefaultMinimumRequest()); } @Override diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java index 5d0f8c965..e7c0ef40d 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java @@ -87,8 +87,9 @@ public class PolarisCircuitBreakerAutoConfiguration { @Bean @ConditionalOnMissingBean(CircuitBreakerConfigModifier.class) - public CircuitBreakerConfigModifier circuitBreakerConfigModifier(RpcEnhancementReporterProperties properties) { - return new CircuitBreakerConfigModifier(properties); + public CircuitBreakerConfigModifier circuitBreakerConfigModifier(RpcEnhancementReporterProperties properties, + PolarisCircuitBreakerProperties polarisCircuitBreakerProperties) { + return new CircuitBreakerConfigModifier(properties, polarisCircuitBreakerProperties); } @Bean diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java index d78d56fb9..efc29f4b8 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java @@ -39,6 +39,31 @@ public class PolarisCircuitBreakerProperties { @Value("${spring.cloud.polaris.circuitbreaker.configuration-cleanup-interval:#{300000}}") private long configurationCleanupInterval = 300000; + /** + * If default circuit breaker rule is enabled. Default is true. + */ + private boolean defaultRuleEnabled = true; + + /** + * Consecutive error count circuit-breaker default error count. Default is 10. + */ + private int defaultErrorCount = 10; + + /** + * Error rate circuit-breaker default error rate percent. Default is 50. + */ + private int defaultErrorPercent = 50; + + /** + * Error rate circuit-breaker default interval(ms). Default is 60000. + */ + private int defaultInterval = 60000; + + /** + * Error rate circuit-breaker default minimum request. Default is 10. + */ + private int defaultMinimumRequest = 10; + public boolean isEnabled() { return enabled; } @@ -54,4 +79,57 @@ public class PolarisCircuitBreakerProperties { public void setConfigurationCleanupInterval(long configurationCleanupInterval) { this.configurationCleanupInterval = configurationCleanupInterval; } + + public boolean isDefaultRuleEnabled() { + return defaultRuleEnabled; + } + + public void setDefaultRuleEnabled(boolean defaultRuleEnabled) { + this.defaultRuleEnabled = defaultRuleEnabled; + } + + public int getDefaultErrorCount() { + return defaultErrorCount; + } + + public void setDefaultErrorCount(int defaultErrorCount) { + this.defaultErrorCount = defaultErrorCount; + } + + public int getDefaultErrorPercent() { + return defaultErrorPercent; + } + + public void setDefaultErrorPercent(int defaultErrorPercent) { + this.defaultErrorPercent = defaultErrorPercent; + } + + public int getDefaultInterval() { + return defaultInterval; + } + + public void setDefaultInterval(int defaultInterval) { + this.defaultInterval = defaultInterval; + } + + public int getDefaultMinimumRequest() { + return defaultMinimumRequest; + } + + public void setDefaultMinimumRequest(int defaultMinimumRequest) { + this.defaultMinimumRequest = defaultMinimumRequest; + } + + @Override + public String toString() { + return "PolarisCircuitBreakerProperties{" + + "enabled=" + enabled + + ", configurationCleanupInterval=" + configurationCleanupInterval + + ", defaultRuleEnabled=" + defaultRuleEnabled + + ", defaultErrorCount=" + defaultErrorCount + + ", defaultErrorPercent=" + defaultErrorPercent + + ", defaultInterval=" + defaultInterval + + ", defaultMinimumRequest=" + defaultMinimumRequest + + '}'; + } } diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 2f222b999..e3f55af7a 100644 --- a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -11,6 +11,36 @@ "type": "java.lang.Long", "defaultValue": "300000", "description": "Interval to clean up PolarisCircuitBreakerConfiguration, unit millisecond." + }, + { + "name": "spring.cloud.polaris.circuitbreaker.default-rule-enabled", + "type": "java.lang.Boolean", + "defaultValue": "true", + "description": "If default circuit breaker rule is enabled." + }, + { + "name": "spring.cloud.polaris.circuitbreaker.default-error-count", + "type": "java.lang.Integer", + "defaultValue": 10, + "description": "Consecutive error count circuit-breaker default error count." + }, + { + "name": "spring.cloud.polaris.circuitbreaker.default-error-percent", + "type": "java.lang.Integer", + "defaultValue": 50, + "description": "Error rate circuit-breaker default error rate percent." + }, + { + "name": "spring.cloud.polaris.circuitbreaker.default-interval", + "type": "java.lang.Integer", + "defaultValue": 60000, + "description": "Error rate circuit-breaker default interval(ms)." + }, + { + "name": "spring.cloud.polaris.circuitbreaker.default-minimum-request", + "type": "java.lang.Integer", + "defaultValue": 10, + "description": "Error rate circuit-breaker default minimum request." } ], "hints": [] diff --git a/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerPropertiesTest.java b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerPropertiesTest.java new file mode 100644 index 000000000..293958f49 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-circuitbreaker/src/test/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerPropertiesTest.java @@ -0,0 +1,68 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved. + * + * Licensed under the BSD 3-Clause License (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://opensource.org/licenses/BSD-3-Clause + * + * Unless required by applicable law or agreed to in writing, software distributed + * under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR + * CONDITIONS OF ANY KIND, either express or implied. See the License for the + * specific language governing permissions and limitations under the License. + */ + +package com.tencent.cloud.polaris.circuitbreaker.config; + +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; +import org.springframework.context.annotation.Configuration; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Test for {@link PolarisCircuitBreakerProperties}. + * + * @author Haotian Zhang + */ +public class PolarisCircuitBreakerPropertiesTest { + + private final ApplicationContextRunner contextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(TestApplication.TestConfig.class)) + .withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true") + .withPropertyValues("spring.cloud.polaris.circuitbreaker.default-rule-enabled=false") + .withPropertyValues("spring.cloud.polaris.circuitbreaker.default-error-count=1") + .withPropertyValues("spring.cloud.polaris.circuitbreaker.default-error-percent=2") + .withPropertyValues("spring.cloud.polaris.circuitbreaker.default-interval=3") + .withPropertyValues("spring.cloud.polaris.circuitbreaker.default-minimum-request=4"); + + @Test + public void testDefaultInitialization() { + this.contextRunner.run(context -> { + assertThat(context).hasSingleBean(PolarisCircuitBreakerProperties.class); + PolarisCircuitBreakerProperties polarisCircuitBreakerProperties = context.getBean(PolarisCircuitBreakerProperties.class); + assertThat(polarisCircuitBreakerProperties.isDefaultRuleEnabled()).isFalse(); + assertThat(polarisCircuitBreakerProperties.getDefaultErrorCount()).isEqualTo(1); + assertThat(polarisCircuitBreakerProperties.getDefaultErrorPercent()).isEqualTo(2); + assertThat(polarisCircuitBreakerProperties.getDefaultInterval()).isEqualTo(3); + assertThat(polarisCircuitBreakerProperties.getDefaultMinimumRequest()).isEqualTo(4); + }); + } + + @EnableAutoConfiguration + protected static class TestApplication { + + @Configuration + @EnableConfigurationProperties(PolarisCircuitBreakerProperties.class) + protected static class TestConfig { + + } + } +}