Skip to content

Commit 38b9e4c

Browse files
feat:support default instance circuit breaker rule. (#1506)
1 parent fa23f65 commit 38b9e4c

File tree

6 files changed

+197
-3
lines changed

6 files changed

+197
-3
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,4 @@
5050
- [feat:support circuit breaker metrics reporting.](https://github.com/Tencent/spring-cloud-tencent/pull/1503)
5151
- [feat: support gateway context, feign eager-load support default value.](https://github.com/Tencent/spring-cloud-tencent/pull/1504)
5252
- [feat:use polaris-all for shading third-party dependencies.](https://github.com/Tencent/spring-cloud-tencent/pull/1505)
53+
- [feat:support default instance circuit breaker rule.](https://github.com/Tencent/spring-cloud-tencent/pull/1506)

spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/common/CircuitBreakerConfigModifier.java

+17-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package com.tencent.cloud.polaris.circuitbreaker.common;
1919

2020
import com.tencent.cloud.common.constant.OrderConstant;
21+
import com.tencent.cloud.polaris.circuitbreaker.config.PolarisCircuitBreakerProperties;
2122
import com.tencent.cloud.polaris.context.PolarisConfigModifier;
2223
import com.tencent.cloud.rpc.enhancement.config.RpcEnhancementReporterProperties;
2324
import com.tencent.polaris.api.config.consumer.ServiceRouterConfig;
@@ -33,8 +34,12 @@ public class CircuitBreakerConfigModifier implements PolarisConfigModifier {
3334

3435
private final RpcEnhancementReporterProperties properties;
3536

36-
public CircuitBreakerConfigModifier(RpcEnhancementReporterProperties properties) {
37+
private final PolarisCircuitBreakerProperties polarisCircuitBreakerProperties;
38+
39+
public CircuitBreakerConfigModifier(RpcEnhancementReporterProperties properties,
40+
PolarisCircuitBreakerProperties polarisCircuitBreakerProperties) {
3741
this.properties = properties;
42+
this.polarisCircuitBreakerProperties = polarisCircuitBreakerProperties;
3843
}
3944

4045
@Override
@@ -53,6 +58,17 @@ public void modify(ConfigurationImpl configuration) {
5358
// Update modified config to source properties
5459
configuration.getConsumer().getServiceRouter()
5560
.setPluginConfig(ServiceRouterConfig.DEFAULT_ROUTER_RECOVER, recoverRouterConfig);
61+
62+
configuration.getConsumer().getCircuitBreaker()
63+
.setDefaultRuleEnable(polarisCircuitBreakerProperties.isDefaultRuleEnabled());
64+
configuration.getConsumer().getCircuitBreaker()
65+
.setDefaultErrorCount(polarisCircuitBreakerProperties.getDefaultErrorCount());
66+
configuration.getConsumer().getCircuitBreaker()
67+
.setDefaultErrorPercent(polarisCircuitBreakerProperties.getDefaultErrorPercent());
68+
configuration.getConsumer().getCircuitBreaker()
69+
.setDefaultInterval(polarisCircuitBreakerProperties.getDefaultInterval());
70+
configuration.getConsumer().getCircuitBreaker()
71+
.setDefaultMinimumRequest(polarisCircuitBreakerProperties.getDefaultMinimumRequest());
5672
}
5773

5874
@Override

spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerAutoConfiguration.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -87,8 +87,9 @@ public CircuitBreakerFactory polarisCircuitBreakerFactory(PolarisSDKContextManag
8787

8888
@Bean
8989
@ConditionalOnMissingBean(CircuitBreakerConfigModifier.class)
90-
public CircuitBreakerConfigModifier circuitBreakerConfigModifier(RpcEnhancementReporterProperties properties) {
91-
return new CircuitBreakerConfigModifier(properties);
90+
public CircuitBreakerConfigModifier circuitBreakerConfigModifier(RpcEnhancementReporterProperties properties,
91+
PolarisCircuitBreakerProperties polarisCircuitBreakerProperties) {
92+
return new CircuitBreakerConfigModifier(properties, polarisCircuitBreakerProperties);
9293
}
9394

9495
@Bean

spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/java/com/tencent/cloud/polaris/circuitbreaker/config/PolarisCircuitBreakerProperties.java

+78
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,31 @@ public class PolarisCircuitBreakerProperties {
3939
@Value("${spring.cloud.polaris.circuitbreaker.configuration-cleanup-interval:#{300000}}")
4040
private long configurationCleanupInterval = 300000;
4141

42+
/**
43+
* If default circuit breaker rule is enabled. Default is true.
44+
*/
45+
private boolean defaultRuleEnabled = true;
46+
47+
/**
48+
* Consecutive error count circuit-breaker default error count. Default is 10.
49+
*/
50+
private int defaultErrorCount = 10;
51+
52+
/**
53+
* Error rate circuit-breaker default error rate percent. Default is 50.
54+
*/
55+
private int defaultErrorPercent = 50;
56+
57+
/**
58+
* Error rate circuit-breaker default interval(ms). Default is 60000.
59+
*/
60+
private int defaultInterval = 60000;
61+
62+
/**
63+
* Error rate circuit-breaker default minimum request. Default is 10.
64+
*/
65+
private int defaultMinimumRequest = 10;
66+
4267
public boolean isEnabled() {
4368
return enabled;
4469
}
@@ -54,4 +79,57 @@ public long getConfigurationCleanupInterval() {
5479
public void setConfigurationCleanupInterval(long configurationCleanupInterval) {
5580
this.configurationCleanupInterval = configurationCleanupInterval;
5681
}
82+
83+
public boolean isDefaultRuleEnabled() {
84+
return defaultRuleEnabled;
85+
}
86+
87+
public void setDefaultRuleEnabled(boolean defaultRuleEnabled) {
88+
this.defaultRuleEnabled = defaultRuleEnabled;
89+
}
90+
91+
public int getDefaultErrorCount() {
92+
return defaultErrorCount;
93+
}
94+
95+
public void setDefaultErrorCount(int defaultErrorCount) {
96+
this.defaultErrorCount = defaultErrorCount;
97+
}
98+
99+
public int getDefaultErrorPercent() {
100+
return defaultErrorPercent;
101+
}
102+
103+
public void setDefaultErrorPercent(int defaultErrorPercent) {
104+
this.defaultErrorPercent = defaultErrorPercent;
105+
}
106+
107+
public int getDefaultInterval() {
108+
return defaultInterval;
109+
}
110+
111+
public void setDefaultInterval(int defaultInterval) {
112+
this.defaultInterval = defaultInterval;
113+
}
114+
115+
public int getDefaultMinimumRequest() {
116+
return defaultMinimumRequest;
117+
}
118+
119+
public void setDefaultMinimumRequest(int defaultMinimumRequest) {
120+
this.defaultMinimumRequest = defaultMinimumRequest;
121+
}
122+
123+
@Override
124+
public String toString() {
125+
return "PolarisCircuitBreakerProperties{" +
126+
"enabled=" + enabled +
127+
", configurationCleanupInterval=" + configurationCleanupInterval +
128+
", defaultRuleEnabled=" + defaultRuleEnabled +
129+
", defaultErrorCount=" + defaultErrorCount +
130+
", defaultErrorPercent=" + defaultErrorPercent +
131+
", defaultInterval=" + defaultInterval +
132+
", defaultMinimumRequest=" + defaultMinimumRequest +
133+
'}';
134+
}
57135
}

spring-cloud-starter-tencent-polaris-circuitbreaker/src/main/resources/META-INF/additional-spring-configuration-metadata.json

+30
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,36 @@
1111
"type": "java.lang.Long",
1212
"defaultValue": "300000",
1313
"description": "Interval to clean up PolarisCircuitBreakerConfiguration, unit millisecond."
14+
},
15+
{
16+
"name": "spring.cloud.polaris.circuitbreaker.default-rule-enabled",
17+
"type": "java.lang.Boolean",
18+
"defaultValue": "true",
19+
"description": "If default circuit breaker rule is enabled."
20+
},
21+
{
22+
"name": "spring.cloud.polaris.circuitbreaker.default-error-count",
23+
"type": "java.lang.Integer",
24+
"defaultValue": 10,
25+
"description": "Consecutive error count circuit-breaker default error count."
26+
},
27+
{
28+
"name": "spring.cloud.polaris.circuitbreaker.default-error-percent",
29+
"type": "java.lang.Integer",
30+
"defaultValue": 50,
31+
"description": "Error rate circuit-breaker default error rate percent."
32+
},
33+
{
34+
"name": "spring.cloud.polaris.circuitbreaker.default-interval",
35+
"type": "java.lang.Integer",
36+
"defaultValue": 60000,
37+
"description": "Error rate circuit-breaker default interval(ms)."
38+
},
39+
{
40+
"name": "spring.cloud.polaris.circuitbreaker.default-minimum-request",
41+
"type": "java.lang.Integer",
42+
"defaultValue": 10,
43+
"description": "Error rate circuit-breaker default minimum request."
1444
}
1545
],
1646
"hints": []
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
/*
2+
* Tencent is pleased to support the open source community by making spring-cloud-tencent available.
3+
*
4+
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
5+
*
6+
* Licensed under the BSD 3-Clause License (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* https://opensource.org/licenses/BSD-3-Clause
11+
*
12+
* Unless required by applicable law or agreed to in writing, software distributed
13+
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
14+
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
15+
* specific language governing permissions and limitations under the License.
16+
*/
17+
18+
package com.tencent.cloud.polaris.circuitbreaker.config;
19+
20+
import org.junit.jupiter.api.Test;
21+
22+
import org.springframework.boot.autoconfigure.AutoConfigurations;
23+
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
24+
import org.springframework.boot.context.properties.EnableConfigurationProperties;
25+
import org.springframework.boot.test.context.runner.ApplicationContextRunner;
26+
import org.springframework.context.annotation.Configuration;
27+
28+
import static org.assertj.core.api.Assertions.assertThat;
29+
30+
/**
31+
* Test for {@link PolarisCircuitBreakerProperties}.
32+
*
33+
* @author Haotian Zhang
34+
*/
35+
public class PolarisCircuitBreakerPropertiesTest {
36+
37+
private final ApplicationContextRunner contextRunner = new ApplicationContextRunner()
38+
.withConfiguration(AutoConfigurations.of(TestApplication.TestConfig.class))
39+
.withPropertyValues("spring.cloud.polaris.circuitbreaker.enabled=true")
40+
.withPropertyValues("spring.cloud.polaris.circuitbreaker.default-rule-enabled=false")
41+
.withPropertyValues("spring.cloud.polaris.circuitbreaker.default-error-count=1")
42+
.withPropertyValues("spring.cloud.polaris.circuitbreaker.default-error-percent=2")
43+
.withPropertyValues("spring.cloud.polaris.circuitbreaker.default-interval=3")
44+
.withPropertyValues("spring.cloud.polaris.circuitbreaker.default-minimum-request=4");
45+
46+
@Test
47+
public void testDefaultInitialization() {
48+
this.contextRunner.run(context -> {
49+
assertThat(context).hasSingleBean(PolarisCircuitBreakerProperties.class);
50+
PolarisCircuitBreakerProperties polarisCircuitBreakerProperties = context.getBean(PolarisCircuitBreakerProperties.class);
51+
assertThat(polarisCircuitBreakerProperties.isDefaultRuleEnabled()).isFalse();
52+
assertThat(polarisCircuitBreakerProperties.getDefaultErrorCount()).isEqualTo(1);
53+
assertThat(polarisCircuitBreakerProperties.getDefaultErrorPercent()).isEqualTo(2);
54+
assertThat(polarisCircuitBreakerProperties.getDefaultInterval()).isEqualTo(3);
55+
assertThat(polarisCircuitBreakerProperties.getDefaultMinimumRequest()).isEqualTo(4);
56+
});
57+
}
58+
59+
@EnableAutoConfiguration
60+
protected static class TestApplication {
61+
62+
@Configuration
63+
@EnableConfigurationProperties(PolarisCircuitBreakerProperties.class)
64+
protected static class TestConfig {
65+
66+
}
67+
}
68+
}

0 commit comments

Comments
 (0)