繁体   English   中英

如果我必须使用 reactor-netty 调用具有低级 HTTP 客户端的另一个微服务,则在 Micronaut 中进行服务发现

[英]Service discovery in Micronaut if I have to call another microservice with a low-level HTTP client using reactor-netty

我需要调用另一个已经在 Consul 中注册的微服务。 但我不能使用 Micronaut HTTP 客户端或 RxJava HTTP 客户端。 我需要发现那个微服务的 URL 来调用它。 因此,我认为,我不能使用@client 注解来指定我想发现它的 URL 的服务的名称。 请给我一个示例,说明如何使用 reactor-netty 调用另一个微服务,并且可以发现它已经在 Consul 中注册的 URL。

我通过注入 Consul Client 并调用他的“getInstances”function 来实现这一点。

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();
            }
        });
    }



}

function“chooseAnInstance”返回其中一个实例的 URL,我用它来调用另一个微服务的 API。 Function "chooseAnInstance" 随机选择一个实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM