feat: support shortest response time lb and least connection loadbalancer

pull/1637/head
fishtailfu 2 months ago
parent c17a590bc1
commit b040d0c2f9

@ -45,6 +45,6 @@ public class PolarisLoadBalancerAutoConfiguration {
@Bean
@ConditionalOnMissingBean
public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolarisLoadBalancerProperties polarisLoadBalancerProperties) {
return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polarisLoadBalancerProperties.polarisShortestResponseTime);
return new PolarisShortestResponseTimeLoadBalancerConfigModifier(polarisLoadBalancerProperties.shortestResponseTime);
}
}

@ -25,24 +25,24 @@ public class PolarisLoadBalancerProperties {
/**
* Shortest response time load balancer.
*/
public PolarisShortestResponseTime polarisShortestResponseTime = new PolarisShortestResponseTime();
public ShortestResponseTime shortestResponseTime = new ShortestResponseTime();
PolarisShortestResponseTime getPolarisShortestResponseTime() {
return polarisShortestResponseTime;
ShortestResponseTime getShortestResponseTime() {
return shortestResponseTime;
}
void setPolarisShortestResponseTime(PolarisShortestResponseTime polarisShortestResponseTime) {
this.polarisShortestResponseTime = polarisShortestResponseTime;
void setShortestResponseTime(ShortestResponseTime shortestResponseTime) {
this.shortestResponseTime = shortestResponseTime;
}
@Override
public String toString() {
return "PolarisLoadBalancerProperties{" +
"polarisShortestResponseTime=" + polarisShortestResponseTime +
"shortestResponseTime=" + shortestResponseTime +
'}';
}
public static class PolarisShortestResponseTime {
public static class ShortestResponseTime {
/**
* Slide period in milliseconds. Default is 30s.
*/
@ -58,7 +58,7 @@ public class PolarisLoadBalancerProperties {
@Override
public String toString() {
return "PolarisShortestResponseTime{" +
return "ShortestResponseTime{" +
"slidePeriod=" + slidePeriod +
'}';
}

@ -26,17 +26,17 @@ import com.tencent.polaris.plugins.loadbalancer.shortestresponsetime.ShortestRes
public class PolarisShortestResponseTimeLoadBalancerConfigModifier implements PolarisConfigModifier {
private final PolarisLoadBalancerProperties.PolarisShortestResponseTime polarisShortestResponseTime;
private final PolarisLoadBalancerProperties.ShortestResponseTime shortestResponseTime;
public PolarisShortestResponseTimeLoadBalancerConfigModifier(
PolarisLoadBalancerProperties.PolarisShortestResponseTime polarisShortestResponseTime) {
this.polarisShortestResponseTime = polarisShortestResponseTime;
PolarisLoadBalancerProperties.ShortestResponseTime shortestResponseTime) {
this.shortestResponseTime = shortestResponseTime;
}
@Override
public void modify(ConfigurationImpl configuration) {
ShortestResponseTimeLoadBalanceConfig config = new ShortestResponseTimeLoadBalanceConfig();
config.setSlidePeriod(polarisShortestResponseTime.getSlidePeriod());
config.setSlidePeriod(shortestResponseTime.getSlidePeriod());
configuration.getConsumer().getLoadbalancer()
.setPluginConfig(LoadBalanceConfig.LOAD_BALANCE_SHORTEST_RESPONSE_TIME,
config);

@ -160,13 +160,13 @@
"description": "polaris loadbalancer."
},
{
"name": "spring.cloud.polaris.loadbalancer.strategy",
"name": "spring.cloud.loadbalancer.strategy",
"type": "java.lang.String",
"defaultValue": "roundRobin",
"description": "loadbalancer strategy."
},
{
"name": "spring.cloud.polaris.loadbalancer.polaris-shortest-response-time.slide-period",
"name": "spring.cloud.polaris.loadbalancer.shortest-response-time.slide-period",
"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."
@ -174,7 +174,7 @@
],
"hints": [
{
"name": "spring.cloud.polaris.loadbalancer.strategy",
"name": "spring.cloud.loadbalancer.strategy",
"values": [
{
"value": "roundRobin",

@ -1,7 +1,7 @@
/*
* Tencent is pleased to support the open source community by making spring-cloud-tencent available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
* 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.
@ -144,8 +144,8 @@ public class PolarisLeastConnectionLoadBalancerTest {
when(routerAPI.processLoadBalance(any())).thenThrow(new PolarisException(ErrorCode.API_TIMEOUT));
// request construct and execute invoke
PolarisShortestResponseTimeLoadBalancer polarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisShortestResponseTimeLoadBalancer.choose(request);
PolarisLeastConnectionLoadBalancer polarisLeastConnectionLoadBalancer = new PolarisLeastConnectionLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisLeastConnectionLoadBalancer.choose(request);
ServiceInstance serviceInstance = responseMono.block().getServer();
// verify method has invoked
@ -161,8 +161,8 @@ public class PolarisLeastConnectionLoadBalancerTest {
when(supplierObjectProvider.getIfAvailable(any())).thenReturn(noopSupplier);
// request construct and execute invoke
PolarisShortestResponseTimeLoadBalancer polarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisShortestResponseTimeLoadBalancer.choose();
PolarisLeastConnectionLoadBalancer polarisLeastConnectionLoadBalancer = new PolarisLeastConnectionLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisLeastConnectionLoadBalancer.choose();
ServiceInstance serviceInstance = responseMono.block().getServer();
//result assert

@ -1,7 +1,7 @@
/*
* Tencent is pleased to support the open source community by making spring-cloud-tencent available.
*
* Copyright (C) 2021 THL A29 Limited, a Tencent company. All rights reserved.
* 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.
@ -109,8 +109,8 @@ public class PolarisShortestResponseTimeLoadBalancerTest {
when(routerAPI.processLoadBalance(any())).thenReturn(mockLbRes);
// request construct and execute invoke
PolarisShortestResponseTimeLoadBalancer polarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisShortestResponseTimeLoadBalancer.choose(request);
PolarisShortestResponseTimeLoadBalancer PolarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = PolarisShortestResponseTimeLoadBalancer.choose(request);
ServiceInstance serviceInstance = responseMono.block().getServer();
// verify method has invoked

@ -116,7 +116,7 @@ public class PolarisWeightedRandomLoadBalancerAutoConfigurationTest {
@Test
public void testPolarisShortestResponseTimeInitialization() {
this.contextRunner
.withPropertyValues("spring.cloud.polaris.loadbalancer.strategy=polarisShortestResponseTime").run(context -> {
.withPropertyValues("spring.cloud.polaris.loadbalancer.strategy=shortestResponseTime").run(context -> {
assertThat(context).hasSingleBean(RestTemplate.class);
assertThatThrownBy(() -> {
context.getBean(RestTemplate.class).getForEntity("http://wrong.url", String.class);

@ -134,7 +134,7 @@ public class EnhancedRestTemplateWrapInterceptor {
enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis);
enhancedPluginContext.setThrowable(e);
enhancedPluginContext.setTargetServiceInstance((ServiceInstance) MetadataContextHolder.get()
.getLoadbalancerMetadata().get(LOAD_BALANCER_SERVICE_INSTANCE), request.getURI());
.getLoadbalancerMetadata().get(LOAD_BALANCER_SERVICE_INSTANCE), httpRequest.getURI());
// Run exception enhanced plugins.
pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext);
throw e;

Loading…
Cancel
Save