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 @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public PolarisShortestResponseTimeLoadBalancerConfigModifier polarisShortestResponseTimeLoadBalancerConfigModifier(PolarisLoadBalancerProperties polarisLoadBalancerProperties) { 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. * Shortest response time load balancer.
*/ */
public PolarisShortestResponseTime polarisShortestResponseTime = new PolarisShortestResponseTime(); public ShortestResponseTime shortestResponseTime = new ShortestResponseTime();
PolarisShortestResponseTime getPolarisShortestResponseTime() { ShortestResponseTime getShortestResponseTime() {
return polarisShortestResponseTime; return shortestResponseTime;
} }
void setPolarisShortestResponseTime(PolarisShortestResponseTime polarisShortestResponseTime) { void setShortestResponseTime(ShortestResponseTime shortestResponseTime) {
this.polarisShortestResponseTime = polarisShortestResponseTime; this.shortestResponseTime = shortestResponseTime;
} }
@Override @Override
public String toString() { public String toString() {
return "PolarisLoadBalancerProperties{" + return "PolarisLoadBalancerProperties{" +
"polarisShortestResponseTime=" + polarisShortestResponseTime + "shortestResponseTime=" + shortestResponseTime +
'}'; '}';
} }
public static class PolarisShortestResponseTime { public static class ShortestResponseTime {
/** /**
* Slide period in milliseconds. Default is 30s. * Slide period in milliseconds. Default is 30s.
*/ */
@ -58,7 +58,7 @@ public class PolarisLoadBalancerProperties {
@Override @Override
public String toString() { public String toString() {
return "PolarisShortestResponseTime{" + return "ShortestResponseTime{" +
"slidePeriod=" + slidePeriod + "slidePeriod=" + slidePeriod +
'}'; '}';
} }

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

@ -160,13 +160,13 @@
"description": "polaris loadbalancer." "description": "polaris loadbalancer."
}, },
{ {
"name": "spring.cloud.polaris.loadbalancer.strategy", "name": "spring.cloud.loadbalancer.strategy",
"type": "java.lang.String", "type": "java.lang.String",
"defaultValue": "roundRobin", "defaultValue": "roundRobin",
"description": "loadbalancer strategy." "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", "type": "java.lang.Long",
"defaultValue": 30000, "defaultValue": 30000,
"description": "The length of the average response time calculation window for instances in milliseconds. The default is 30000 milliseconds." "description": "The length of the average response time calculation window for instances in milliseconds. The default is 30000 milliseconds."
@ -174,7 +174,7 @@
], ],
"hints": [ "hints": [
{ {
"name": "spring.cloud.polaris.loadbalancer.strategy", "name": "spring.cloud.loadbalancer.strategy",
"values": [ "values": [
{ {
"value": "roundRobin", "value": "roundRobin",

@ -1,7 +1,7 @@
/* /*
* Tencent is pleased to support the open source community by making spring-cloud-tencent available. * 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"); * Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with 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)); when(routerAPI.processLoadBalance(any())).thenThrow(new PolarisException(ErrorCode.API_TIMEOUT));
// request construct and execute invoke // request construct and execute invoke
PolarisShortestResponseTimeLoadBalancer polarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI); PolarisLeastConnectionLoadBalancer polarisLeastConnectionLoadBalancer = new PolarisLeastConnectionLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisShortestResponseTimeLoadBalancer.choose(request); Mono<Response<ServiceInstance>> responseMono = polarisLeastConnectionLoadBalancer.choose(request);
ServiceInstance serviceInstance = responseMono.block().getServer(); ServiceInstance serviceInstance = responseMono.block().getServer();
// verify method has invoked // verify method has invoked
@ -161,8 +161,8 @@ public class PolarisLeastConnectionLoadBalancerTest {
when(supplierObjectProvider.getIfAvailable(any())).thenReturn(noopSupplier); when(supplierObjectProvider.getIfAvailable(any())).thenReturn(noopSupplier);
// request construct and execute invoke // request construct and execute invoke
PolarisShortestResponseTimeLoadBalancer polarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI); PolarisLeastConnectionLoadBalancer polarisLeastConnectionLoadBalancer = new PolarisLeastConnectionLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisShortestResponseTimeLoadBalancer.choose(); Mono<Response<ServiceInstance>> responseMono = polarisLeastConnectionLoadBalancer.choose();
ServiceInstance serviceInstance = responseMono.block().getServer(); ServiceInstance serviceInstance = responseMono.block().getServer();
//result assert //result assert

@ -1,7 +1,7 @@
/* /*
* Tencent is pleased to support the open source community by making spring-cloud-tencent available. * 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"); * Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with 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); when(routerAPI.processLoadBalance(any())).thenReturn(mockLbRes);
// request construct and execute invoke // request construct and execute invoke
PolarisShortestResponseTimeLoadBalancer polarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI); PolarisShortestResponseTimeLoadBalancer PolarisShortestResponseTimeLoadBalancer = new PolarisShortestResponseTimeLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI);
Mono<Response<ServiceInstance>> responseMono = polarisShortestResponseTimeLoadBalancer.choose(request); Mono<Response<ServiceInstance>> responseMono = PolarisShortestResponseTimeLoadBalancer.choose(request);
ServiceInstance serviceInstance = responseMono.block().getServer(); ServiceInstance serviceInstance = responseMono.block().getServer();
// verify method has invoked // verify method has invoked

@ -116,7 +116,7 @@ public class PolarisWeightedRandomLoadBalancerAutoConfigurationTest {
@Test @Test
public void testPolarisShortestResponseTimeInitialization() { public void testPolarisShortestResponseTimeInitialization() {
this.contextRunner 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); assertThat(context).hasSingleBean(RestTemplate.class);
assertThatThrownBy(() -> { assertThatThrownBy(() -> {
context.getBean(RestTemplate.class).getForEntity("http://wrong.url", String.class); context.getBean(RestTemplate.class).getForEntity("http://wrong.url", String.class);

@ -134,7 +134,7 @@ public class EnhancedRestTemplateWrapInterceptor {
enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis); enhancedPluginContext.setDelay(System.currentTimeMillis() - startMillis);
enhancedPluginContext.setThrowable(e); enhancedPluginContext.setThrowable(e);
enhancedPluginContext.setTargetServiceInstance((ServiceInstance) MetadataContextHolder.get() 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. // Run exception enhanced plugins.
pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext); pluginRunner.run(EnhancedPluginType.Client.EXCEPTION, enhancedPluginContext);
throw e; throw e;

Loading…
Cancel
Save