嘿哈布爾! 我提請您注意這篇文章的翻譯
07.07.2020/XNUMX/XNUMX, 翻譯
我經常與非 Java 人員討論微服務架構:C# 開發人員、Node.JS/JavaScript 開發人員或 Golang 愛好者。 他們都面臨著這樣一個事實:他們需要微服務架構中的編排機制,或者只是一個簡化工作流程並獲得排序、處理超時、Saga 和補償事務的能力的工具。
BPM 平台具有
不! 事實上,您無需任何 Java 知識即可輕鬆運行 Camunda,並以您選擇的任何語言設置代碼架構。 在本文中,我們將了解:
- 基本架構;
- 休息API
- 針對 Java 以外的語言的現有客戶端庫的建議;
- 使用 C# 和 Node.JS 的示例;
- 啟動 Camunda 服務器(Docker 或 Tomcat)的方法。
架構
Camunda 是用 Java 編寫的,需要 Java 虛擬機 (JVM) 才能運行。 Camunda 提供了一個 REST API,允許您用任何您喜歡的語言編寫並將 REST 與 Camunda 結合使用:
Camunda 中的工作流程是在 BPMN 中定義的,BPMN 基本上是一個 XML 文件。 它可以建模為
通過預構建的 Docker 鏡像運行 Camunda
運行 Camunda 最簡單的方法是使用 Docker。 本文稍後將介紹啟動 Camunda 的其他方法。
在這種情況下,只需運行:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
您不必擔心 Linux、JVM 或 Tomcat。 Dockerfiles 和基本文檔(例如,連接到所需數據庫的說明)可在以下位置獲取:
如果您想運行 Camunda 企業版,您可以輕鬆更改
然而,使用 Docker 運行 Camunda 有一個缺點:您最終得到的 Tomcat 版本並不總是包含最新的修復程序。 要解決此問題,您可以根據所需的 Tomcat 發行版創建自己的 Docker 映像(如此示例所示),或使用下面描述的解決方案之一。
流程模型部署
讓我們看一個使用 Saga 模板進行經典旅行預訂的示例,您希望連續觸發三個操作,並在以後發生故障時對成功完成的操作進行適當的補償。 以 BPMN 形式表示,如下所示:
現在你可以使用
curl -w "n"
-H "Accept: application/json"
-F "deployment-name=trip"
-F "enable-duplicate-filtering=true"
-F "deploy-changed-only=true"
-F "[email protected]"
http://localhost:8080/engine-rest/deployment/creat
現在你可以運行
curl
-H "Content-Type: application/json"
-X POST
-d '{"variables":{"someData" : {"value" : "someValue", "type": "String"}},"businessKey" : "12345"}}'
http://localhost:8080/engine-rest/<!-- -->process-definition/key/<!-- -->FlowingTripBookingSaga<!-- -->/start
下一個有趣的問題是:Camunda 如何調用預訂汽車之類的程序? Camunda不僅可以使用一些內置的立即調用服務(Push-Principle)
所以首先你需要執行
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123","maxTasks":1,"usePriority":true,"topics":[{"topicName": "reserve-car"}, "lockDuration": 10000, "variables": ["someData"]}]}'<!-- -->
http://localhost:8080/engine-rest/external-task/fetchAndLock
然後告訴卡蒙達
curl
-H "Content-Type: application/json"
-X POST
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- -->
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete
就是這樣 - 您仍然不需要任何 Java,對吧? 這足以開始了!
客戶端庫
使用任何編程語言調用 REST API 都很容易。 在 JavaScript 中,可以使用 JQuery 方便地完成此操作,而在 C# 中,可以使用 System.Net.Http 和 Newtonsoft.Json 輕鬆完成。 但這需要時間。 所以你可以只使用一些客戶端庫。
目前,有幾個現成的客戶端庫可用:
- JavaScript的:
鏈接 。 由卡蒙達支持; - Java的:
鏈接 。 由卡蒙達支持; - C #:
鏈接 и鏈接 。 這兩個項目都處於中間狀態,實際上處於休眠狀態,但可以作為一個很好的起點; - PHP:
鏈接 - 不太完整,不包括最新的 API 更改,但我知道使用它的項目。
除了 JavaScript 和 Java 之外,客戶端庫不是 Camunda 產品本身的一部分。 不要指望它們支持 Camunda 的所有 REST API 功能。 僅僅因為庫不提供特定功能並不意味著它不存在,請始終檢查 Camunda 的 REST API。 參考項目使用庫作為起點和模板。
C# 示例
使用上面的客戶端庫,我們可以簡單地編寫:
var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
// Deploy the BPMN XML file from the resources
camunda.RepositoryService.Deploy("trip-booking", new List<object> {
FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
});
// Register workers
registerWorker("reserve-car", externalTask => {
// here you can do the real thing! Like a sysout :-)
Console.WriteLine("Reserving car now...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
registerWorker("cancel-car", externalTask => {
Console.WriteLine("Cancelling car now...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
registerWorker("book-hotel", externalTask => {
Console.WriteLine("Reserving hotel now...");
camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
});
// Register more workers...
StartPolling();
string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary<string, object>()
{
{"someBookingData", "..." }
});
完整工作的源代碼可以在網上找到:
Node.js 示例
var Workers = require('camunda-worker-node');
var workers = Workers('http://localhost:8080/engine-rest', {
workerId: 'some-worker-id'
});
workers.registerWorker('reserve-car', [ 'someData' ], function(context, callback) {
var someNewData = context.variables.someData + " - added something";
callback(null, {
variables: {
someNewData: someNewData
}
});
});
workers.shutdown();
更多信息可以在網站上找到
啟動 Camunda 的其他方式
帶有“Camundastandalone WAR”的自定義 Docker 鏡像
作為 Camunda 預構建 Docker 映像的替代方案,您可以自己準備 Tomcat(例如,基於官方 Docker Tomcat 映像),然後將 Camunda 作為所謂的 WAR 文件之一複製到其中。
如果您有很多額外的要求並且可以設置 Java 構建環境,您還可以設置 Camunda Standalone war。 設置 Maven 構建,如以下示例所示:
啟動 Camunda Tomcat 發行版
另一種選擇是簡單地下載 Camunda Tomcat 發行版,解壓縮並運行它。 這僅需要在您的計算機上安裝 Java 運行時環境 (JRE)。 它可以很容易地
為了更改數據庫或執行其他任何操作,您需要像這樣配置 Tomcat
使用 Tomcat 運行 Camunda
最後一種選擇是自己設置 Tomcat 並在其中安裝 Camunda,
將 Camunda 投入生產
這通常需要一些最終設置才能運行 Camunda。 Camunda 中有一些指南對此進行了非常詳細的描述,但我不會在本文中對其進行深入討論 - 我將僅舉一個例子:默認情況下,發行版的 REST API 未配置為進行身份驗證。 您可能想改變這一點。
總結
正如您所看到的,無論您使用哪種語言,Camunda 上手都非常容易。 關鍵點是所有交互都是通過 REST API 完成的。 安裝也非常簡單,尤其是使用 Docker 時。
來源: www.habr.com