我需要调用另一个已经在Consul中注册的微服务。但是我不能使用Micronaut HTTP客户端,也不能使用RxJava HTTP客户端。我需要发现该微服务的URL才能调用它。因此,我认为,我不能使用@client注释来指定我想要发现其URL的服务的名称。请给我一个例子,我如何使用reactor-netty来调用另一个微服务,并可以发现它的URL已经在领事注册。
发布于 2021-03-17 00:58:33
我通过注入Consul客户端并调用"getInstances“函数来实现这一点。
package happy.shopping.apigw.infrastructure.client.rest.reports;
import io.micronaut.discovery.ServiceInstance;
import io.micronaut.discovery.consul.client.v1.ConsulClient;
import io.reactivex.Flowable;
import io.reactivex.Single;
import org.jetbrains.annotations.NotNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import reactor.core.publisher.Mono;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.Random;
import java.util.stream.Collectors;
import static reactor.adapter.rxjava.RxJava2Adapter.singleToMono;
@Singleton
public class ReportClient {
private static final Logger logger
= LoggerFactory.getLogger(ReportClient.class);
@Inject
ConsulClient consulClient;
public Mono<List<ServiceInstance>> getInstances() {
Single<List<List<ServiceInstance>>> listaDeInstancias = Flowable.fromPublisher(consulClient.getInstances("ms-reports")).toList();
Single<List<ServiceInstance>> instanciasAplanadas = listaDeInstancias.map(this::flattenListOfListsStream);
return singleToMono(instanciasAplanadas);
}
public <T> List<T> flattenListOfListsStream(@NotNull List<List<T>> list) {
return list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
public Mono<Optional<String>> chooseAnInstance(){
Mono<List<ServiceInstance>> instances = getInstances();
Random rnd = new Random();
return instances.map(listOfInstances -> {
if (listOfInstances.size() > 0) {
int instanceIndex = rnd.nextInt(listOfInstances.size());
return Optional.ofNullable(listOfInstances.get(instanceIndex).getURI().toString());
}else {
return Optional.empty();
}
});
}
}函数"chooseAnInstance“返回其中一个实例的URL,我用它来调用另一个微服务的API。函数"chooseAnInstance“随机选择一个实例。
https://stackoverflow.com/questions/66601780
复制相似问题