From 034c7e0094451308e245e9912b81d11e98198a03 Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Wed, 30 Jul 2025 20:59:59 +0800 Subject: [PATCH] feat: support config multi ratelimit address and remote task interval --- .../config/PolarisRateLimitProperties.java | 20 ++++++++ .../config/RateLimitConfigModifier.java | 4 ++ ...itional-spring-configuration-metadata.json | 11 +++++ .../PolarisRateLimitConfigModifierTest.java | 47 +++++++++++++++++++ .../PolarisRateLimitPropertiesTest.java | 7 +++ .../resources/application-test.properties | 2 + 6 files changed, 91 insertions(+) create mode 100644 spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitConfigModifierTest.java 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..7c3284502 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 @@ -17,6 +17,7 @@ package com.tencent.cloud.polaris.ratelimit.config; + import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.http.HttpStatus; @@ -47,6 +48,17 @@ public class PolarisRateLimitProperties { * Max queuing time when using unirate. */ 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..98a82fcde 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.util.List", + "description": "Remote limiter service addresses." + }, + { + "name": "spring.cloud.polaris.ratelimit.remoteTaskInterval", + "type": "java.lang.Long", + "defaultValue": "30", + "description": "Remote limiter service task base interval." } ] } 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..87ed1c680 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-ratelimit/src/test/java/com/tencent/cloud/polaris/ratelimit/config/PolarisRateLimitConfigModifierTest.java @@ -0,0 +1,47 @@ +package com.tencent.cloud.polaris.ratelimit.config; + +import com.tencent.cloud.polaris.context.PolarisSDKContextManager; +import com.tencent.cloud.polaris.context.config.PolarisContextAutoConfiguration; +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