首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果我必须使用reactor netty调用具有低级HTTP客户端的另一个微服务,则可以使用Micronaut中的服务发现

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

Stack Overflow用户
提问于 2021-03-12 22:29:22
回答 1查看 90关注 0票数 0

我需要调用另一个已经在Consul中注册的微服务。但是我不能使用Micronaut HTTP客户端,也不能使用RxJava HTTP客户端。我需要发现该微服务的URL才能调用它。因此,我认为,我不能使用@client注释来指定我想要发现其URL的服务的名称。请给我一个例子,我如何使用reactor-netty来调用另一个微服务,并可以发现它的URL已经在领事注册。

EN

回答 1

Stack Overflow用户

发布于 2021-03-17 00:58:33

我通过注入Consul客户端并调用"getInstances“函数来实现这一点。

代码语言:javascript
复制
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“随机选择一个实例。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66601780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档