Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从单个服务多次调用多个微服务的最佳方法或设计模式是什么?_Java_Spring Mvc_Spring Boot_Microservices - Fatal编程技术网

Java 从单个服务多次调用多个微服务的最佳方法或设计模式是什么?

Java 从单个服务多次调用多个微服务的最佳方法或设计模式是什么?,java,spring-mvc,spring-boot,microservices,Java,Spring Mvc,Spring Boot,Microservices,微服务A依赖于微服务B&C。当客户端调用服务A上的某个端点时,这将导致A向服务B&C发出多个HTTP请求以获取依赖的详细信息。同时处理此场景的最佳、性能有效的设计模式或方法是什么 注意:在这种情况下,我们不使用API网关。基于您的问题,我假设没有能力利用,并且已经根据考虑的权衡做出了架构决策(注意,在本资料来源中,以下建议的方法被称为“混合”) 编排 在这些条件下,将调用您正在寻找的模式。查看更广泛的概述 简要回顾一下,您可以使用类似的方法来实现以下要点: 在处理对A的请求时,尽可能同时执行对

微服务A依赖于微服务B&C。当客户端调用服务A上的某个端点时,这将导致A向服务B&C发出多个HTTP请求以获取依赖的详细信息。同时处理此场景的最佳、性能有效的设计模式或方法是什么


注意:在这种情况下,我们不使用API网关。

基于您的问题,我假设没有能力利用,并且已经根据考虑的权衡做出了架构决策(注意,在本资料来源中,以下建议的方法被称为“混合”)

编排

在这些条件下,将调用您正在寻找的模式。查看更广泛的概述

简要回顾一下,您可以使用类似的方法来实现以下要点:

  • 在处理对A的请求时,尽可能同时执行对B&C的调用,以从A获得最快的响应时间
  • 将并发调用的结果累积、转换和聚合为完整的响应实体
  • 利用线程池限制对B和C的并发运行请求,以防止级联故障的放大
  • Fail fast(快速失败):如果某些请求失败,则提前取消后续的一组调用(即,如果对B的调用未成功,则不要调用C)
  • 截止时间:包括您可以等待的最长处理时间,以等待完成当前正在运行的对B&C的一系列呼叫,并在经过时以错误响应
更新-依靠客户端的实施

如果您可以使用Spring5/SpringBoot2.x,那么您也可以使用based以反应式的方式调用B&C来实现上述几点

根据示意图,您可以执行以下操作:

@Service
public class MyService {

    private final WebClient webClient;

    ...

    public Mono<Details> someRestCall(String name) {
        return this.webClient.get().url("{name}/details", name)
                        .retrieve().bodyToMono(ResponseEntity.class);
    }

}

...


Mono<ResponseEntity> b1 = myService.someRestCall("serviceB");
Mono<ResponseEntity> c1 = myService.someRestCall("serviceC");
Mono<ResponseEntity> b2 = myService.someOtherRestCall("serviceB");

ResponseEntity response = Flux
       .parallel(NUM_CPUS)
       .merge(b1, c1, b2)
       .limitRequest(MAX_REQUESTS)
       .onErrorReturn(ERR_RESPONSE_ENTITY)
       .blockLast(CUTOFF_TIMEOUT);
@服务
公共类MyService{
私人最终网络客户网络客户;
...
公共调用(字符串名称){
返回此.webClient.get().url(“{name}/details”,name)
.retrieve().BodyToNo(ResponseEntity.class);
}
}
...
monob1=myService.someRestCall(“serviceB”);
monoc1=myService.someRestCall(“serviceC”);
monob2=myService.someOtherRestCall(“serviceB”);
响应性响应=通量
.parallel(NUM_CPU)
.合并(b1、c1、b2)
.limitRequest(最大请求数)
.OneErrorReturn(错误响应实体)
.blockLast(切断超时);

(基于)

您通常应该尝试独立开发微服务。如果这是不可能的,您可以使用发布/订阅机制将相关事件通知服务。这就解决了微服务之间存在太多依赖关系的问题。如果这也是不可能的(您需要触发业务逻辑),总是考虑ASNC调用远程服务。