use threadlocal ringhash key provider

pull/971/head
seanyu 2 years ago
parent 5d607a40d3
commit 12a4647ecf

@ -17,6 +17,8 @@
package com.tencent.cloud.polaris.loadbalancer;
import com.tencent.cloud.common.metadata.MetadataContextHolder;
/**
* PolarisLoadBalancerRingHashKeyProvider.
*
@ -24,22 +26,17 @@ package com.tencent.cloud.polaris.loadbalancer;
*/
public final class PolarisLoadBalancerRingHashKeyProvider {
private static final ThreadLocal<String> hashKeys = new ThreadLocal<>();
private static final String LOAD_BALANCER_HASH_KEY = "LOAD_BALANCER_HASH_KEY";
private PolarisLoadBalancerRingHashKeyProvider() {
}
public static void hashKey(String key) {
hashKeys.set(key);
}
static void remove() {
hashKeys.remove();
MetadataContextHolder.get().setLoadbalancer(LOAD_BALANCER_HASH_KEY, key);
}
static String getHashKey() {
return hashKeys.get();
return MetadataContextHolder.get().getLoadbalancerMetadata().get(LOAD_BALANCER_HASH_KEY);
}
}

@ -81,10 +81,11 @@ public class PolarisRingHashLoadBalancer implements ReactorServiceInstanceLoadBa
public Mono<Response<ServiceInstance>> choose(Request request) {
ServiceInstanceListSupplier supplier = supplierObjectProvider
.getIfAvailable(NoopServiceInstanceListSupplier::new);
return supplier.get(request).next().map(this::getInstanceResponse);
String hashKey = Optional.ofNullable(PolarisLoadBalancerRingHashKeyProvider.getHashKey()).orElse("");
return supplier.get(request).next().map(serviceInstances -> getInstanceResponse(serviceInstances, hashKey));
}
private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> serviceInstances) {
private Response<ServiceInstance> getInstanceResponse(List<ServiceInstance> serviceInstances, String hashKey) {
if (serviceInstances.isEmpty()) {
log.warn("No servers available for service: " + this.serviceId);
return new EmptyResponse();
@ -94,12 +95,11 @@ public class PolarisRingHashLoadBalancer implements ReactorServiceInstanceLoadBa
request.setDstInstances(convertToPolarisServiceInstances(serviceInstances));
request.setLbPolicy(LoadBalanceConfig.LOAD_BALANCE_RING_HASH);
Criteria criteria = new Criteria();
criteria.setHashKey(Optional.ofNullable(PolarisLoadBalancerRingHashKeyProvider.getHashKey()).orElse(""));
criteria.setHashKey(hashKey);
request.setCriteria(criteria);
try {
ProcessLoadBalanceResponse response = routerAPI.processLoadBalance(request);
PolarisLoadBalancerRingHashKeyProvider.remove();
return new DefaultResponse(new PolarisServiceInstance(response.getTargetInstance()));
}
catch (Exception e) {

Loading…
Cancel
Save