1. 引言
在本教程中,我們將探討如何使用 Orkes Conductor 和 Spring 構建基於事件驅動的微服務。我們將使用 Conductor 來通過 HTTP 端點和工作者服務來編排微服務。
2. 基於事件的微服務
微服務提供了一種創建模塊化架構的方法,該架構可以獨立擴展和管理。開發人員通常將微服務設計為單職責服務,以出色地執行一項任務。然而,應用程序流程通常需要跨多個微服務進行協調,以實現業務目標。
基於事件的架構能夠穩健地促進微服務之間的通信,通過事件系統確保流程的可擴展性和持久性。因此,基於事件的微服務最近獲得了越來越多的關注,尤其適用於實現異步流程。
2.1. 事件驅動系統存在的不足
儘管事件驅動系統在解耦服務交互方面表現出色,但也帶來了一些挑戰:
- 難以可視化執行流程 – 所有微服務的通信都通過事件總線進行,因此難以可視化和理解業務流程。這使得識別、調試和從故障中恢復變得更加困難。通常使用分佈式跟蹤和集中式日誌記錄來解決這些問題。
- 沒有應用程序狀態的單一權威 – 通常,每個服務都維護自己的本地數據庫,作為該服務的記錄系統。例如,一張信用卡服務可能擁有一個包含信用卡支付和相關信息的數據庫。然而,在多個服務調用之間,應用程序的整體狀態分佈在各個服務之間,使得難以可視化應用程序流程、處理故障情況下進行補償交易,以及在給定時間查詢應用程序的狀態。
- 易於構建,難以擴展 – 像 Spring 這樣的框架簡化了構建可以連接到各種 pub/sub 系統的事件驅動應用程序。然而,開發人員通常需要花費大量時間來解決諸如運營系統、處理大型工作負載或構建具有複雜連接規則的應用程序等問題。
3. 使用 Conductor 的事件驅動架構
Netflix 最初將 Conductor 構建為微服務的編排平台。Netflix 的開發人員設計並構建 Conductor,以創建事件驅動的微服務,並解決上述一些缺點。
作為編排器,Conductor 允許我們通過代碼或 JSON 定義服務執行流程,並使用任何支持的語言 SDK 連接服務或編寫服務工件。 Conductor 作為完全開源的平台,遵循 Apache 2.0 許可協議。
Conductor 的多語言特性允許我們在任何語言編寫服務工件,或者在單個應用程序流程中擁有不同語言的服務和工件。
Conductor 允許我們創建可重用、單一職責原則的事件驅動服務,這些服務響應事件。 Conductor 還可以用於通過持久隊列連接暴露在 HTTP 上面的服務。
4. 使用 Conductor 和 Spring 構建事件驅動微服務
現在,讓我們來探索一個利用 Conductor 編排跨微服務的 Spring Boot 應用程序的示例。
4.1. 設置 Orkes Conductor
Orkes Conductor 可以通過多種方式進行配置。首先,我們可以使用 Docker 本地設置它,或者作為替代方案,可以使用免費的開發者沙盒 Playground。
也有一個 Slack 社區 可供參考,如果您對 Conductor 有任何疑問,這裏是個不錯的選擇。
4.2. 方法 1 – 本地安裝和運行(使用 Docker)
首先,請確保 Docker 已安裝在設備上。
然後,使用以下 Docker 命令啓動服務器,並在端口 9090 上運行 UI,端口為 1234。
docker run --init -p 9090:8080 -p 1234:5000 --mount source=redis,target=/redis \
--mount source=postgres,target=/pgdata orkesio/orkes-conductor-community-standalone:latest讓我們創建一個簡單的 Spring Boot 應用程序,它執行兩項任務:
- 使用 Conductor 創建一個微服務工作者。
- 協調這兩個服務之間的關係:
- 一個 HTTP 端點 https://orkes-api-tester.orkesconductor.com/api
- 我們之前創建的服務工作者。
以下是如何使用 Conductor 中的任務工作者創建簡單的服務工作者,而無需通過 HTTP 端點進行暴露:
@WorkerTask(value = "fraud-check-required")
public FraudCheckResult isFraudCheckRequired(BigDecimal amount) {
return fraudCheckService.checkForFraud(amount);
}
讓我們創建一個簡單的工作流,該工作流調用一個示例 HTTP 端點以獲取客户詳情(https://orkes-api-tester.orkesconductor.com/api)並同時運行我們剛才實施的欺詐檢查的服務工作者。
我們使用以下命令執行工作流,從而產生一個可訪問的工作流,該工作流位於 http://localhost:1234/workflowDef/microservice_orchestration。
curl -X 'POST' 'http://localhost:9090/api/metadata/workflow' \
-H 'accept: */*' \
-H 'Content-Type: application/json' \
-d '{
"name": "microservice_orchestration",
"description": "microservice_orchestration_example_workflow",
"version": 1,
"tasks": [
{
"name": "fork_task",
"taskReferenceName": "fork_task_ref",
"inputParameters": {},
"type": "FORK_JOIN",
"forkTasks": [
[
{
"name": "fraud-check-required",
"taskReferenceName": "fraud-check-required_ref",
"inputParameters": {
"amount": "${workflow.input.amount}"
},
"type": "SIMPLE"
}
],
[
{
"name": "get_customer_details",
"taskReferenceName": "get_customer_details_ref",
"inputParameters": {
"http_request": {
"uri": "https://orkes-api-tester.orkesconductor.com/api",
"method": "GET",
"accept": "application/json",
"contentType": "application/json"
}
},
"type": "HTTP"
}
]
]
},
{
"name": "join_task",
"taskReferenceName": "join_task_ref",
"type": "JOIN",
"joinOn": [
"get_customer_details_ref",
"fraud-check-required_ref"
]
}
],
"inputParameters": [
"amount"
],
"schemaVersion": 2,
"restartable": true
}'讓我們通過發出 HTTP POST 請求來運行新創建的工作流:
curl -X 'POST' \
'http://localhost:9090/api/workflow/microservice_orchestration' \
-H 'accept: text/plain' \
-H 'Content-Type: application/json' \
-d '{
"amount": 1000.00
}'
我們可以通過導航到“Executions”於 Orkes Conductor UI 中來驗證完成的執行,並檢查工作流執行 ID。
現在,讓我們探討如何將這種編排應用於應用程序中的服務。我們將暴露一個端點來執行此工作流,從而創建一個新的 API 端點,該端點使用事件驅動設計編排微服務。
以下是示例命令:
curl -X 'POST' \
'http://localhost:8081/checkForFraud' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"accountId": "string",
"amount": 12
}'
4.3. 方法 2 – 使用 Orkes Playground
讓我們創建一個免費帳户,並利用 Playground 實時測試 Conductor,請按照以下步驟操作:
- 登錄至 https://play.orkes.io/。
- 創建帳户以開始使用 Orkes Conductor。
現在,讓我們在 Playground 中創建一個新的工作流,或者,為了方便測試,我們也可以使用以下工作流:
查看工作流在 Playground 中的視圖
為了在 Orkes Playground 和工作者之間建立連接,我們需要在 Orkes Conductor 中創建一個應用程序。請按照以下步驟操作:
- 在 Orkes Playground 中,導航至 訪問控制 > 應用程序。
- 點擊 ‘創建應用程序‘ 並提供應用程序名稱。
- 選擇 ‘應用程序角色‘ 為 ‘工作者‘。
- 點擊 ‘創建訪問密鑰‘ 並複製和保留密鑰 ID & 密鑰秘鑰。
接下來,讓我們通過以下步驟授予運行工作流的權限:
- 在 ‘權限‘ 部分,我們點擊 ‘+添加權限‘。
- 在 ‘工作流‘ 選項卡下,我們選擇 ‘微服務編排‘,並在 ‘任務‘ 選項卡下,選擇 ‘欺詐檢查所需‘。
- 選擇 ‘執行‘ 權限並添加權限。
現在,讓我們打開工作者,並在 application.properties 文件中,提供生成的密鑰 ID & 密鑰秘鑰。我們應該將 conductor.server.url 替換為 https://play.orkes.io/api:
conductor.security.client.key-id=your_key_id
conductor.security.client.secret=your_key_secret
conductor.server.url=https://play.orkes.io/api
讓我們運行該應用程序。我們可以看到,工作進程會輪詢 Conductor 任務並選擇可用時的一個任務。
現在,我們使用我們在 Spring Boot 應用程序中創建的 http://localhost:8081/checkForFraud 端點,它將使用 play.orkes.io 作為 Conductor 後端服務器來運行工作流程。
5. 結論
事件驅動微服務為構建可擴展且響應迅速的軟件系統帶來了激動人心的機遇。 在本文中,我們回顧了事件驅動微服務的基本原理,並突出了它們的優勢和挑戰。
我們探討了微服務,憑藉其模塊化和單一職責的特性,為創建複雜應用程序提供了一個絕佳的基礎。
如往常一樣,本文的代碼源可在 GitHub 上找到:https://github.com/eugenp/tutorials/tree/master/microservices-modules/event-driven-microservice/。