使用 Orkes Conductor 的事件驅動微服務
一、簡介
在本教程中,我們將探索如何使用 Orkes Conductor 和 Spring 建立事件驅動的微服務。我們將使用Conductor透過 HTTP 端點和服務工作執行緒來編排微服務。
2. 事件驅動的微服務
微服務提供了一種創建可獨立擴展和管理的模組化架構的好方法。開發人員通常將微服務設計為單一職責服務,在某一件事上表現得非常出色。然而,應用程式流程通常需要跨多個微服務進行協調才能實現業務目標。
事件驅動的架構透過事件系統有力地促進了微服務之間的通信,確保了流的可擴展性和持久性。由於這些原因,事件驅動的微服務最近越來越受歡迎,並且在實現非同步流時特別有用。
2.1.事件驅動系統的缺點
雖然事件驅動系統擅長解耦服務交互,但它也帶來了一些挑戰:
- 難以視覺化執行流程-微服務之間的所有通訊都透過事件匯流排進行,因此很難視覺化和推理業務流。這使得識別、調試和從故障中恢復變得更加困難。通常,使用分散式追蹤和集中式日誌記錄來解決該問題。
- 應用程式狀態沒有單一的權限——通常,每個服務都維護其本機資料庫,該資料庫充當該服務的記錄系統。例如,信用卡服務可能有一個包含信用卡付款清單和相關資訊的資料庫。然而,在多個服務呼叫中,應用程式的整體狀態是分散式的,這使得應用程式流程視覺化、在發生故障時處理補償事務以及查詢給定時間應用程式的狀態變得困難。
- 易於構建,難以擴展——像 Spring 這樣的框架簡化了可以連接到各種發布/訂閱系統的事件驅動應用程式的構建。然而,開發人員經常投入大量時間來應對挑戰,例如係統運作、擴展以處理大量工作負載或建立具有非常複雜的連接規則的應用程式。
3. 使用 Conductor 的事件驅動架構
Netflix 最初將 Conductor 建構為編排微服務的平台。 Netflix 的開發人員設計和建構 Conductor 來創建事件驅動的微服務並解決上面列出的一些缺點。
作為編排器,Conductor 允許我們以程式碼或 JSON 方式定義服務執行流程,並使我們能夠使用任何受支援的語言 SDK 連線服務或編寫服務工作人員。 Conductor 作為一個完全開源的平台,在 Apache 2.0 授權下運作。
Conductor 的多語言特性使我們能夠用任何語言編寫服務工作線程,或使用不同語言提供服務和工作線程,甚至在單一應用程式流程中也是如此。
Conductor 讓我們能夠創建可重複使用、單一責任原則的事件驅動服務來回應事件。 Conductor 也可以用於連線使用持久性佇列透過 HTTP 公開的服務。
4. 使用 Conductor 和 Spring 的事件驅動微服務
現在,讓我們探索一個範例 Spring Boot 應用程序,該應用程式利用 Conductor 跨微服務進行編排。
4.1.設置 Orkes Conductor
Orkes Conductor 可以透過多種方式進行配置。首先,我們可以使用 Docker 在本地進行設置,或者,我們可以使用免費的開發人員沙箱 Playground。
還有一個Slack 社區,可能是查詢與 Conductor 相關的任何問題的好地方。
4.2.方法 1 – 使用 Docker 在本機安裝並執行
首先,我們確保設備上安裝了 Docker。
然後,我們使用以下 Docker 命令在連接埠9090
上啟動伺服器並在連接埠1234
上啟動 UI:
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
- 我們在第一步驟中建立的 Service Worker。
- HTTP 端點
以下是我們如何使用 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](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
}'
我們可以透過導航到 Orkes Conductor UI 上的「 Executions
」並檢查工作流程執行 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 中建立一個新的工作流程,或者為了方便測試,我們也可以使用以下工作流程:
View Workflow in Playground
為了在 Orkes Playground 和工作人員之間創建連接,我們需要在 Orkes Conductor 中建立一個應用程式。讓我們按照以下步驟操作:
- 在 Orkes Playground 上,導覽至
Access Control > Applications
。 - 點擊“
Create Application
”並提供應用程式名稱。 - 選擇“
Application role
”作為“Worker
”。 - 點擊“
Create access key
”並複製金鑰 ID 和金鑰並保密。
接下來,讓我們按照以下步驟授予運行工作流程的存取權限:
- 在“
Permissions
”部分下,我們點擊“+Add permission
”。 - 在“
Workflows
”標籤下,我們選擇“microservice_orchestration
”,在“Tasks
”標籤下,我們選擇“fraud_check_required
” - 選擇“
EXECUTE
”權限並新增權限。
現在,讓我們打開工作程序,並在application.properties
檔案下提供產生的金鑰 ID 和金鑰。我們應該用**https://play.orkes.io/api
**替換**conductor.server.url**
:
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 上取得。