簡體   English   中英

使用 ASP.Net Core WebApi 在兩個微服務之間進行通信

[英]Communication Between two microservices using ASP.Net Core WebApi

我有兩個微服務。 客戶第一服務和發票服務第二服務。

在 Invoice MicroService 中,我將只保存 CustomerId。 使用此 CustomerId,我想檢索客戶微服務的所有相關數據。 但我不知道異步通信。

任何人請給我一些想法。

您提出的建議 - 特別是一個服務直接 HTTP 調用另一個服務 - 被稱為服務之間的緊密耦合,並且是微服務中的反模式。 它本質上將您的應用程序變成了一個分布式單體——應該避免它。

關於如何以良好、干凈的松耦合邊界正確地異步執行此操作的一個示例(有很多選項)如下所示:

  • 您的系統利用消息總線(我喜歡 AMQP,但還有其他選擇)
  • 創建客戶時,您的Customers Service會生成customer_created事件
  • 您的Invoicing Service訂閱這些事件,並在收到時進行必要的內部customer_id更新(這是保持其本地數據存儲更新 - 最終一致性
  • 當您的Invoicing Service創建需要來自Customers Service的信息的發票時,它會生成一個cust_invoice_pending事件
  • 您的Customers Service訂閱了此事件,當它看到一個事件時,它會在總線上生成一條新消息,例如invoice_customer_detail_push (注意,我會在此消息的有效負載中使用invoice_id將它們綁定在一起)
  • 您的Invoicing Service訂閱並查看它需要的數據,從而可以填充發票的 rest

這可能看起來像很多額外的工作和復雜性,確實如此。 這是成功的微服務架構的“硬”部分。 這需要更多的紀律和預先計划,但在這個簡單的案例中,與您提出的分布式單體相比,這里是結果解決方案的優勢:

  • 您可以用完全不同的東西替換您的Invoicing ServiceCustomers Service ,而無需觸及其他服務中的代碼
  • 您已經為這兩種服務抽象了與 authz 相關的問題——它們共享消息總線,只要它們都可以到達/從那里,彼此都不知道
  • 您可以允許未來的服務監控此業務流程並與之交互(創建和詳細說明發票),而無需更改這兩個服務中的代碼
  • 如果兩個服務中的一個出現故障,另一個服務將繼續完全響應,並且等待故障服務重新上線的任何工作都會自動排隊 - 它在呼叫/接收服務之外持續存在

所以,如果在你的情況下這些好處值得權衡,那就去做吧。 但是,每當您看到兩個“微服務”直接通信時,您可能已經忽略了一點耦合,需要重新檢查信息如何在您的系統中流動。

我認為您只需使用CustomerId作為查詢參數(或帖子正文,但可能不是)向您的第二個服務發送 http 請求。

在執行CreateClient請求之前,您需要在您的應用程序中創建客戶端。

使用 ASP.NET 核心中的 IHttpClientFactory 發出 HTTP 請求

    var request = new HttpRequestMessage(HttpMethod.Get,
        "domain_second_service/controller/method?customerId=X");
    request.Headers.Add("Accept", "application/json");
    request.Headers.Add("User-Agent", "HttpClientFactory-Sample");

    var client = _clientFactory.CreateClient();

    var response = await client.SendAsync(request);

暫無
暫無

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

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