簡體   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