feat: support shortest response time lb and least connection loadbalancer

pull/1637/head
fishtailfu 2 months ago
parent efdce646b8
commit acf5bc2ba0

@ -35,7 +35,7 @@ import org.springframework.context.annotation.Configuration;
* @author Haotian Zhang * @author Haotian Zhang
*/ */
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(PolarisShortestResponseTimeLoadBalancerProperties.class) @EnableConfigurationProperties(PolarisLoadBalancerProperties.class)
@ConditionalOnDiscoveryEnabled @ConditionalOnDiscoveryEnabled
@ConditionalOnPolarisEnabled @ConditionalOnPolarisEnabled
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true) @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.enabled", matchIfMissing = true)
@ -44,7 +44,7 @@ import org.springframework.context.annotation.Configuration;
public class PolarisLoadBalancerAutoConfiguration { public class PolarisLoadBalancerAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolarisShortestResponseTimeLoadBalancerProperties polarisShortestResponseTimeLoadBalancerProperties) { public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolarisLoadBalancerProperties polarisLoadBalancerProperties) {
return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polarisShortestResponseTimeLoadBalancerProperties); return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polarisLoadBalancerProperties.polarisShortestResponseTime);
} }
} }

@ -22,7 +22,6 @@ import com.tencent.cloud.polaris.context.PolarisSDKContextManager;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 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.ConditionalOnBlockingDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnDiscoveryEnabled;
import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled; import org.springframework.cloud.client.ConditionalOnReactiveDiscoveryEnabled;
@ -99,24 +98,27 @@ public class PolarisLoadBalancerClientConfiguration {
return new PolarisRingHashLoadBalancer(name, return new PolarisRingHashLoadBalancer(name,
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI());
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisShortestResponseTime") @Conditional(PolarisShortestResponseTimeStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> polarisShortestResponseTimeLoadBalancer(Environment environment, public ReactorLoadBalancer<ServiceInstance> polarisShortestResponseTimeLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) { LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new PolarisShortestResponseTimeLoadBalancer(name, return new PolarisShortestResponseTimeLoadBalancer(name,
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI());
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisLeastConnection") @Conditional(PolarisLeastConnectionStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> polarisLeastConnectionLoadBalancer(Environment environment, public ReactorLoadBalancer<ServiceInstance> polarisLeastConnectionLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) { LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
return new PolarisLeastConnectionLoadBalancer(name, return new PolarisLeastConnectionLoadBalancer(name,
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI());
} }
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
@Conditional(DefaultStrategyCondition.class) @Conditional(DefaultStrategyCondition.class)
@ -127,7 +129,6 @@ public class PolarisLoadBalancerClientConfiguration {
loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI()); loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), polarisSDKContextManager.getRouterAPI());
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnReactiveDiscoveryEnabled @ConditionalOnReactiveDiscoveryEnabled
@Order(REACTIVE_SERVICE_INSTANCE_SUPPLIER_ORDER) @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 { static class PolarisWeightedRandomStrategyCondition implements Condition {
@Override @Override

@ -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 +
'}';
}
}
}

@ -17,29 +17,33 @@
package com.tencent.cloud.polaris.loadbalancer; package com.tencent.cloud.polaris.loadbalancer;
import com.tencent.cloud.common.constant.OrderConstant;
import com.tencent.cloud.polaris.context.PolarisConfigModifier; 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.factory.config.ConfigurationImpl;
import com.tencent.polaris.plugins.loadbalancer.shortestresponsetime.ShortestResponseTimeLoadBalanceConfig; import com.tencent.polaris.plugins.loadbalancer.shortestresponsetime.ShortestResponseTimeLoadBalanceConfig;
public class PolarisShortestResponseTimeLoadBalancerConfigModifier implements PolarisConfigModifier { public class PolarisShortestResponseTimeLoadBalancerConfigModifier implements PolarisConfigModifier {
private final PolarisShortestResponseTimeLoadBalancerProperties polarisShortestResponseTimeLoadBalancerProperties; private final PolarisLoadBalancerProperties.PolarisShortestResponseTime polarisShortestResponseTime;
public PolarisShortestResponseTimeLoadBalancerConfigModifier( public PolarisShortestResponseTimeLoadBalancerConfigModifier(
PolarisShortestResponseTimeLoadBalancerProperties polarisShortestResponseTimeLoadBalancerProperties) { PolarisLoadBalancerProperties.PolarisShortestResponseTime polarisShortestResponseTime) {
this.polarisShortestResponseTimeLoadBalancerProperties = polarisShortestResponseTimeLoadBalancerProperties; this.polarisShortestResponseTime = polarisShortestResponseTime;
} }
@Override @Override
public void modify(ConfigurationImpl configuration) { public void modify(ConfigurationImpl configuration) {
ShortestResponseTimeLoadBalanceConfig config = new ShortestResponseTimeLoadBalanceConfig(); ShortestResponseTimeLoadBalanceConfig config = new ShortestResponseTimeLoadBalanceConfig();
config.setSlidePeriod(polarisShortestResponseTimeLoadBalancerProperties.getSlidePeriod()); config.setSlidePeriod(polarisShortestResponseTime.getSlidePeriod());
configuration.getConsumer().getLoadbalancer().setPluginConfig("shortestResponseTime", configuration.getConsumer().getLoadbalancer()
config); .setPluginConfig(LoadBalanceConfig.LOAD_BALANCE_SHORTEST_RESPONSE_TIME,
config);
} }
@Override @Override
public int getOrder() { public int getOrder() {
return Integer.MAX_VALUE; return OrderConstant.Modifier.LOAD_BALANCER_CONFIG_ORDER;
} }
} }

@ -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;
}
}

@ -187,6 +187,11 @@ public class OrderConstant {
*/ */
public static Integer STAT_REPORTER_ORDER = 1; 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. * Order of lossless configuration modifier.
*/ */

Loading…
Cancel
Save