From 5d607a40d34b92e5b5eb6a2e575a61d97550c625 Mon Sep 17 00:00:00 2001 From: seanyu Date: Thu, 13 Apr 2023 18:53:24 +0800 Subject: [PATCH] use threadlocal ringhash key provider --- ...olarisLoadBalancerClientConfiguration.java | 4 ++-- ...olarisLoadBalancerRingHashKeyProvider.java | 22 ++++++++++++++++--- .../PolarisRingHashLoadBalancer.java | 10 ++++----- .../PolarisRingHashLoadBalancerTest.java | 10 +-------- ...htedLoadBalancerAutoConfigurationTest.java | 9 -------- 5 files changed, 26 insertions(+), 29 deletions(-) diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java index 8a86bcdba..32231571e 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerClientConfiguration.java @@ -89,10 +89,10 @@ public class PolarisLoadBalancerClientConfiguration { @ConditionalOnMissingBean @ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisRingHash") public ReactorLoadBalancer polarisRingHashLoadBalancer(Environment environment, - LoadBalancerClientFactory loadBalancerClientFactory, RouterAPI routerAPI, PolarisLoadBalancerRingHashKeyProvider ringHashKeyProvider) { + LoadBalancerClientFactory loadBalancerClientFactory, RouterAPI routerAPI) { String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); return new PolarisRingHashLoadBalancer(name, - loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), routerAPI, ringHashKeyProvider); + loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), routerAPI); } @Configuration(proxyBeanMethods = false) diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java index abdb86a12..42a203cab 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisLoadBalancerRingHashKeyProvider.java @@ -22,8 +22,24 @@ package com.tencent.cloud.polaris.loadbalancer; * * @author seanthefish */ -public interface PolarisLoadBalancerRingHashKeyProvider { +public final class PolarisLoadBalancerRingHashKeyProvider { - String hashKey(); + private static final ThreadLocal hashKeys = new ThreadLocal<>(); -} + private PolarisLoadBalancerRingHashKeyProvider() { + } + + public static void hashKey(String key) { + hashKeys.set(key); + } + + static void remove() { + hashKeys.remove(); + } + + static String getHashKey() { + return hashKeys.get(); + } + + +} \ No newline at end of file diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancer.java b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancer.java index 64dfee2b0..ba770f072 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancer.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/main/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancer.java @@ -18,6 +18,7 @@ package com.tencent.cloud.polaris.loadbalancer; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import com.tencent.cloud.common.metadata.MetadataContext; @@ -60,16 +61,12 @@ public class PolarisRingHashLoadBalancer implements ReactorServiceInstanceLoadBa private ObjectProvider supplierObjectProvider; - private PolarisLoadBalancerRingHashKeyProvider ringHashKeyProvider; - public PolarisRingHashLoadBalancer(String serviceId, ObjectProvider supplierObjectProvider, - RouterAPI routerAPI, - PolarisLoadBalancerRingHashKeyProvider ringHashKeyProvider) { + RouterAPI routerAPI) { this.serviceId = serviceId; this.supplierObjectProvider = supplierObjectProvider; this.routerAPI = routerAPI; - this.ringHashKeyProvider = ringHashKeyProvider; } private static ServiceInstances convertToPolarisServiceInstances(List serviceInstances) { @@ -97,11 +94,12 @@ public class PolarisRingHashLoadBalancer implements ReactorServiceInstanceLoadBa request.setDstInstances(convertToPolarisServiceInstances(serviceInstances)); request.setLbPolicy(LoadBalanceConfig.LOAD_BALANCE_RING_HASH); Criteria criteria = new Criteria(); - criteria.setHashKey(ringHashKeyProvider.hashKey()); + criteria.setHashKey(Optional.ofNullable(PolarisLoadBalancerRingHashKeyProvider.getHashKey()).orElse("")); request.setCriteria(criteria); try { ProcessLoadBalanceResponse response = routerAPI.processLoadBalance(request); + PolarisLoadBalancerRingHashKeyProvider.remove(); return new DefaultResponse(new PolarisServiceInstance(response.getTargetInstance())); } catch (Exception e) { diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancerTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancerTest.java index e84820c72..723f8de1f 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancerTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisRingHashLoadBalancerTest.java @@ -96,7 +96,7 @@ public class PolarisRingHashLoadBalancerTest { when(routerAPI.processLoadBalance(any())).thenReturn(mockLbRes); // request construct and execute invoke - PolarisRingHashLoadBalancer polarisRingHashLoadBalancer = new PolarisRingHashLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI, new MockPolarisLoadBalancerRingHashKeyProvider()); + PolarisRingHashLoadBalancer polarisRingHashLoadBalancer = new PolarisRingHashLoadBalancer(LOCAL_SERVICE, supplierObjectProvider, routerAPI); Mono> responseMono = polarisRingHashLoadBalancer.choose(request); ServiceInstance serviceInstance = responseMono.block().getServer(); @@ -115,12 +115,4 @@ public class PolarisRingHashLoadBalancerTest { Assertions.assertThat(polarisServiceInstance.getPolarisInstance().getHost()).isEqualTo("host"); Assertions.assertThat(polarisServiceInstance.getPolarisInstance().getPort()).isEqualTo(8090); } - - class MockPolarisLoadBalancerRingHashKeyProvider implements PolarisLoadBalancerRingHashKeyProvider { - - @Override - public String hashKey() { - return "test"; - } - } } diff --git a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisWeightedLoadBalancerAutoConfigurationTest.java b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisWeightedLoadBalancerAutoConfigurationTest.java index 0531f73e7..191f22286 100644 --- a/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisWeightedLoadBalancerAutoConfigurationTest.java +++ b/spring-cloud-starter-tencent-polaris-discovery/src/test/java/com/tencent/cloud/polaris/loadbalancer/PolarisWeightedLoadBalancerAutoConfigurationTest.java @@ -89,7 +89,6 @@ public class PolarisWeightedLoadBalancerAutoConfigurationTest { @Test public void testPolarisRingHashInitialization() { this.contextRunner - .withBean(PolarisRibbonTest.MockPolarisLoadBalancerRingHashKeyProvider.class) .withPropertyValues("spring.cloud.polaris.loadbalancer.strategy=polarisRingHash").run(context -> { assertThat(context).hasSingleBean(RouterAPI.class); assertThat(context).hasSingleBean(RestTemplate.class); @@ -107,13 +106,5 @@ public class PolarisWeightedLoadBalancerAutoConfigurationTest { public RestTemplate restTemplate() { return new RestTemplate(); } - - class MockPolarisLoadBalancerRingHashKeyProvider implements PolarisLoadBalancerRingHashKeyProvider { - - @Override - public String hashKey() { - return "test"; - } - } } }