Java 从单个服务多次调用多个微服务的最佳方法或设计模式是什么?
微服务A依赖于微服务B&C。当客户端调用服务A上的某个端点时,这将导致A向服务B&C发出多个HTTP请求以获取依赖的详细信息。同时处理此场景的最佳、性能有效的设计模式或方法是什么Java 从单个服务多次调用多个微服务的最佳方法或设计模式是什么?,java,spring-mvc,spring-boot,microservices,Java,Spring Mvc,Spring Boot,Microservices,微服务A依赖于微服务B&C。当客户端调用服务A上的某个端点时,这将导致A向服务B&C发出多个HTTP请求以获取依赖的详细信息。同时处理此场景的最佳、性能有效的设计模式或方法是什么 注意:在这种情况下,我们不使用API网关。基于您的问题,我假设没有能力利用,并且已经根据考虑的权衡做出了架构决策(注意,在本资料来源中,以下建议的方法被称为“混合”) 编排 在这些条件下,将调用您正在寻找的模式。查看更广泛的概述 简要回顾一下,您可以使用类似的方法来实现以下要点: 在处理对A的请求时,尽可能同时执行对
注意:在这种情况下,我们不使用API网关。基于您的问题,我假设没有能力利用,并且已经根据考虑的权衡做出了架构决策(注意,在本资料来源中,以下建议的方法被称为“混合”) 编排 在这些条件下,将调用您正在寻找的模式。查看更广泛的概述 简要回顾一下,您可以使用类似的方法来实现以下要点:
- 在处理对A的请求时,尽可能同时执行对B&C的调用,以从A获得最快的响应时间
- 将并发调用的结果累积、转换和聚合为完整的响应实体
- 利用线程池限制对B和C的并发运行请求,以防止级联故障的放大
- Fail fast(快速失败):如果某些请求失败,则提前取消后续的一组调用(即,如果对B的调用未成功,则不要调用C)
- 截止时间:包括您可以等待的最长处理时间,以等待完成当前正在运行的对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调用远程服务。