簡體   English   中英

從單個服務多次調用多個微服務的最佳方法或設計模式是什么?

[英]What is the best approach or design pattern to call multiple microservices several times from a single service?

微服務 A 依賴於微服務 B & C。 當客戶端調用服務 A 上的某個端點時,這將導致從 A 到服務 B 和 C 的多個 HTTP 請求以獲取依賴項的詳細信息。 同時處理這種情況的最佳、性能有效的設計模式或方法是什么?

注意:在這種情況下我們沒有使用 API 網關。

根據您的問題,我認為沒有能力利用基於事件的/反應式方法,並且已經根據此處考慮的權衡做出架構決策(請注意,在此來源中,下面提出的方法被稱為“混合”)。

編排

在這些條件下,您要查找的模式稱為Orchestration 查看這個很棒的答案以獲得更廣泛的概述。

快速回顧一下,您可以使用Spring Integration 之類的東西來實現以下關鍵點:

  • 在處理對 A 的請求時,盡可能同時執行對 B 和 C 的調用,以實現 A 的最快響應時間
  • 將並發調用的結果累加、轉化、聚合成完整的響應實體
  • 利用線程池限制對 B 和 C 的並發運行請求,以防止級聯故障放大
  • 快速失敗:如果某些請求失敗,則提前取消隨后的一系列調用(即,如果調用 B 不成功,則不調用 C)
  • 截止:涉及您可以等待當前正在運行的 B&C 調用的完成的最大處理時間,並在經過 A 時以錯誤響應

更新 - 依賴於客戶端Reactor 模式的實現

如果您可以使用 Spring 5/Spring Boot 2.x,您還可以使用基於Project Reactor 的Spring WebFlux以響應方式調用 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);

(基於這個例子

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM