REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Эй Хабр! Сиздердин назарыңыздарга макаланын котормосун сунуштайм "Camunda'ны колдонууга оңой REST негизиндеги оркестрлөө жана иш процесси кыймылдаткычы катары колдонуңуз (Javaга тийбестен)" Бернд Рюкер тарабынан.

07.07.2020, котормо макалалар Бернд Ракер

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Мен микросервис архитектурасын Java эмес адамдар менен көп талкуулайм: C# иштеп чыгуучулары, Node.JS/JavaScript иштеп чыгуучулары же Голанг сүйүүчүлөрү. Алардын бардыгына микросервис архитектурасында оркестрлөө механизми же жөн гана жумуш процессин иретке келтирүү жана заказ кылуу, тайм-ауттарды, Сага жана компенсациялоочу транзакцияларды башкаруу мүмкүнчүлүгүн алуу үчүн курал керек экендигине туш болушат.

BPM платформасы менен Камундадан ачык булак мындай милдеттер үчүн абдан жакшы. Иштеп чыгуучуларга ыңгайлуулугу буюмдун негизги өзгөчөлүктөрүнүн бири болуп саналат. Бирок анын документтерин карасаңыз, Камунданын "достугу" негизинен Java иштеп чыгуучуларына багытталгандай таасир калтырышы мүмкүн. Платформа өз функцияларыңызды жана кеңейтүүлөрүңүздү туташтыруу үчүн көптөгөн мүмкүнчүлүктөрдү камсыз кылат, бирок мунун баары Javaда жасалган. Чын элеби?

Жок! Чындыгында, сиз эч кандай Java билими жок эле Камунданы оңой иштетип, архитектураны өзүңүз каалаган тилде коддоо үчүн конфигурациялай аласыз. Бул макалада биз карап чыгабыз:

  • негизги архитектура;
  • REST API
  • Java тилдеринен башка тилдер үчүн иштеп жаткан кардарлардын китепканалары боюнча кеңеш берүү;
  • мисал C# жана Node.JS колдонуу;
  • Camunda серверин баштоонун жолдору (Docker же Tomcat).

архитектура

Камунда Java тилинде жазылган жана иштетүү үчүн Java Virtual Machine (JVM) керек. Camunda сизге каалаган тилде жазууга жана Camunda менен REST колдонууга мүмкүндүк берген REST API менен камсыз кылат:

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Камундадагы иш процесстери BPMNде аныкталган, ал негизинен XML файлы. Аны менен моделдештирсе болот Камунда модельер.

Камунданы алдын ала түзүлгөн Докер сүрөтү аркылуу иштетүү

Камунданы иштетүүнүн эң оңой жолу - Докерди колдонуу. Камунданы ишке киргизүүнүн альтернативалуу жолдору бул макалада кийинчерээк баяндалат.

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Бул учурда, жөн гана чуркап:

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

Linux, JVMs же Tomcats жөнүндө тынчсыздануунун кереги жок. Докер файлдары жана негизги документтер (мисалы, талап кылынган маалымат базаларына туташуу боюнча нускамалар) дареги боюнча жеткиликтүү Github.

Эгер сиз Camunda Enterprise Edition иштеткиңиз келсе, сиз оңой өзгөртө аласыз докер файлы.

Бирок, Камунданы Docker менен иштетүү бир кемчилиги бар: сиз Tomcat версиясына ээ болосуз, ал дайыма акыркы оңдоолорду камтыбайт. Мунун тегерегинде иштөө үчүн, бул мисалда көрсөтүлгөндөй, керектүү Tomcat дистрибутивинин негизинде өзүңүздүн Docker сүрөтүңүздү түзө аласыз же төмөндө сүрөттөлгөн чечимдердин бирин колдонсоңуз болот.

Процесс моделин жайылтуу

Классикалык саякатка ээлөө үчүн Saga үлгүсүн колдонуунун мисалын карап көрөлү, анда сиз үч аракетти катары менен ишке киргизгиңиз келет жана кийинчерээк ишке ашпай калса, ийгиликтүү аяктаган аракеттердин ордун сонун толтургуңуз келет. BPMN түрүндө көрсөтүлгөн, ал төмөнкүдөй көрүнөт:

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Эми сиз колдоно аласыз Процесс моделин жайылтуу үчүн REST API. Сиз аны trip.bpmn катары сактап, Камунданы Docker аркылуу иштетип, ал 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

Кийинки кызыктуу суроо: Камунда унааны брондоо сыяктуу процедураларды кантип чакырат? Камунда айрым орнотулгандарды колдонуу менен кызматтарды дароо чакыра албайт (Push-Principle). туташтыргычтар, бирок ошондой эле орнотулган тартипте кандайдыр бир иш буюмдарды коюу. Андан кийин жумушчу REST аркылуу жумуш буюмдарын алып келип, ишти аткарып, Камундага аягына чыгарууну айта алат (Пулл-Принцип).

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Ошентип, адегенде аткаруу керек fetchAndLock (анткени башка жумушчулар системаны масштабдоо үчүн бир эле учурда тапшырмаларды ала алышат):

  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's REST API функцияларынын баарын колдойт деп күтпөңүз. Китепкана белгилүү бир функцияны камсыз кылбагандыктан, ал жок дегенди билдирбейт, ар дайым Camunda's 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

Камунданы ишке киргизүүнүн альтернативалуу жолдору

"Камунда автономдуу WAR" менен жеке Docker сүрөтү

Камундадан алдын ала жасалган Docker сүрөтүнө альтернатива катары, сиз Tomcat'ты өзүңүз даярдасаңыз болот (мисалы, расмий Docker Tomcat сүрөттөрүнүн негизинде), андан кийин ага WAR деп аталган файлдардын бири катары Камунданы көчүрө аласыз.

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Эгер сизде көптөгөн кошумча талаптар болсо жана Java куруу чөйрөсүн орното алсаңыз, Камунда автономдуу согушун да орното аласыз. Бул мисалдардагыдай Maven түзүмүн орнотуңуз: куруу Maven согуш конфигурациясы менен же чогулуш Maven менен Overlay.

Camunda Tomcat бөлүштүрүүнү баштоо

Дагы бир вариант - жөн гана Camunda Tomcat бөлүштүрүүнү жүктөп алып, аны ачып, иштетүү. Бул үчүн компьютериңизде орнотулган Java Runtime Environment (JRE) гана талап кылынат. Бул оңой болот бул жерден жүктөп алыңыз.

REST жана Workflow Engine (Java жок) негизинде оңой оркестрлөө үчүн Camunda колдонуу

Маалыматтар базасын өзгөртүү же башка бир нерсе кылуу үчүн Tomcat сыяктуу конфигурациялашыңыз керек документтерде сүрөттөлгөн. Мен Tomcat татаал угулушу мүмкүн экенин билем, бирок бул абдан жөнөкөй. Жана Google процессте талап кылынышы мүмкүн болгон бардык суроолорго жоопторду билет.

Tomcat аркылуу Камунданы иштетүү

Акыркы альтернатива - Tomcat'ти өзүңүз орнотуу жана ага Камунданы орнотуу, орнотуу сүрөттөмөсүнөн кийин. Бул сизге Tomcat'тын кайсы версиясын колдонууга же аны Windows кызматы катары орнотууга мүмкүнчүлүк берет, мисалы.

Камунда өндүрүшкө киргизилүүдө

Бул, адатта, Камунданы иштетүү үчүн акыркы орнотууну талап кылат. Камундада муну майда-чүйдөсүнө чейин сүрөттөгөн көрсөтмөлөр бар, бирок мен бул макалада аларга кирбейм - мен бир эле мисалды атайм: бөлүштүрүүнүн REST API демейки боюнча аутентификация үчүн конфигурацияланган эмес. Сиз муну өзгөрткүңүз келиши мүмкүн.

Жыйынтык чыгаруу

Көрүнүп тургандай, сиз колдонуп жаткан тилге карабастан, Camunda менен баштоо абдан оңой. Негизги нерсе, бардык өз ара аракеттенүү REST API аркылуу ишке ашат. Орнотуу да абдан оңой, айрыкча Dockerди колдонууда.

Source: www.habr.com

Комментарий кошуу