From 629bdee3d8b6cd708203a0d5632c01a1a0d52f31 Mon Sep 17 00:00:00 2001 From: fishtailfu Date: Thu, 19 Jun 2025 21:37:58 +0800 Subject: [PATCH] feat: support the shortest response time loadbalancer --- ...estResponseTimeLoadBalancerProperties.java | 23 +++++++++++++++ .../PolarisLoadBalancerAutoConfiguration.java | 12 ++++++-- ...esponseTimeLoadBalancerConfigModifier.java | 28 +++++++++++++++++++ ...itional-spring-configuration-metadata.json | 6 ++++ 4 files changed, 67 insertions(+), 2 deletions(-) create mode 100644 spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolairsShortestResponseTimeLoadBalancerProperties.java create mode 100644 spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerConfigModifier.java diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolairsShortestResponseTimeLoadBalancerProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolairsShortestResponseTimeLoadBalancerProperties.java new file mode 100644 index 000000000..af9ab01c5 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolairsShortestResponseTimeLoadBalancerProperties.java @@ -0,0 +1,23 @@ +package com.tencent.cloud.polaris.loadbalancer; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties(prefix = "spring.cloud.polaris.loadbalancer") +public class PolairsShortestResponseTimeLoadBalancerProperties { + /** + * Slide period in milliseconds. + */ + @Value("${spring.cloud.polaris.loadbalancer.polarisShortestResponseTime.slidePeriod:30000}") + private long slidePeriod; + + long getSlidePeriod() { + return slidePeriod; + } + + void setSlidePeriod(long slidePeriod) { + this.slidePeriod = slidePeriod; + } + + +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java index ee78ea5a6..500551b2e 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerAutoConfiguration.java @@ -18,13 +18,17 @@ package com.tencent.cloud.polaris.loadbalancer; import com.tencent.cloud.polaris.context.ConditionalOnPolarisEnabled; +import com.tencent.cloud.rpc.enhancement.stat.config.PolarisStatProperties; +import com.tencent.cloud.rpc.enhancement.stat.config.StatConfigModifier; import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; import org.springframework.cloud.loadbalancer.annotation.LoadBalancerClients; import org.springframework.cloud.loadbalancer.config.LoadBalancerAutoConfiguration; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; /** @@ -33,12 +37,16 @@ import org.springframework.context.annotation.Configuration; * @author Haotian Zhang */ @Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties +@EnableConfigurationProperties(PolairsShortestResponseTimeLoadBalancerProperties.class) @ConditionalOnDiscoveryEnabled @ConditionalOnPolarisEnabled @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true) @AutoConfigureAfter(LoadBalancerAutoConfiguration.class) @LoadBalancerClients(defaultConfiguration = PolarisLoadBalancerClientConfiguration.class) public class PolarisLoadBalancerAutoConfiguration { - + @Bean + @ConditionalOnMissingBean + public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolairsShortestResponseTimeLoadBalancerProperties polairsShortestResponseTimeLoadBalancerProperties) { + return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polairsShortestResponseTimeLoadBalancerProperties); + } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerConfigModifier.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerConfigModifier.java new file mode 100644 index 000000000..74888a526 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerConfigModifier.java @@ -0,0 +1,28 @@ +package com.tencent.cloud.polaris.loadbalancer; + +import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.factory.config.ConfigurationImpl; +import com.tencent.polaris.plugins.loadbalancer.shortestresponsetime.ShortestResponseTimeLoadBalanceConfig; + + +public class PolarisShortestResponseTimeLoadBalancerConfigModifier implements PolarisConfigModifier { + + private final PolairsShortestResponseTimeLoadBalancerProperties polairsShortestResponseTimeLoadBalancerProperties; + + public PolarisShortestResponseTimeLoadBalancerConfigModifier( + PolairsShortestResponseTimeLoadBalancerProperties polairsShortestResponseTimeLoadBalancerProperties) { + this.polairsShortestResponseTimeLoadBalancerProperties = polairsShortestResponseTimeLoadBalancerProperties; + } + @Override + public void modify(ConfigurationImpl configuration) { + ShortestResponseTimeLoadBalanceConfig config = new ShortestResponseTimeLoadBalanceConfig(); + config.setSlidePeriod(polairsShortestResponseTimeLoadBalancerProperties.getSlidePeriod()); + configuration.getConsumer().getLoadbalancer().setPluginConfig("shortestResponseTime", + config); + } + + @Override + public int getOrder() { + return 0; + } +} diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json b/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json index 17f6d13af..dd56bffd2 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/resources/META-INF/additional-spring-configuration-metadata.json @@ -164,6 +164,12 @@ "type": "java.lang.String", "defaultValue": "roundRobin", "description": "loadbalancer strategy." + }, + { + "name": "spring.cloud.polaris.loadbalancer.polarisShortestResponseTime.slidePeriod", + "type": "java.lang.Long", + "defaultValue": 30000, + "description": "The length of the average response time calculation window for instances in milliseconds. The default is 30000 milliseconds." } ], "hints": [