Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Này Habr! Tôi trình bày với bạn chú ý bản dịch của bài báo “Sử dụng Camunda làm công cụ điều phối và xử lý công việc dựa trên REST dễ sử dụng (không cần chạm vào Java)” của Bernd Rücker.

07.07.2020/XNUMX/XNUMX, dịch thuật Điều Bernd Rücker

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Tôi thường thảo luận về kiến ​​trúc microservice với những người không phải Java: nhà phát triển C#, Node.JS/JavaScript hoặc những người đam mê Golang. Tất cả họ đều phải đối mặt với thực tế là họ cần một công cụ điều phối trong kiến ​​trúc microservice hoặc chỉ là một công cụ để tối ưu hóa quy trình làm việc và có được khả năng đặt hàng, xử lý thời gian chờ, Saga và bù đắp các giao dịch.

Nền tảng BPM với nguồn mở từ Camunda tuyệt vời cho những nhiệm vụ như vậy. Sự thân thiện với nhà phát triển là một trong những tính năng chính của sản phẩm. Nhưng nếu nhìn vào tài liệu của nó, bạn có thể có ấn tượng rằng tính thân thiện của Camunda chủ yếu hướng tới các nhà phát triển Java. Nền tảng này cung cấp nhiều cơ hội để kết nối các chức năng và tiện ích mở rộng của riêng bạn, nhưng tất cả đều được thực hiện bằng Java. Có thực sự vậy không?

KHÔNG! Trên thực tế, bạn có thể dễ dàng chạy Camunda mà không cần bất kỳ kiến ​​thức Java nào và định cấu hình kiến ​​trúc để viết mã bằng bất kỳ ngôn ngữ nào bạn chọn. Trong bài viết này chúng ta sẽ xem xét:

  • kiến trúc cơ bản;
  • API REST;
  • lời khuyên về các thư viện máy khách hiện có cho các ngôn ngữ khác ngoài Java;
  • ví dụ về sử dụng C# và Node.JS;
  • cách chạy máy chủ Camunda (Docker hoặc Tomcat).

kiến trúc

Camunda được viết bằng Java và yêu cầu Máy ảo Java (JVM) để chạy. Camunda cung cấp API REST cho phép bạn viết bằng bất kỳ ngôn ngữ nào bạn thích và sử dụng REST với Camunda:

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Quy trình làm việc trong Camunda được xác định trong BPMN, về cơ bản là một tệp XML. Nó có thể được mô hình hóa bằng cách sử dụng Camunda Modeler.

Chạy Camunda thông qua hình ảnh Docker dựng sẵn

Cách dễ nhất để chạy Camunda là sử dụng Docker. Các cách khác để chạy Camunda sẽ được mô tả sau trong bài viết này.

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Trong trường hợp này, chỉ cần chạy:

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

Bạn không phải lo lắng về Linux, Máy ảo Java hay Tomcats. Dockerfiles và tài liệu cơ bản (ví dụ: hướng dẫn kết nối với cơ sở dữ liệu cần thiết) có sẵn tại Github.

Nếu bạn muốn chạy Camunda Enterprise Edition, bạn có thể dễ dàng thay đổi Dockerfile.

Tuy nhiên, có một nhược điểm khi chạy Camunda bằng Docker: bạn sẽ kết thúc với một phiên bản Tomcat không phải lúc nào cũng bao gồm các bản sửa lỗi mới nhất. Để giải quyết vấn đề này bằng cách nào đó, bạn có thể tự tạo hình ảnh Docker dựa trên bản phân phối Tomcat mong muốn, như trong ví dụ này hoặc sử dụng một trong các giải pháp được mô tả bên dưới.

Triển khai một mô hình quy trình

Hãy xem ví dụ sử dụng mẫu Saga cho đặt chỗ du lịch cổ điển trong đó bạn muốn kích hoạt ba hành động liên tiếp và đền bù một cách khéo léo cho các hành động thành công trong trường hợp thất bại sau này. Được trình bày dưới dạng BPMN, nó trông như thế này:

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Bây giờ bạn có thể sử dụng API REST để triển khai mô hình quy trình. Giả sử bạn đã lưu nó dưới dạng trip.bpmn và chạy Camunda qua Docker để nó có sẵn trên 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

Bây giờ bạn có thể chạy trường hợp quy trình công việc mới sử dụng API REST và truyền dữ liệu bạn muốn xem dưới dạng các biến đối tượng của quy trình làm việc:

  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

Câu hỏi thú vị tiếp theo là Camunda kích hoạt các thủ tục như đặt xe như thế nào? Camunda không chỉ có thể gọi ngay các dịch vụ (Push-Principle), bằng cách sử dụng một số dịch vụ tích hợp sẵn đầu nối, mà còn đặt các mục công việc vào một loại hàng đợi tích hợp sẵn. Sau đó, nhân viên có thể nhận các mục công việc thông qua REST, thực hiện công việc và báo cáo việc hoàn thành cho Camunda (Nguyên tắc kéo).

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Vì vậy, trước tiên bạn cần phải làm tìm nạpAndLock (vì các công nhân khác có thể nhận nhiệm vụ cùng lúc để mở rộng hệ thống):

  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

Vậy hãy nói với Camunda rằng công nhân đã hoàn thành công việc của mình (lưu ý rằng bạn phải nhập ID nhiệm vụ bên ngoài nhận được trong yêu cầu đầu tiên):

  curl 
-H "Content-Type: application/json" 
-X POST 
-d <!-- -->'{"workerId":"worker123", "variables": {}}'<!-- --> 
http://localhost:8080/engine-rest/<!-- -->external-task/EXTERNAL_TASK_ID/complete

Thế là xong - cho đến nay bạn chưa cần bất kỳ Java nào, phải không? Và thế là đủ để bắt đầu!

Thư viện khách hàng

Việc gọi API REST thật dễ dàng bằng bất kỳ ngôn ngữ lập trình nào. Trong JavaScript, thật thuận tiện khi thực hiện việc này bằng JQuery và trong C# bạn có thể sử dụng System.Net.Http và Newtonsoft.Json. Nhưng điều này sẽ mất thời gian. Vì vậy, bạn chỉ có thể sử dụng một số thư viện khách hàng.

Hiện tại có sẵn một số thư viện máy khách được tạo sẵn:

  • jav: liên kết. Được hỗ trợ bởi Camunda;
  • Java: liên kết. Được hỗ trợ bởi Camunda;
  • C #:liên kết и liên kết. Cả hai dự án này đều ở trạng thái trung gian và hầu như không có hoạt động nào, nhưng có thể đóng vai trò là điểm khởi đầu tốt;
  • PHP: liên kết không phải là một thư viện hoàn chỉnh và không bao gồm các thay đổi API mới nhất, nhưng tôi biết các dự án sử dụng nó.

Ngoại trừ JavaScript và Java, các thư viện máy khách không phải là một phần của sản phẩm Camunda. Đừng mong đợi họ hỗ trợ tất cả các tính năng của API REST của Camunda. Chỉ vì thư viện không cung cấp một tính năng nhất định không có nghĩa là nó không có ở đó, hãy luôn kiểm tra Camunda REST API. Các dự án điển hình sử dụng thư viện làm điểm bắt đầu và mẫu.

Ví dụ với C#

Sử dụng thư viện client ở trên, chúng ta có thể viết một cách đơn giản:

  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", "..." }
    });

Mã nguồn làm việc đầy đủ có thể được tìm thấy trực tuyến: liên kết. Một ví dụ khác có sẵn tại liên kết.

Ví dụ với 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();

Thông tin thêm có thể được tìm thấy trên trang web Github.com

Những cách khác để khởi động Camunda

Hình ảnh Docker tùy chỉnh với "Camunda độc lập WAR"

Để thay thế cho hình ảnh Docker dựng sẵn từ Camunda, bạn có thể tự chuẩn bị Tomcat (ví dụ: dựa trên hình ảnh Docker Tomcat chính thức) rồi sao chép Camunda vào đó dưới dạng một trong những tệp được gọi là tệp WAR.

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Nếu bạn có nhiều yêu cầu bổ sung và có thể tùy chỉnh môi trường xây dựng Java, bạn cũng có thể định cấu hình Camunda Standalone war. Thiết lập bản dựng Maven như trong các ví dụ sau: build Maven với cấu hình chiến tranh hoặc lắp ráp Maven với lớp phủ.

Ra mắt bản phân phối Camunda Tomcat

Một tùy chọn khác là chỉ cần tải xuống bản phân phối Camunda Tomcat, giải nén và chạy nó. Để thực hiện việc này, bạn chỉ cần cài đặt Môi trường chạy thi hành Java (JRE) trên máy tính của mình. Nó có thể dễ dàng tải về từ đây.

Sử dụng Camunda để điều phối dễ dàng dựa trên REST và Workflow Engine (không có Java)

Để thay đổi cơ sở dữ liệu hoặc làm bất cứ điều gì khác, bạn cần định cấu hình Tomcat như được mô tả trong tài liệu. Tôi biết Tomcat có vẻ phức tạp nhưng thực ra nó rất đơn giản. Và Google có câu trả lời cho mọi thứ bạn có thể cần trong quá trình này.

Chạy Camunda bằng Tomcat

Cách thay thế cuối cùng là tự cấu hình Tomcat và cài đặt Camunda trong đó, theo mô tả cài đặt. Điều này sẽ mang lại cho bạn cơ hội sử dụng bất kỳ phiên bản Tomcat nào bạn thích hoặc chẳng hạn như cài đặt nó làm dịch vụ Windows.

Đưa Camunda vào sản xuất

Thông thường, điều này sẽ yêu cầu bạn thực hiện một số thiết lập cuối cùng để Camunda chạy. Camunda có các hướng dẫn mô tả điều này rất chi tiết, nhưng tôi sẽ không đề cập đến chúng trong bài viết này - tôi sẽ chỉ đưa ra một ví dụ: API REST của bản phân phối không được định cấu hình để xác thực theo mặc định. Bạn có thể muốn thay đổi điều này.

Tổng kết

Như bạn có thể nhận thấy, việc bắt đầu với Camunda rất dễ dàng, bất kể bạn sử dụng ngôn ngữ nào. Điểm mấu chốt là tất cả giao tiếp được thực hiện thông qua API REST. Việc cài đặt cũng khá đơn giản, đặc biệt khi sử dụng Docker.

Nguồn: www.habr.com

Thêm một lời nhận xét