Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Salut Habr ! Je présente à votre attention la traduction de l'article "Utilisez Camunda comme moteur d'orchestration et de flux de travail basé sur REST facile à utiliser (sans toucher à Java)" de Bernd Rücker.

07.07.2020/XNUMX/XNUMX, traduction articles Bernd Rucker

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Je discute souvent de l'architecture des microservices avec des personnes non Java : développeurs C#, développeurs Node.JS/JavaScript ou aficionados de Golang. Tous sont confrontés au fait qu'ils ont besoin d'un mécanisme d'orchestration dans une architecture de microservices, ou simplement d'un outil pour rationaliser le flux de travail et acquérir la possibilité de commander, de gérer les délais d'attente, les Saga et les transactions compensatoires.

Plateforme BPM avec open source de Camunda idéal pour de telles tâches. La convivialité pour les développeurs est l’une des principales caractéristiques du produit. Mais si vous regardez sa documentation, vous pourriez avoir l'impression que la « convivialité » de Camunda s'adresse principalement aux développeurs Java. La plate-forme offre de nombreuses options pour connecter vos propres fonctions et extensions, mais tout est réalisé en Java. Est ce que c'est vraiment?

Non! En fait, vous pouvez facilement exécuter Camunda sans aucune connaissance Java et configurer l'architecture du code dans n'importe quel langage de votre choix. Dans cet article, nous examinerons :

  • architecture de base ;
  • API REST
  • des conseils sur les bibliothèques clientes existantes pour les langages autres que Java ;
  • exemple utilisant C# et Node.JS ;
  • façons de démarrer le serveur Camunda (Docker ou Tomcat).

Architecture

Camunda est écrit en Java et nécessite une machine virtuelle Java (JVM) pour fonctionner. Camunda fournit une API REST qui vous permet d'écrire dans n'importe quelle langue de votre choix et d'utiliser REST avec Camunda :

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Les flux de travail dans Camunda sont définis dans BPMN, qui est essentiellement un fichier XML. Il peut être modélisé avec Modeleur Camunda.

Exécuter Camunda via une image Docker prédéfinie

Le moyen le plus simple d’exécuter Camunda est d’utiliser Docker. D'autres moyens de lancer Camunda sont décrits plus loin dans cet article.

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Dans ce cas, exécutez simplement :

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

Vous n'avez pas à vous soucier de Linux, des JVM ou des Tomcats. Les fichiers Docker et la documentation de base (par exemple, les instructions de connexion aux bases de données requises) sont disponibles sur Github.

Si vous souhaitez exécuter Camunda Enterprise Edition, vous pouvez facilement modifier Dockerfile.

Cependant, exécuter Camunda avec Docker présente un inconvénient : vous vous retrouverez avec une version de Tomcat qui n'inclut pas toujours les derniers correctifs. Pour contourner ce problème, vous pouvez créer votre propre image Docker basée sur la distribution Tomcat souhaitée, comme indiqué dans cet exemple, ou utiliser l'une des solutions décrites ci-dessous.

Déploiement du modèle de processus

Regardons un exemple utilisant le modèle Saga pour une réservation de voyage classique dans laquelle vous souhaitez déclencher trois actions d'affilée et compenser gracieusement les actions terminées avec succès en cas d'échec ultérieur. Représenté sous forme BPMN, cela ressemble à ceci :

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Maintenant, vous pouvez utiliser API REST pour le déploiement de modèles de processus. Supposons que vous l'enregistriez sous trip.bpmn et que vous exécutiez Camunda via Docker pour qu'il soit disponible sur 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

Maintenant tu peux courir nouvelles instances de flux de travail à l'aide de l'API REST et transmettez les données que vous souhaitez voir en tant que variables d'instance de workflow :

  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

La prochaine question intéressante est : comment Camunda appelle-t-elle les procédures telles que la réservation d’une voiture ? Camunda peut non seulement appeler les services immédiatement (Principe Push) en utilisant certains éléments intégrés connecteurs, mais également placer les éléments de travail dans une sorte d'ordre intégré. Le travailleur peut ensuite récupérer les éléments de travail via REST, effectuer le travail et demander à Camunda de le terminer (principe Pull).

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Vous devez donc d'abord exécuter récupérerEtVerrouiller (car d'autres travailleurs peuvent recevoir des tâches en même temps pour faire évoluer le système) :

  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

Alors dis à Camunda que le travailleur a terminé son travail (notez que vous devez saisir l'identifiant de la tâche externe reçu lors de la première requête) :

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

Ça y est, vous n'avez toujours pas besoin de Java, n'est-ce pas ? Et c'est suffisant pour commencer !

Bibliothèques clientes

Appeler une API REST est simple dans n’importe quel langage de programmation. En JavaScript, cela se fait facilement à l'aide de JQuery et en C#, à l'aide de System.Net.Http et Newtonsoft.Json. Mais cela prendra du temps. Vous pouvez donc simplement utiliser une bibliothèque cliente.

À l'heure actuelle, plusieurs bibliothèques clientes prêtes à l'emploi sont disponibles :

  • JavaScript: lien. Soutenu par Camunda ;
  • Java: lien. Soutenu par Camunda ;
  • C #:lien и lien. Ces deux projets sont dans un état intermédiaire et pratiquement endormis, mais peuvent constituer un bon point de départ ;
  • PHP: lien - pas trop complet et n'inclut pas les dernières modifications de l'API, mais je connais des projets qui l'utilisent.

À l'exception de JavaScript et Java, les bibliothèques clientes ne font pas partie du produit Camunda lui-même. Ne vous attendez pas à ce qu'ils prennent en charge toutes les fonctionnalités de l'API REST de Camunda. Ce n'est pas parce qu'une bibliothèque ne fournit pas une certaine fonction qu'elle n'est pas là, vérifiez toujours l'API REST de Camunda. Les projets de référence utilisent des bibliothèques comme point de départ et modèle.

Exemple C#

En utilisant la bibliothèque client ci-dessus, nous pouvons simplement écrire :

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

Le code source entièrement fonctionnel peut être trouvé en ligne : lien. Un autre exemple est disponible sur lien.

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

Plus d'informations peuvent être trouvées sur le site Web Github.com

Façons alternatives de lancer Camunda

Image Docker personnalisée avec "Camunda standalone WAR"

Comme alternative à une image Docker prédéfinie de Camunda, vous pouvez préparer Tomcat vous-même (par exemple, sur la base des images Docker Tomcat officielles), puis y copier Camunda en tant que l'un des fichiers WAR.

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Si vous avez de nombreuses exigences supplémentaires et pouvez configurer un environnement de construction Java, vous pouvez également configurer Camunda Standalone War. Configurez un build Maven comme dans ces exemples : build Maven avec configuration de guerre ou assemblage Maven avec superposition.

Démarrage de la distribution Camunda Tomcat

Une autre option consiste simplement à télécharger la distribution Camunda Tomcat, à la décompresser et à l'exécuter. Cela nécessite uniquement que Java Runtime Environment (JRE) soit installé sur votre ordinateur. Cela peut être facilement télécharger à partir d'ici.

Utilisation de Camunda pour une orchestration facile basée sur REST et Workflow Engine (pas de Java)

Pour modifier la base de données ou faire autre chose, vous devez configurer Tomcat comme décrit dans la documentation. Je sais que Tomcat peut paraître compliqué, mais c'est en réalité très simple. Et Google connaît les réponses à tout ce qui peut être requis dans le processus.

Exécuter Camunda avec Tomcat

La dernière alternative consiste à configurer Tomcat vous-même et à y installer Camunda, en suivant la description de l'installation. Cela vous donnera la possibilité d'utiliser la version de Tomcat que vous préférez ou de l'installer en tant que service Windows, par exemple.

Lancement de Camunda en production

Cela nécessitera généralement une configuration finale pour exécuter Camunda. Il existe des directives dans Camunda qui décrivent cela de manière très détaillée, mais je ne les aborderai pas dans cet article - je ne citerai qu'un exemple : l'API REST de la distribution n'est pas configurée pour l'authentification par défaut. Vous voudrez peut-être changer cela.

Résumant

Comme vous pouvez le constater, il est très simple de démarrer avec Camunda, quelle que soit la langue que vous utilisez. Le point clé est que toutes les interactions se font via l’API REST. L'installation est également assez simple, surtout lorsque vous utilisez Docker.

Source: habr.com

Ajouter un commentaire