1. 程式人生 > >使用 AMQP 和 Vert.x 實現微服務間的非同步通訊

使用 AMQP 和 Vert.x 實現微服務間的非同步通訊

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

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

子影 子影 翻譯於 09/04 22:56 頂 0

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

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

子影 子影 翻譯於 09/04 23:22 頂 0

解決方案元件

演示有三個部分:

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

2.QPid路由器:前端程序執行呼叫併發布一條訊息給QPid佇列。Vert.x自動負責新增correlationId作為message屬性,以識別對原始請求的響應。

3.後端:後端元件偵聽來自QPid路由器的呼叫中的訊息,處理它(例如,在資料庫中進行計算或持久化),並將響應傳送回QPid路由器。然後,QPid路由器將通過響應通知前端元件。程式碼庫中的後端資料夾託管此專案。

矽谷課堂 矽谷課堂 翻譯於 09/05 10:23 頂 0

訊息流

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

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

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

QPid伺服器將回復訊息分派給前端服務的回覆處理程式。Vert.x網橋自動處理回覆處理程式的呼叫。

矽谷課堂 矽谷課堂 翻譯於 09/05 10:32 頂 0

如何執行示例:快速開始

通過發出以下命令,您可以使用Docker Compose檔案來執行本例的所有三個元件:

docker-compose up 如何執行示例: 困難的方式

本節概述如何單獨執行每個元件。你需要下面的軟體在你的膝上型電腦上執行它們。

Docker (執行Apache Qpid路由器) Open JDK 8 (要編譯前端和後端服務元件) Maven 3.2 (兩個服務都使用Maven) 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 雪 雪落無痕xdj 翻譯於 09/05 19:30 頂 0

測試

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 Tocy Tocy 翻譯於 09/05 09:48 頂 0

總結

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