使用 AMQP 和 Vert.x 實現微服務間的非同步通訊
微服務是大多數新型現代軟體解決方案中的首選架構。它們(大多數)被設計成去做一件事,它們必須相互協作去完成業務用例。微服務之間的所有通訊都是通過網路呼叫進行的;這種模式避免了服務之間的緊耦合而且提供了更好的模組分離。
這裡基本上有兩種通訊方式:同步和非同步。正確應用這兩個方式是請求-回覆和事件驅動模式的基礎。在請求-回覆模式中,客戶端初始化一個請求,並且通常同步等待回覆。然而,有些情況下,客戶端可以不等待並向另一方註冊回撥,這是非同步方式的請求-回覆模式的一個例子。
本文中,我會通過基於高階訊息佇列協議(ofollow,noindex" target="_blank">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
如何執行示例: 困難的方式
本節概述如何單獨執行每個元件。你需要下面的軟體在你的膝上型電腦上執行它們。
執行
-
使用下面的命令啟動本地的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 <container-name> qdstat -c docker exec <container-name> qdstat -l docker exec <container-name> qdstat -a
總結
Apache QPid 為微服務之間的通訊提供了一個超快的主幹通訊。由於 AMQP 是一種線級協議,在其他棧(如.net)中編寫的服務也可以使用相同的通訊通道。Java 開發人員可以使用 Vert.x AMQP birdge 工具輕鬆實現基於 amqp 的非同步服務間通訊模式。
本文來自雲棲社群合作伙伴“開源中國”
本文作者:局長