Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Bonjour Habr ! Je vous présente la traduction de l'article «Utilisez Camunda comme un moteur d'orchestration et de flux de travail REST facile à utiliser (sans toucher à Java)» auteur Bernd Rücker.

07.07.2020, traduction article Bernd Rücker

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Je discute souvent de l'architecture microservices avec des personnes qui ne connaissent pas Java : des développeurs C#, Node.JS/JavaScript ou des adeptes de Golang. Ils rencontrent tous le besoin d'un mécanisme d'orchestration dans l'architecture microservices ou simplement d'un outil pour optimiser le flux de travail, permettant d'organiser, de gérer des délais, des saga et des transactions compensatoires.

La plateforme BPM avec code source ouvert de Camunda est parfaitement adaptée à ces tâches. La convivialité pour les développeurs est l'une des caractéristiques clés du produit. Cependant, en consultant sa documentation, il peut sembler que la « convivialité » de Camunda est principalement destinée aux développeurs Java. La plateforme offre de nombreuses possibilités d'intégration de fonctionnalités et d'extensions personnalisées, mais tout cela se fait en Java. Est-ce vraiment le cas ?

Non ! En réalité, il est facile de lancer Camunda sans aucune connaissance de Java et de configurer l'architecture pour du code dans n'importe quel langage de votre choix. Dans cet article, nous allons examiner :

  • l'architecture de base ;
  • l'API REST ;
  • des conseils sur les bibliothèques clientes existantes pour des langages autres que Java ;
  • un exemple d'utilisation de C# et Node.JS ;
  • les manières de lancer 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 quel langage que vous aimez et d'utiliser REST avec Camunda :

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Les workflows dans Camunda sont définis en BPMN, qui est essentiellement un fichier XML. Ils peuvent être modélisés à l'aide de Camunda Modeler.

Lancer Camunda via une image Docker préconçue

Le moyen le plus simple de lancer Camunda est d'utiliser Docker. D'autres méthodes de lancement de Camunda sont décrites plus loin dans cet article.

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Dans ce cas, il suffit de lancer :

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

Vous n'avez pas à vous soucier de Linux, des machines virtuelles Java ou de Tomcat. Les Dockerfiles et la documentation principale (par exemple, les instructions pour se connecter aux bases de données appropriées) sont disponibles sur Github.

Si vous souhaitez lancer Camunda Enterprise Edition, vous pouvez facilement modifier Dockerfile.

Cependant, le lancement de Camunda avec Docker présente un inconvénient : vous obtiendrez une version de Tomcat qui n'inclut pas toujours les derniers correctifs. Pour contourner cela, vous pouvez créer vous-même une 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

Examinons un exemple en utilisant le modèle Saga pour la réservation classique de voyages, où vous souhaitez appeler trois actions consécutives et correctement compenser les actions réussies en cas d'échec ultérieur. Présenté sous forme de BPMN, cela ressemble à ceci :

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Vous pouvez désormais utiliser API REST pour déployer le modèle de processus. Supposons que vous l'ayez enregistré sous le nom trip.bpmn et que vous ayez lancé Camunda via Docker pour qu'il soit accessible 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 "trip.bpmn=@trip.bpmn" 
http://localhost:8080/engine-rest/deployment/creat

Vous pouvez maintenant démarrer de nouveaux exemplaires du processus à l'aide de l'API REST et transmettre les données que vous souhaitez voir comme variables de l'exemplaire du processus :

  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

Une autre question intéressante : comment Camunda appelle-t-elle des procédures telles que la réservation de voitures ? Camunda peut non seulement appeler immédiatement des services (principe Push), en utilisant certains connecteurs intégrés connecteurs, mais également placer des éléments de travail dans un type de file d'attente intégrée. Ensuite, le worker peut récupérer les éléments de travail via REST, effectuer la tâche et informer Camunda de l'achèvement (principe Pull).

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Ainsi, la première étape consiste à exécuter fetchAndLock (car d'autres workers peuvent récupérer 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

Ensuite, informez Camunda que le worker a terminé le travail (notez que vous devez saisir l'identifiant de la tâche externe reçu dans 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

Voilà, vous n'avez toujours pas eu besoin de Java, n'est-ce pas ? Et c'est suffisant pour commencer !

Bibliothèques clientes

Appeler l'API REST est facile dans n'importe quel langage de programmation. En JavaScript, il est pratique de le faire avec JQuery, et en C#, d'utiliser System.Net.Http et Newtonsoft.Json. Mais cela prendra du temps. Vous pouvez donc simplement utiliser une bibliothèque cliente.

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

  • JavaScript: lien. Camunda est pris en charge ;
  • Java : lien. Camunda est pris en charge ;
  • C# :lien et lien. Ces deux projets sont en état intermédiaire et pratiquement inactifs, mais peuvent servir de bon point de départ ;
  • PHP : lien — bibliothèque pas très complète et ne comprenant pas les dernières modifications de l'API, mais je connais des projets qui l'utilisent.

À l'exception de JavaScript et de Java, les bibliothèques clientes ne font pas partie du produit Camunda lui-même. Ne vous attendez pas à ce qu'elles prennent en charge toutes les fonctionnalités de l'API REST de Camunda. Si une bibliothèque ne fournit pas une fonctionnalité particulière, cela ne signifie pas qu'elle n'existe pas, vérifiez toujours l'API REST de Camunda. Les projets standards utilisent les bibliothèques comme point de départ et modèle.

Exemple avec C#

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

  var camunda = new CamundaEngineClient("http://localhost:8080/engine-rest/engine/default/", null, null);
  // Déployer le fichier XML BPMN à partir des ressources
  camunda.RepositoryService.Deploy("trip-booking", new List {
        FileParameter.FromManifestResource(Assembly.GetExecutingAssembly(), "FlowingTripBookingSaga.Models.FlowingTripBookingSaga.bpmn")
     });
  
  // Enregistrer des travailleurs
  registerWorker("reserve-car", externalTask => {
    // ici vous pouvez faire le vrai travail ! Comme un sysout :-)
    Console.WriteLine("Réservation de la voiture...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("cancel-car", externalTask => {
    Console.WriteLine("Annulation de la voiture...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  registerWorker("book-hotel", externalTask => {
    Console.WriteLine("Réservation de l'hôtel...");
    camunda.ExternalTaskService.Complete(workerId, externalTask.Id);
  });
  // Enregistrer plus de travailleurs...
  
  StartPolling();
  
  string processInstanceId = camunda.BpmnWorkflowService.StartProcessInstance("FlowingTripBookingSaga", new Dictionary()
    {
      {"someBookingData", "..." }
    });

Le code source fonctionnel complet peut être trouvé sur Internet : lien. Un autre exemple est disponible à l'adresse lien.

Пример с 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 + " - ajout de quelque chose";
    callback(null, {
      variables: {
        someNewData: someNewData
      }
    });
  });
  
  workers.shutdown();

Vous pouvez trouver plus d'informations sur le site Web github.com

Méthodes alternatives pour démarrer Camunda

Image Docker personnalisée avec « Camunda standalone WAR »

En alternative à l'image Docker prête à l'emploi de Camunda, vous pouvez préparer Tomcat vous-même (par exemple, à partir des images Docker officielles de Tomcat) et ensuite y copier Camunda en tant qu'un des fichiers WAR.

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans Java)

Si vous avez de nombreuses exigences supplémentaires et que vous pouvez configurer l'environnement de construction Java, vous pouvez également configurer Camunda Standalone WAR. Configurez la construction Maven comme dans ces exemples : construction Maven avec configuration WAR ou construction Maven avec Overlay.

Démarrer la distribution Camunda Tomcat

Une autre option est simplement de télécharger la distribution Camunda Tomcat, de la décompresser et de la lancer. Pour cela, vous n'aurez besoin que de l'environnement d'exécution Java (JRE) installé sur votre ordinateur. Vous pouvez facilement le télécharger ici.

Utilisation de Camunda pour une orchestration facile basée sur REST et un moteur de workflow (sans 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 sembler complexe, mais en réalité, c'est très simple. Et Google connaît les réponses à toutes les questions que vous pourriez avoir pendant le processus.

Démarrer Camunda avec Tomcat

La dernière alternative est de configurer Tomcat vous-même et d'y installer Camunda, en suivant les instructions d'installation. Cela vous permettra d'utiliser n'importe quelle version de Tomcat que vous préférez, ou par exemple, de l'installer comme un service Windows.

Démarrer Camunda en production

En général, il sera nécessaire d'effectuer quelques réglages finaux pour démarrer Camunda. Dans Camunda, il existe des recommandations qui décrivent cela en détail, mais je ne vais pas les aborder dans cet article — je vais simplement mentionner un exemple : l'API REST de la distribution par défaut n'est pas configurée pour l'authentification. Vous voudrez peut-être modifier cela.

Conclusion

Comme vous avez pu le remarquer, commencer à travailler avec Camunda est très simple, quelle que soit la langue que vous utilisez. L'élément clé est que toutes les interactions se font via l'API REST. L'installation est également assez simple, surtout si vous utilisez Docker.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster