feat:support setting load balancing strategy per service. (#1701)

pull/1702/head
Haotian Zhang 3 weeks ago committed by GitHub
parent abc2f22a3f
commit f6efae9282
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -9,3 +9,4 @@
- [fix: tsf related bugfixes](https://github.com/Tencent/spring-cloud-tencent/pull/1698)
- [fix: remove conflict dependencies management](https://github.com/Tencent/spring-cloud-tencent/pull/1699)
- [refactor: optimize log](https://github.com/Tencent/spring-cloud-tencent/pull/1700)
- [feat:support setting load balancing strategy per service.](https://github.com/Tencent/spring-cloud-tencent/pull/1701)

@ -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;
@ -34,11 +33,16 @@ import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.RoundRobinLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.cloud.loadbalancer.support.LoadBalancerEnvironmentPropertyUtils;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Condition;
import org.springframework.context.annotation.ConditionContext;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.Environment;
import org.springframework.core.type.AnnotatedTypeMetadata;
/**
* Configuration of loadbalancer client.
@ -57,7 +61,7 @@ public class PolarisLoadBalancerClientConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "roundRobin")
@Conditional(RoundRobinStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> roundRobinLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
@ -67,7 +71,7 @@ public class PolarisLoadBalancerClientConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "random")
@Conditional(RandomStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
@ -77,7 +81,7 @@ public class PolarisLoadBalancerClientConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisWeightedRandom")
@Conditional(PolarisWeightedRandomStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> polarisWeightedLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
@ -87,7 +91,7 @@ public class PolarisLoadBalancerClientConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisRingHash")
@Conditional(PolarisRingHashStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> polarisRingHashLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
@ -97,7 +101,7 @@ public class PolarisLoadBalancerClientConfiguration {
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisWeightedRoundRobin", matchIfMissing = true)
@Conditional(DefaultStrategyCondition.class)
public ReactorLoadBalancer<ServiceInstance> polarisWeightedRoundRobinLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory, PolarisSDKContextManager polarisSDKContextManager) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);
@ -135,4 +139,49 @@ public class PolarisLoadBalancerClientConfiguration {
ServiceInstanceListSupplier.builder().withBlockingDiscoveryClient().build(context));
}
}
static class DefaultStrategyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return LoadBalancerEnvironmentPropertyUtils.equalToOrMissingForClientOrDefault(context.getEnvironment(),
"strategies", "default");
}
}
static class PolarisWeightedRandomStrategyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return LoadBalancerEnvironmentPropertyUtils.equalToForClientOrDefault(context.getEnvironment(),
"strategies", "polarisWeightedRandom");
}
}
static class RoundRobinStrategyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return LoadBalancerEnvironmentPropertyUtils.equalToForClientOrDefault(context.getEnvironment(),
"strategies", "roundRobin");
}
}
static class RandomStrategyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return LoadBalancerEnvironmentPropertyUtils.equalToForClientOrDefault(context.getEnvironment(),
"strategies", "random");
}
}
static class PolarisRingHashStrategyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return LoadBalancerEnvironmentPropertyUtils.equalToForClientOrDefault(context.getEnvironment(),
"strategies", "polarisRingHash");
}
}
}

@ -225,4 +225,35 @@ public class QuickstartCallerController {
String path = "http://QuickstartCalleeService/quickstart/callee/test/" + num + "/echo";
return restTemplate.getForObject(path, String.class);
}
/**
* Get information of callee.
* @return information of callee
*/
@GetMapping("/rest-self")
public ResponseEntity<String> restSelf(@RequestHeader Map<String, String> headerMap) {
String url = "http://QuickstartCallerService/quickstart/caller/rest";
HttpHeaders headers = new HttpHeaders();
for (Map.Entry<String, String> entry : headerMap.entrySet()) {
if (StringUtils.isNotBlank(entry.getKey()) && StringUtils.isNotBlank(entry.getValue())
&& !entry.getKey().contains("sct-")
&& !entry.getKey().contains("SCT-")
&& !entry.getKey().contains("polaris-")
&& !entry.getKey().contains("POLARIS-")) {
headers.add(entry.getKey(), entry.getValue());
}
}
// 创建 HttpEntity 实例并传入 HttpHeaders
HttpEntity<String> entity = new HttpEntity<>(headers);
// 使用 exchange 方法发送 GET 请求,并获取响应
try {
return restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
}
catch (HttpClientErrorException | HttpServerErrorException httpClientErrorException) {
return new ResponseEntity<>(httpClientErrorException.getResponseBodyAsString(), httpClientErrorException.getStatusCode());
}
}
}

@ -6,6 +6,10 @@ spring:
config:
import: optional:polaris
cloud:
loadbalancer:
clients:
QuickstartCallerService:
strategies: random
polaris:
address: grpc://119.91.66.223:8091
namespace: default

Loading…
Cancel
Save