使用 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 时。

来源: habr.com

添加评论