|
|
@ -17,11 +17,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
package com.tencent.cloud.polaris.router;
|
|
|
|
package com.tencent.cloud.polaris.router;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.concurrent.CountDownLatch;
|
|
|
|
import java.util.function.Function;
|
|
|
|
import java.util.concurrent.TimeUnit;
|
|
|
|
|
|
|
|
import java.util.concurrent.atomic.AtomicReference;
|
|
|
|
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
import java.util.stream.Collectors;
|
|
|
|
|
|
|
|
|
|
|
|
import com.tencent.cloud.common.metadata.MetadataContext;
|
|
|
|
import com.tencent.cloud.common.metadata.MetadataContext;
|
|
|
@ -30,6 +29,7 @@ import com.tencent.polaris.api.pojo.DefaultServiceInstances;
|
|
|
|
import com.tencent.polaris.api.pojo.Instance;
|
|
|
|
import com.tencent.polaris.api.pojo.Instance;
|
|
|
|
import com.tencent.polaris.api.pojo.ServiceInstances;
|
|
|
|
import com.tencent.polaris.api.pojo.ServiceInstances;
|
|
|
|
import com.tencent.polaris.api.pojo.ServiceKey;
|
|
|
|
import com.tencent.polaris.api.pojo.ServiceKey;
|
|
|
|
|
|
|
|
import org.reactivestreams.Publisher;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.Logger;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
|
import reactor.core.publisher.Flux;
|
|
|
|
import reactor.core.publisher.Flux;
|
|
|
@ -57,33 +57,19 @@ public final class RouterUtils {
|
|
|
|
* @return ServiceInstances
|
|
|
|
* @return ServiceInstances
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
public static ServiceInstances transferServersToServiceInstances(Flux<List<ServiceInstance>> servers, InstanceTransformer instanceTransformer) {
|
|
|
|
public static ServiceInstances transferServersToServiceInstances(Flux<List<ServiceInstance>> servers, InstanceTransformer instanceTransformer) {
|
|
|
|
CountDownLatch latch = new CountDownLatch(1);
|
|
|
|
List<Instance> instanceList = Collections.synchronizedList(new ArrayList<>());
|
|
|
|
|
|
|
|
servers.flatMap((Function<List<ServiceInstance>, Publisher<?>>) serviceInstances ->
|
|
|
|
AtomicReference<List<Instance>> instancesRef = new AtomicReference<>();
|
|
|
|
Flux.fromIterable(serviceInstances.stream()
|
|
|
|
servers.subscribe(serviceInstances -> {
|
|
|
|
.map(instanceTransformer::transform)
|
|
|
|
instancesRef.set(serviceInstances
|
|
|
|
.collect(Collectors.toList()))).subscribe(instance -> instanceList.add((Instance) instance));
|
|
|
|
.stream()
|
|
|
|
|
|
|
|
.map(instanceTransformer::transform)
|
|
|
|
|
|
|
|
.collect(Collectors.toList()));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
latch.countDown();
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
|
|
|
latch.await(WAIT_TIME, TimeUnit.SECONDS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
catch (InterruptedException e) {
|
|
|
|
|
|
|
|
LOGGER.error("Wait get instance result error. ", e);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
String serviceName = "";
|
|
|
|
String serviceName = "";
|
|
|
|
if (!CollectionUtils.isEmpty(instancesRef.get())) {
|
|
|
|
if (!CollectionUtils.isEmpty(instanceList)) {
|
|
|
|
serviceName = instancesRef.get().get(0).getService();
|
|
|
|
serviceName = instanceList.get(0).getService();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE, serviceName);
|
|
|
|
ServiceKey serviceKey = new ServiceKey(MetadataContext.LOCAL_NAMESPACE, serviceName);
|
|
|
|
List<Instance> instances = instancesRef.get() == null ? Collections.emptyList() : instancesRef.get();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return new DefaultServiceInstances(serviceKey, instances);
|
|
|
|
return new DefaultServiceInstances(serviceKey, instanceList);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|