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 c851430f0..4733e5afa 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 @@ -35,7 +35,7 @@ import org.springframework.context.annotation.Configuration; * @author Haotian Zhang */ @Configuration(proxyBeanMethods = false) -@EnableConfigurationProperties(PolarisShortestResponseTimeLoadBalancerProperties.class) +@EnableConfigurationProperties(PolarisLoadBalancerProperties.class) @ConditionalOnDiscoveryEnabled @ConditionalOnPolarisEnabled @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true) @@ -44,7 +44,7 @@ import org.springframework.context.annotation.Configuration; public class PolarisLoadBalancerAutoConfiguration { @Bean @ConditionalOnMissingBean - public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolarisShortestResponseTimeLoadBalancerProperties polarisShortestResponseTimeLoadBalancerProperties) { - return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polarisShortestResponseTimeLoadBalancerProperties); + public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolarisLoadBalancerProperties polarisLoadBalancerProperties) { + return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polarisLoadBalancerProperties.polarisShortestResponseTime); } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java index 6d0bef826..eb9fe0470 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java @@ -22,7 +22,6 @@ import com.tencent.cloud.polaris.context.PolarisSDKContextManager; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cloud.client.ConditionalOnBlockingDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled; @@ -99,24 +98,27 @@ public class PolarisLoadBalancerClientConfiguration { return new PolarisRingHashLoadBalancer(name, loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); } + @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisShortestResponseTime") + @Conditional(PolarisShortestResponseTimeStrategyCondition.class) public ReactorLoadBalancer polarisShortestResponseTimeLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new PolarisShortestResponseTimeLoadBalancer(name, loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); } + @Bean @ConditionalOnMissingBean - @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisLeastConnection") + @Conditional(PolarisLeastConnectionStrategyCondition.class) public ReactorLoadBalancer polarisLeastConnectionLoadBalancer(Environment environment, LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new PolarisLeastConnectionLoadBalancer(name, loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); } + @Bean @ConditionalOnMissingBean @Conditional(DefaultStrategyCondition.class) @@ -127,7 +129,6 @@ public class PolarisLoadBalancerClientConfiguration { loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); } - @Configuration(proxyBeanMethods = false) @ConditionalOnReactiveDiscoveryEnabled @Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER) @@ -168,6 +169,24 @@ public class PolarisLoadBalancerClientConfiguration { } } + static class PolarisShortestResponseTimeStrategyCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return LoadBalancerEnvironmentPropertyUtils.equalToOrMissingForClientOrDefault(context.getEnvironment(), + "strategies", "polarisShortestResponseTime"); + } + } + + static class PolarisLeastConnectionStrategyCondition implements Condition { + + @Override + public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) { + return LoadBalancerEnvironmentPropertyUtils.equalToOrMissingForClientOrDefault(context.getEnvironment(), + "strategies", "polarisLeastConnection"); + } + } + static class PolarisWeightedRandomStrategyCondition implements Condition { @Override diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerProperties.java new file mode 100644 index 000000000..9502604c9 --- /dev/null +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerProperties.java @@ -0,0 +1,66 @@ +/* + * 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.loadbalancer; + +import org.springframework.boot.context.properties.ConfigurationProperties; + +@ConfigurationProperties("spring.cloud.polaris.loadbalancer") +public class PolarisLoadBalancerProperties { + + /** + * Shortest response time load balancer. + */ + public PolarisShortestResponseTime polarisShortestResponseTime = new PolarisShortestResponseTime(); + + PolarisShortestResponseTime getPolarisShortestResponseTime() { + return polarisShortestResponseTime; + } + + void setPolarisShortestResponseTime(PolarisShortestResponseTime polarisShortestResponseTime) { + this.polarisShortestResponseTime = polarisShortestResponseTime; + } + + @Override + public String toString() { + return "PolarisLoadBalancerProperties{" + + "polarisShortestResponseTime=" + polarisShortestResponseTime + + '}'; + } + + public static class PolarisShortestResponseTime { + /** + * Slide period in milliseconds. Default is 30s. + */ + private long slidePeriod = 30000; + + long getSlidePeriod() { + return slidePeriod; + } + + void setSlidePeriod(long slidePeriod) { + this.slidePeriod = slidePeriod; + } + + @Override + public String toString() { + return "PolarisShortestResponseTime{" + + "slidePeriod=" + slidePeriod + + '}'; + } + } +} 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 index 3dacebd62..860ca8f89 100644 --- 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 @@ -17,29 +17,33 @@ package com.tencent.cloud.polaris.loadbalancer; +import com.tencent.cloud.common.constant.OrderConstant; import com.tencent.cloud.polaris.context.PolarisConfigModifier; +import com.tencent.polaris.api.config.consumer.LoadBalanceConfig; import com.tencent.polaris.factory.config.ConfigurationImpl; import com.tencent.polaris.plugins.loadbalancer.shortestresponsetime.ShortestResponseTimeLoadBalanceConfig; public class PolarisShortestResponseTimeLoadBalancerConfigModifier implements PolarisConfigModifier { - private final PolarisShortestResponseTimeLoadBalancerProperties polarisShortestResponseTimeLoadBalancerProperties; + private final PolarisLoadBalancerProperties.PolarisShortestResponseTime polarisShortestResponseTime; public PolarisShortestResponseTimeLoadBalancerConfigModifier( - PolarisShortestResponseTimeLoadBalancerProperties polarisShortestResponseTimeLoadBalancerProperties) { - this.polarisShortestResponseTimeLoadBalancerProperties = polarisShortestResponseTimeLoadBalancerProperties; + PolarisLoadBalancerProperties.PolarisShortestResponseTime polarisShortestResponseTime) { + this.polarisShortestResponseTime = polarisShortestResponseTime; } + @Override public void modify(ConfigurationImpl configuration) { ShortestResponseTimeLoadBalanceConfig config = new ShortestResponseTimeLoadBalanceConfig(); - config.setSlidePeriod(polarisShortestResponseTimeLoadBalancerProperties.getSlidePeriod()); - configuration.getConsumer().getLoadbalancer().setPluginConfig("shortestResponseTime", - config); + config.setSlidePeriod(polarisShortestResponseTime.getSlidePeriod()); + configuration.getConsumer().getLoadbalancer() + .setPluginConfig(LoadBalanceConfig.LOAD_BALANCE_SHORTEST_RESPONSE_TIME, + config); } @Override public int getOrder() { - return Integer.MAX_VALUE; + return OrderConstant.Modifier.LOAD_BALANCER_CONFIG_ORDER; } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerProperties.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerProperties.java deleted file mode 100644 index 52e719ae4..000000000 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisShortestResponseTimeLoadBalancerProperties.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * 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.loadbalancer; - -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.properties.ConfigurationProperties; - -@ConfigurationProperties(prefix = "spring.cloud.polaris.loadbalancer") -public class PolarisShortestResponseTimeLoadBalancerProperties { - /** - * Slide period in milliseconds. - */ - @Value("${spring.cloud.polaris.loadbalancer.polaris-shortest-response-time.slide-period:30000}") - private long slidePeriod; - - long getSlidePeriod() { - return slidePeriod; - } - - void setSlidePeriod(long slidePeriod) { - this.slidePeriod = slidePeriod; - } - -} diff --git a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java index 8eb0edf8f..2da3cbbe1 100644 --- a/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java +++ b/spring-cloud-tencent-commons/src/main/java/com/tencent/cloud/common/constant/OrderConstant.java @@ -187,6 +187,11 @@ public class OrderConstant { */ public static Integer STAT_REPORTER_ORDER = 1; + /** + * Load Balancer config modifier order. + */ + public static Integer LOAD_BALANCER_CONFIG_ORDER = 2; + /** * Order of lossless configuration modifier. */