嘿哈布尔! 我向您展示这篇文章的翻译
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 时。
来源: habr.com