use threadlocal ringhash key provider

pull/966/head
seanyu 2 years ago
parent e46625d1b6
commit 8270c403a3

@ -89,10 +89,10 @@ public class PolarisLoadBalancerClientConfiguration {
@ConditionalOnMissingBean
@ConditionalOnProperty(value = "spring.cloud.polaris.loadbalancer.strategy", havingValue = "polarisRingHash")
public ReactorLoadBalancer<ServiceInstance> 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)

@ -22,8 +22,24 @@ package com.tencent.cloud.polaris.loadbalancer;
*
* @author seanthefish
*/
public interface PolarisLoadBalancerRingHashKeyProvider {
public final class PolarisLoadBalancerRingHashKeyProvider {
private static final ThreadLocal<String> 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();
}
String hashKey();
}

@ -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<ServiceInstanceListSupplier> supplierObjectProvider;
private PolarisLoadBalancerRingHashKeyProvider ringHashKeyProvider;
public PolarisRingHashLoadBalancer(String serviceId,
ObjectProvider<ServiceInstanceListSupplier> supplierObjectProvider,
RouterAPI routerAPI,
PolarisLoadBalancerRingHashKeyProvider ringHashKeyProvider) {
RouterAPI routerAPI) {
this.serviceId = serviceId;
this.supplierObjectProvider = supplierObjectProvider;
this.routerAPI = routerAPI;
this.ringHashKeyProvider = ringHashKeyProvider;
}
private static ServiceInstances convertToPolarisServiceInstances(List<ServiceInstance> 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) {

@ -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<Response<ServiceInstance>> 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";
}
}
}

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

Loading…
Cancel
Save