diff --git a/CHANGELOG.md b/CHANGELOG.md index 11e7a48a4..162f0f3a2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,3 +21,4 @@ - [feat: support config event and monitor address list.](https://github.com/Tencent/spring-cloud-tencent/pull/1692) - [feat:Modify the annotations.](https://github.com/Tencent/spring-cloud-tencent/pull/1693) - [fix: polaris.discovery.heartbeat.enabled not effective.](https://github.com/Tencent/spring-cloud-tencent/pull/1694) +- [feat: support config ratelimit addresses and remote task interval.](https://github.com/Tencent/spring-cloud-tencent/pull/1679) diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java index 46d742d76..95fd2dddc 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitProperties.java @@ -48,6 +48,18 @@ public class PolarisRateLimitProperties { */ private long maxQueuingTime = 1000L; + private String limiterAddresses; + + private long remoteTaskInterval = 30L; + + String getLimiterAddresses() { + return limiterAddresses; + } + + void setLimiterAddresses(String limiterAddresses) { + this.limiterAddresses = limiterAddresses; + } + public String getRejectRequestTips() { return rejectRequestTips; } @@ -79,4 +91,12 @@ public class PolarisRateLimitProperties { public void setMaxQueuingTime(long maxQueuingTime) { this.maxQueuingTime = maxQueuingTime; } + + public long getRemoteTaskInterval() { + return remoteTaskInterval; + } + + public void setRemoteTaskInterval(long remoteTaskInterval) { + this.remoteTaskInterval = remoteTaskInterval; + } } diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfigModifier.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfigModifier.java index 14b7bc799..04d347cda 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfigModifier.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/java/com/tencent/cloud/polaris/ratelimit/config/RateLimitConfigModifier.java @@ -18,6 +18,7 @@ package com.tencent.cloud.polaris.ratelimit.config; import com.tencent.cloud.common.constant.OrderConstant; +import com.tencent.cloud.common.util.AddressUtils; import com.tencent.cloud.polaris.context.PolarisConfigModifier; import com.tencent.polaris.factory.config.ConfigurationImpl; @@ -39,6 +40,9 @@ public class RateLimitConfigModifier implements PolarisConfigModifier { // Update MaxQueuingTime. configuration.getProvider().getRateLimit() .setMaxQueuingTime(polarisRateLimitProperties.getMaxQueuingTime()); + configuration.getProvider().getRateLimit() + .setLimiterAddresses(AddressUtils.parseHostPortList(polarisRateLimitProperties.getLimiterAddresses())); + configuration.getProvider().getRateLimit().setRemoteTaskIntervalMilli(polarisRateLimitProperties.getRemoteTaskInterval()); } @Override diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 34d80d038..9607ffbd4 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -29,6 +29,17 @@ "type": "java.lang.Long", "defaultValue": "1000", "description": "Max queuing time when using unirate." + }, + { + "name": "spring.cloud.polaris.ratelimit.limiterAddresses", + "type": "java.lang.String", + "description": "Remote limiter service addresses." + }, + { + "name": "spring.cloud.polaris.ratelimit.remoteTaskInterval", + "type": "java.lang.Long", + "defaultValue": "30", + "description": "Remote limiter service task base interval. Unit: ms." } ] } diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitConfigModifierTest.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitConfigModifierTest.java new file mode 100644 index 000000000..0acb4f5fd --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitConfigModifierTest.java @@ -0,0 +1,63 @@ +/* + * Tencent is pleased to support the open source community by making spring-cloud-tencent available. + * + * Copyright (C) 2021 Tencent. 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.ratelimit.config; + +import com.tencent.cloud.polaris.context.PolarisSDKContextManager; +import com.tencent.polaris.api.config.provider.RateLimitConfig; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import org.springframework.boot.autoconfigure.AutoConfigurations; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.test.context.runner.ApplicationContextRunner; + +import static org.assertj.core.api.Assertions.assertThat; + +public class PolarisRateLimitConfigModifierTest { + + private final ApplicationContextRunner applicationContextRunner = new ApplicationContextRunner() + .withConfiguration(AutoConfigurations.of(TestApplication.class)) + .withPropertyValues("spring.cloud.polaris.ratelimit.maxQueuingTime=500") + .withPropertyValues("spring.cloud.polaris.ratelimit.limiterAddresses=127.0.0.1:8080,127.0.0.1:8081") + .withPropertyValues("spring.cloud.polaris.ratelimit.remoteTaskInterval=50"); + + @BeforeEach + void setUp() { + PolarisSDKContextManager.innerDestroy(); + } + + @Test + public void testModify() { + this.applicationContextRunner.run(context -> { + PolarisSDKContextManager polarisSDKContextManager = context.getBean(PolarisSDKContextManager.class); + RateLimitConfig config = polarisSDKContextManager.getSDKContext(). + getConfig().getProvider().getRateLimit(); + assertThat(config.isEnable()).isTrue(); + assertThat(config.getLimiterAddresses().get(0)).isEqualTo("127.0.0.1:8080"); + assertThat(config.getLimiterAddresses().get(1)).isEqualTo("127.0.0.1:8081"); + assertThat(config.getMaxQueuingTime()).isEqualTo(500); + assertThat(config.getRemoteTaskIntervalMilli()).isEqualTo(50); + }); + } + + + @SpringBootApplication + protected static class TestApplication { + + } +} diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitPropertiesTest.java b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitPropertiesTest.java index 486843a3a..eb11c0cd4 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitPropertiesTest.java +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitPropertiesTest.java @@ -17,6 +17,9 @@ package com.tencent.cloud.polaris.ratelimit.config; +import java.util.List; + +import com.tencent.cloud.common.util.AddressUtils; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -48,6 +51,10 @@ public class PolarisRateLimitPropertiesTest { assertThat(polarisRateLimitProperties.getRejectRequestTipsFilePath()).isEqualTo("/index.html"); assertThat(polarisRateLimitProperties.getRejectHttpCode()).isEqualTo(419); assertThat(polarisRateLimitProperties.getMaxQueuingTime()).isEqualTo(500L); + assertThat(polarisRateLimitProperties.getRemoteTaskInterval()).isEqualTo(50L); + List limiterAddresses = AddressUtils.parseHostPortList(polarisRateLimitProperties.getLimiterAddresses()); + assertThat(limiterAddresses.get(0)).isEqualTo("127.0.0.1:8080"); + } @SpringBootApplication diff --git a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/resources/application-test.properties b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/resources/application-test.properties index 236bb29c1..864fb3c93 100644 --- a/spring-cloud-starter-tencent-polaris-ratelimit/src/test/resources/application-test.properties +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/resources/application-test.properties @@ -2,3 +2,5 @@ spring.cloud.polaris.ratelimit.rejectRequestTips=xxx spring.cloud.polaris.ratelimit.rejectRequestTipsFilePath=/index.html spring.cloud.polaris.ratelimit.rejectHttpCode=419 spring.cloud.polaris.ratelimit.maxQueuingTime=500 +spring.cloud.polaris.ratelimit.remoteTaskInterval=50 +spring.cloud.polaris.ratelimit.limiterAddresses=127.0.0.1:8080,127.0.0.1:8081