使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

嘿哈布爾! 我提請您注意這篇文章的翻譯 “將 Camunda 用作易於使用的基於 REST 的編排和工作流引擎(無需接觸 Java)” 作者:貝恩德·魯克。

07.07.2020/XNUMX/XNUMX, 翻譯 文章 貝恩德·拉克

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

我經常與非 Java 人員討論微服務架構:C# 開發人員、Node.JS/JavaScript 開發人員或 Golang 愛好者。 他們都面臨著這樣一個事實:他們需要微服務架構中的編排機制,或者只是一個簡化工作流程並獲得排序、處理超時、Saga 和補償事務的能力的工具。

BPM 平台具有 Camunda 開源 非常適合此類任務。 開發人員友好性是該產品的關鍵特性之一。 但如果你看一下它的文檔,你可能會覺得 Camunda 的“友好”主要是針對 Java 開發人員的。 該平台提供了很多連接您自己的功能和擴展的機會,但這一切都是用 Java 完成的。 是不是真的?

不! 事實上,您無需任何 Java 知識即可輕鬆運行 Camunda,並以您選擇的任何語言設置代碼架構。 在本文中,我們將了解:

  • 基本架構;
  • 休息API
  • 針對 Java 以外的語言的現有客戶端庫的建議;
  • 使用 C# 和 Node.JS 的示例;
  • 啟動 Camunda 服務器(Docker 或 Tomcat)的方法。

架構

Camunda 是用 Java 編寫的,需要 Java 虛擬機 (JVM) 才能運行。 Camunda 提供了一個 REST API,允許您用任何您喜歡的語言編寫並將 REST 與 Camunda 結合使用:

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

Camunda 中的工作流程是在 BPMN 中定義的,BPMN 基本上是一個 XML 文件。 它可以建模為 卡蒙達建模師.

通過預構建的 Docker 鏡像運行 Camunda

運行 Camunda 最簡單的方法是使用 Docker。 本文稍後將介紹啟動 Camunda 的其他方法。

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

在這種情況下,只需運行:

  docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest

您不必擔心 Linux、JVM 或 Tomcat。 Dockerfiles 和基本文檔(例如,連接到所需數據庫的說明)可在以下位置獲取: Github上.

如果您想運行 Camunda 企業版,您可以輕鬆更改 Dockerfile.

然而,使用 Docker 運行 Camunda 有一個缺點:您最終得到的 Tomcat 版本並不總是包含最新的修復程序。 要解決此問題,您可以根據所需的 Tomcat 發行版創建自己的 Docker 映像(如此示例所示),或使用下面描述的解決方案之一。

流程模型部署

讓我們看一個使用 Saga 模板進行經典旅行預訂的示例,您希望連續觸發三個操作,並在以後發生故障時對成功完成的操作進行適當的補償。 以 BPMN 形式表示,如下所示:

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

現在你可以使用 用於流程模型部署的 REST API。 假設您將其保存為 trip.bpmn 並通過 Docker 運行 Camunda,以便它可以在 localhost:8080 上使用:

  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

現在你可以運行 新的工作流程實例 使用 REST API 並將您想要查看的數據作為工作流實例變量傳遞:

  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) 連接器,而且還可以按一種內置順序放置工作項。 然後,工作人員可以通過 REST 獲取工作項、執行工作並告訴 Camunda 完成(拉動原則)。

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

所以首先你需要執行 獲取並鎖定 (因為其他worker可以同時接收任務來擴展系統):

  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

然後告訴卡蒙達 工人完成工作 (請注意,您必須輸入在第一個請求中收到的外部任務 ID):

  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();

更多信息可以在網站上找到 github.com

啟動 Camunda 的其他方式

帶有“Camundastandalone WAR”的自定義 Docker 鏡像

作為 Camunda 預構建 Docker 映像的替代方案,您可以自己準備 Tomcat(例如,基於官方 Docker Tomcat 映像),然後將 Camunda 作為所謂的 WAR 文件之一複製到其中。

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

如果您有很多額外的要求並且可以設置 Java 構建環境,您還可以設置 Camunda Standalone war。 設置 Maven 構建,如以下示例所示: 帶有戰爭配置的 Maven 或組裝 Maven 與覆蓋.

啟動 Camunda Tomcat 發行版

另一種選擇是簡單地下載 Camunda Tomcat 發行版,解壓縮並運行它。 這僅需要在您的計算機上安裝 Java 運行時環境 (JRE)。 它可以很容易地 從這裡下載.

使用 Camunda 基於 REST 和工作流引擎(無 Java)輕鬆編排

為了更改數據庫或執行其他任何操作,您需要像這樣配置 Tomcat 文檔中描述。 我知道 Tomcat 可能聽起來很複雜,但實際上非常簡單。 谷歌知道這個過程中可能需要的所有問題的答案。

使用 Tomcat 運行 Camunda

最後一種選擇是自己設置 Tomcat 並在其中安裝 Camunda, 按照安裝說明進行操作。 例如,您可以選擇使用您喜歡的 Tomcat 版本,或者將其安裝為 Windows 服務。

將 Camunda 投入生產

這通常需要一些最終設置才能運行 Camunda。 Camunda 中有一些指南對此進行了非常詳細的描述,但我不會在本文中對其進行深入討論 - 我將僅舉一個例子:默認情況下,發行版的 REST API 未配置為進行身份驗證。 您可能想改變這一點。

總結

正如您所看到的,無論您使用哪種語言,Camunda 上手都非常容易。 關鍵點是所有交互都是通過 REST API 完成的。 安裝也非常簡單,尤其是使用 Docker 時。

來源: www.habr.com

添加評論