有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如果我必须使用reactornetty通过低级别HTTP客户端调用另一个微服务,则可以在Micronaut中发现java服务

我需要打电话给另一家已经在领事馆注册的微服务公司。但是我不能使用Micronaut HTTP客户端,也不能使用RxJava HTTP客户端。我需要找到微服务的URL才能调用它。因此,我认为,我不能使用@client annotation来指定我想要发现其URL的服务的名称。请给我一个例子,我如何使用reactor netty调用另一个微服务,并发现其已在concur注册的URL


共 (1) 个答案

  1. # 1 楼答案

    我通过注入concur客户机并调用“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,我用它来调用另一个microservice的API。函数“chooseAnInstance”选择一个随机实例