Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

おい、ハブル! 記事の翻訳をご紹介します 「(Java に触れずに)使いやすい REST ベースのオーケストレーションおよびワークフロー エンジンとして Camunda を使用する」 ベルント・リュッカー著。

07.07.2020/XNUMX/XNUMX、翻訳 記事 ベルント・ラッカー

Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

私は、Java 以外の人々 (C# 開発者、Node.JS/JavaScript 開発者、Golang 愛好家など) とマイクロサービス アーキテクチャについてよく話し合います。 彼らは皆、マイクロサービス アーキテクチャのオーケストレーション メカニズムが必要である、あるいはワークフローを合理化し、注文、タイムアウト、サーガ、トランザクションの補正を処理する機能を獲得するための単なるツールが必要であるという事実に直面しています。

BPM プラットフォーム Camunda のオープンソース このようなタスクに最適です。 開発者への使いやすさは、この製品の重要な機能の XNUMX つです。 しかし、そのドキュメントを見ると、Camunda の「親しみやすさ」は主に Java 開発者を対象としているという印象を受けるかもしれません。 このプラットフォームには、独自の関数や拡張機能を接続するためのオプションが多数用意されていますが、すべて Java で行われます。 本当か?

いいえ! 実際、Java の知識がなくても Camunda を簡単に実行でき、任意の言語でコードのアーキテクチャをセットアップできます。 この記事では、以下について見ていきます。

  • 基本的なアーキテクチャ。
  • REST API
  • Java 以外の言語の既存のクライアント ライブラリに関するアドバイス。
  • C# と Node.JS を使用した例。
  • Camunda サーバー (Docker または Tomcat) を起動する方法。

アーキテクチャ

Camunda は Java で書かれており、実行するには Java 仮想マシン (JVM) が必要です。 Camunda は、好きな言語で記述し、Camunda で REST を使用できるようにする REST API を提供します。

Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

Camunda のワークフローは、基本的に XML ファイルである BPMN で定義されます。 でモデル化できます カムンダモデラー.

事前に構築された Docker イメージを介して Camunda を実行する

Camunda を実行する最も簡単な方法は、Docker を使用することです。 Camunda を起動する別の方法については、この記事の後半で説明します。

Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

この場合は、次のコマンドを実行するだけです。

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

Linux、JVM、Tomcat について心配する必要はありません。 Dockerfile と基本的なドキュメント (必要なデータベースへの接続手順など) は、次の場所から入手できます。 githubの.

Camunda Enterprise Edition を実行したい場合は、簡単に変更できます ドッカーファイル.

ただし、Docker で Camunda を実行することには欠点が XNUMX つあります。それは、常に最新の修正が含まれていないバージョンの Tomcat が使用されることです。 これを回避するには、この例に示すように、目的の Tomcat ディストリビューションに基づいて独自の Docker イメージを作成するか、以下で説明するソリューションのいずれかを使用します。

プロセスモデルの導入

従来の旅行予約に Saga テンプレートを使用した例を見てみましょう。この例では、XNUMX つのアクションを連続してトリガーし、後で失敗した場合に正常に完了したアクションを適切に補正する必要があります。 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 は、いくつかの組み込み機能を使用してサービスをすぐに呼び出すことができるだけではありません (プッシュ原則)。 コネクタだけでなく、作業項目を一種の組み込みの順序で配置することもできます。 その後、ワーカーは REST 経由で作業項目をフェッチし、作業を実行し、Camunda に完了するように指示できます (プル原則)。

Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

したがって、最初に実行する必要があります フェッチアンドロック (他のワーカーがシステムを拡張するために同時にタスクを受け取ることができるため):

  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: リンク。 Camunda によるサポート。
  • Java: リンク。 Camunda によるサポート。
  • 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 を起動する別の方法

「Camunda スタンドアロン WAR」を使用したカスタム Docker イメージ

Camunda から事前に構築された Docker イメージの代わりに、Tomcat を自分で準備し (たとえば、公式の Docker Tomcat イメージに基づいて)、それに Camunda をいわゆる WAR ファイルの XNUMX つとしてコピーすることができます。

Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

多くの追加要件があり、Java ビルド環境をセットアップできる場合は、Camunda Standalone war をセットアップすることもできます。 次の例のように Maven ビルドをセットアップします。 war 構成を備えた Maven または組み立て オーバーレイを使用した Maven.

Camunda Tomcat ディストリビューションの開始

もう XNUMX つのオプションは、Camunda Tomcat ディストリビューションをダウンロードし、解凍して実行することです。 これには、コンピュータに Java ランタイム環境 (JRE) がインストールされているだけで済みます。 簡単にできます ここからダウンロード.

Camunda を使用して REST とワークフロー エンジン (Java なし) に基づいた簡単なオーケストレーションを実現

データベースを変更したり、その他のことを行うには、Tomcat を次のように設定する必要があります。 ドキュメントに記載されている。 Tomcat は複雑に聞こえるかもしれませんが、実際は非常に簡単です。 そして Google は、そのプロセスで必要となる可能性のあるすべてに対する答えを知っています。

Tomcat を使用して Camunda を実行する

最後の選択肢は、Tomcat を自分でセットアップし、そこに Camunda をインストールすることです。 インストールの説明に続いて。 これにより、Tomcat の任意のバージョンを使用するか、たとえば Windows サービスとしてインストールするかを選択できます。

Camunda の運用開始

通常、これには Camunda を実行するための最終セットアップが必要になります。 Camunda にはこれについて詳しく説明したガイドラインがありますが、この記事では詳しく説明しません。一例だけを挙げます。ディストリビューションの REST API は、デフォルトでは認証用に構成されていません。 これを変更することもできます。

締め括り

ご覧のとおり、使用している言語に関係なく、Camunda を使い始めるのは非常に簡単です。 重要な点は、すべての対話が REST API を通じて行われるということです。 特に Docker を使用する場合、インストールも非常に簡単です。

出所: habr.com

コメントを追加します