好文翻譯丨使用 AMQP 和 Vert.x 實現微服務間的異步通信

好文翻譯丨使用 AMQP 和 Vert.x 實現微服務間的異步通信

關注開源中國OSC頭條號,獲取最新技術資訊


參與翻譯 (5人) : 子影, 硅谷課堂, ZICK_ZEON, Tocy, 雪落無痕xdj

微服務是大多數新型現代軟件解決方案中的首選架構。它們(大多數)被設計成去做一件事,它們必須相互協作去完成業務用例。微服務之間的所有通信都是通過網絡呼叫進行的;這種模式避免了服務之間的緊耦合而且提供了更好的模塊分離。

這裡基本上有兩種通信方式:同步和異步。正確應用這兩個方式是請求-回覆和事件驅動模式的基礎。在請求-回覆模式中,客戶端初始化一個請求,並且通常同步等待回覆。然而,有些情況下,客戶端可以不等待並向另一方註冊回調,這是異步方式的請求-回覆模式的一個例子。

本文中,我會通過基於高級消息隊列協議(AMQP)的兩個微服務之間的通信來展示異步方式的請求-回覆過程。AMQP是應用程序或組織之間傳遞業務消息的開放標準。雖然本文的重點在於介紹請求-回覆模式,但是同樣的代碼也可用於開發其它情況,比如事件風暴。使用異步模型通信對於實現聚合模式是非常有益的。

我會使用Apache QPid Proton(或Red Hat AMQ Interconnect)作為消息路由器和使用Vert.x AMQP橋接器,用於兩種服務之間的通信。

解決方案組件

演示有三個部分:

1.前端:這是一個用Java編寫的服務,此服務提供了一個HTTP端點來接收來自客戶端的調用。收到請求後,前端服務將調用指令發送到QPid路由器並註冊應答處理程序。當響應可用時,Vert.x AMQP橋將調用回覆處理程序。代碼庫中的前端文件夾託管此項目。

2.QPid路由器:前端進程執行調用併發布一條消息給QPid隊列。Vert.x自動負責添加correlationId作為message屬性,以識別對原始請求的響應。

3.後端:後端組件偵聽來自QPid路由器的呼叫中的消息,處理它(例如,在數據庫中進行計算或持久化),並將響應發送回QPid路由器。然後,QPid路由器將通過響應通知前端組件。代碼庫中的後端文件夾託管此項目。

消息流

1.跨不同組件的消息的基本流程如下。可在此處找到此流程的完整詳細信息以及相關標頭。

2.前端服務將向QPid服務器發送消息並提供回覆處理程序。Vert.x自動填充請求 - 回覆通信所需的標頭。

3.接收後端服務應用程序,處理該消息並將回覆發送回QPid服務器。Vert.x填充請求 - 回覆通信所需的標頭。

QPid服務器將回復消息分派給前端服務的回覆處理程序。Vert.x網橋自動處理回覆處理程序的調用。

如何運行示例:快速開始

通過發出以下命令,您可以使用Docker Compose文件來運行本例的所有三個組件:

docker-compose up

如何運行示例: 困難的方式

本節概述如何單獨運行每個組件。你需要下面的軟件在你的筆記本電腦上運行它們。

  1. Docker (執行Apache Qpid路由器)
  2. Open JDK 8 (要編譯前端和後端服務組件)
  3. Maven 3.2 (兩個服務都使用Maven)
  4. Vegeta 作為HTPP客戶端(或者您可以使用您最喜歡的工具)

執行

  • 使用下面的命令啟動本地的QPid路由器:
docker run -it -p 5672:5672 ceposta/qdr
  • 編譯並執行前端服務:
cd frontend 
mvn clean install
java -jar target/frontend-service-full.jar
  • 編譯並執行後端服務:
cd backend 
mvn clean install
java -jar target/backend-service-full.jar

測試

Vegeta是一種用於HTTP負載測試的開源工具,可用於將請求發佈到前端組件。

echo "GET http://localhost:8080/" | ./vegeta attack -duration=60s -rate=50 | tee results.bin | ./vegeta report

驗證消息數目及延時

QPid,作為服務之間通信的異步集線器,提供了超快骨幹。一旦完成應用程序測試之後,你可以使用其IMAGE ID登錄QPid路由的Docker容器,並運行qdstat以查看各種指標。

docker exec  qdstat -c
docker exec qdstat -l
docker exec qdstat -a

總結

Apache QPid為微服務之間的通信提供了一個超快的主幹通訊。由於 AMQP 是一種線級協議,在其他棧(如.net)中編寫的服務也可以使用相同的通信通道。Java 開發人員可以使用 Vert.x AMQP birdge 工具輕鬆實現基於 amqp 的異步服務間通信模式。

開源社區OSC「好文翻譯」欄目,旨在每天為用戶推薦並翻譯優質的外網文章。再也不用怕因為英語不過關,被擋在許多技術文章的門外。關注開源社區OSC,每日獲取翻譯好文推薦,點擊“瞭解更多”,閱讀原文章。


分享到:


相關文章: