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
*/
@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);
}
}

@ -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<ServiceInstance> 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<ServiceInstance> 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

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

@ -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;
/**
* Load Balancer config modifier order.
*/
public static Integer LOAD_BALANCER_CONFIG_ORDER = 2;
/**
* Order of lossless configuration modifier.
*/

Loading…
Cancel
Save