Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Hei Habr! Untuk perhatian Anda, saya persembahkan terjemahan artikel tersebut "Gunakan Camunda sebagai orkestrasi dan mesin alur kerja berbasis REST yang mudah digunakan (tanpa menyentuh Java)" oleh Bernd Rucker.

07.07.2020/XNUMX/XNUMX, terjemahan Artikel Bernd Rucker

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Saya sering mendiskusikan arsitektur layanan mikro dengan orang non-Jawa: pengembang C#, pengembang Node.JS/JavaScript, atau penggemar Golang. Semuanya dihadapkan pada kenyataan bahwa mereka memerlukan mekanisme orkestrasi dalam arsitektur layanan mikro, atau sekadar alat untuk menyederhanakan alur kerja dan mendapatkan kemampuan untuk memesan, menangani batas waktu, Saga, dan mengkompensasi transaksi.

Platform BPM dengan sumber terbuka dari Camunda bagus untuk tugas seperti itu. Keramahan pengembang adalah salah satu fitur utama produk. Namun jika melihat dokumentasinya, Anda mungkin mendapat kesan bahwa "keramahan" Camunda terutama ditujukan untuk pengembang Java. Platform ini menyediakan banyak pilihan untuk menghubungkan fungsi dan ekstensi Anda sendiri, tetapi semuanya dilakukan di Java. Benarkah?

TIDAK! Faktanya, mudah untuk menjalankan Camunda tanpa pengetahuan Java apa pun dan menyiapkan arsitektur untuk kode dalam bahasa apa pun pilihan Anda. Pada artikel ini, kita akan melihat:

  • arsitektur dasar;
  • API REST
  • saran tentang perpustakaan klien yang ada untuk bahasa selain Java;
  • contoh menggunakan C# dan Node.JS;
  • cara untuk memulai server Camunda (Docker atau Tomcat).

Arsitektur

Camunda ditulis dalam Java dan memerlukan Java Virtual Machine (JVM) untuk dijalankan. Camunda menyediakan REST API yang memungkinkan Anda menulis dalam bahasa apa pun yang Anda suka dan menggunakan REST dengan Camunda:

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Alur kerja di Camunda didefinisikan dalam BPMN, yang pada dasarnya adalah file XML. Itu bisa dimodelkan dengan Pemodel Camunda.

Menjalankan Camunda melalui image Docker yang sudah dibuat sebelumnya

Cara termudah untuk menjalankan Camunda adalah dengan menggunakan Docker. Cara alternatif untuk meluncurkan Camunda dijelaskan nanti di artikel ini.

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Dalam hal ini, jalankan saja:

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

Anda tidak perlu khawatir tentang Linux, JVM atau Tomcats. File Docker dan dokumentasi dasar (misalnya, instruksi untuk menyambung ke database yang diperlukan) tersedia di Github.

Jika Anda ingin menjalankan Camunda Enterprise Edition Anda dapat dengan mudah mengubahnya Dockerfile.

Namun, menjalankan Camunda dengan Docker memiliki satu kelemahan: Anda akan mendapatkan versi Tomcat yang tidak selalu menyertakan perbaikan terbaru. Untuk mengatasinya, Anda dapat membuat image Docker Anda sendiri berdasarkan distribusi Tomcat yang diinginkan, seperti yang ditunjukkan dalam contoh ini, atau gunakan salah satu solusi yang dijelaskan di bawah.

Penerapan Model Proses

Mari kita lihat contoh penggunaan templat Saga untuk pemesanan perjalanan klasik di mana Anda ingin memicu tiga tindakan berturut-turut dan memberikan kompensasi yang baik untuk tindakan yang berhasil diselesaikan jika terjadi kegagalan di kemudian hari. Jika direpresentasikan dalam bentuk BPMN, tampilannya seperti ini:

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Sekarang Anda dapat menggunakan REST API untuk penerapan model proses. Katakanlah Anda menyimpannya sebagai trip.bpmn dan menjalankan Camunda melalui Docker sehingga tersedia di 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

Sekarang kamu bisa lari contoh alur kerja baru menggunakan REST API dan meneruskan data yang ingin Anda lihat sebagai variabel instan alur kerja:

  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

Pertanyaan menarik selanjutnya adalah: bagaimana prosedur panggilan Camunda seperti pemesanan mobil? Camunda tidak hanya dapat memanggil layanan secara instan (Prinsip Push) menggunakan beberapa layanan bawaan konektor, tetapi juga meletakkan item pekerjaan dalam urutan bawaan. Pekerja kemudian dapat mengambil item pekerjaan melalui REST, melakukan pekerjaan, dan memberitahu Camunda untuk menyelesaikannya (Prinsip Tarik).

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Jadi pertama-tama Anda perlu mengeksekusi ambilDanKunci (karena pekerja lain dapat menerima tugas pada saat yang sama untuk menskalakan sistem):

  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

Kalau begitu beritahu Camunda itu pekerja menyelesaikan pekerjaan (perhatikan bahwa Anda harus memasukkan id tugas eksternal yang diterima pada permintaan pertama):

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

Itu saja - Anda masih belum memerlukan Java apa pun, bukan? Dan itu cukup untuk memulai!

Perpustakaan Klien

Memanggil REST API mudah dilakukan dalam bahasa pemrograman apa pun. Dalam JavaScript, hal ini mudah dilakukan menggunakan JQuery, dan dalam C#, menggunakan System.Net.Http dan Newtonsoft.Json. Tapi ini akan memakan waktu. Jadi Anda bisa menggunakan beberapa perpustakaan klien.

Saat ini, beberapa perpustakaan klien siap pakai tersedia:

  • javascript: link. Didukung oleh Camunda;
  • Jawa: link. Didukung oleh Camunda;
  • C #:link и link. Kedua proyek ini berada dalam tahap peralihan dan praktis tidak aktif, namun dapat berfungsi sebagai titik awal yang baik;
  • PHP: link - tidak terlalu lengkap dan tidak menyertakan perubahan API terbaru, tapi saya tahu proyek yang menggunakannya.

Dengan pengecualian JavaScript dan Java, perpustakaan klien bukan bagian dari produk Camunda itu sendiri. Jangan berharap mereka mendukung semua fitur REST API Camunda. Hanya karena perpustakaan tidak menyediakan fungsi tertentu bukan berarti tidak ada, selalu periksa REST API Camunda. Proyek referensi menggunakan perpustakaan sebagai titik awal dan templat.

contoh C#

Dengan menggunakan perpustakaan klien di atas, kita cukup menulis:

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

Kode sumber yang berfungsi penuh dapat ditemukan online: link. Contoh lain tersedia di link.

Contoh dengan 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();

Informasi lebih lanjut dapat ditemukan di situs web github.com

Cara Alternatif Meluncurkan Camunda

Gambar Docker khusus dengan "Camunda standalone WAR"

Sebagai alternatif dari image Docker yang dibuat sebelumnya dari Camunda, Anda dapat menyiapkan Tomcat sendiri (misalnya, berdasarkan image Docker Tomcat resmi) dan kemudian menyalin Camunda ke dalamnya sebagai salah satu yang disebut file WAR.

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Jika Anda memiliki banyak persyaratan tambahan dan dapat menyiapkan lingkungan build Java, Anda juga dapat menyiapkan perang Camunda Standalone. Siapkan build Maven seperti pada contoh berikut: build Maven dengan konfigurasi perang atau perakitan Maven dengan Hamparan.

Memulai distribusi Camunda Tomcat

Pilihan lainnya adalah dengan mengunduh distribusi Camunda Tomcat, mengekstraknya, dan menjalankannya. Ini hanya memerlukan Java Runtime Environment (JRE) yang terinstal di komputer Anda. Itu bisa dengan mudah unduh dari sini.

Menggunakan Camunda untuk orkestrasi yang mudah berdasarkan REST dan Workflow Engine (tanpa Java)

Untuk mengubah database atau melakukan hal lain, Anda perlu mengkonfigurasi seperti Tomcat dijelaskan dalam dokumentasi. Saya tahu Tomcat mungkin terdengar rumit, tapi sebenarnya sangat sederhana. Dan Google mengetahui jawaban atas segala hal yang mungkin diperlukan dalam proses tersebut.

Menjalankan Camunda menggunakan Tomcat

Alternatif terakhir adalah dengan mengkonfigurasi Tomcat sendiri dan menginstal Camunda ke dalamnya, mengikuti deskripsi instalasi. Ini akan memberi Anda pilihan untuk menggunakan versi Tomcat mana pun yang Anda sukai, atau menginstalnya sebagai layanan Windows, misalnya.

Meluncurkan Camunda ke dalam produksi

Ini biasanya memerlukan beberapa pengaturan akhir untuk menjalankan Camunda. Ada pedoman di Camunda yang menjelaskan hal ini dengan sangat rinci, tetapi saya tidak akan membahasnya di artikel ini - saya hanya akan menyebutkan satu contoh: REST API distribusi tidak dikonfigurasi untuk otentikasi secara default. Anda mungkin ingin mengubahnya.

Penyajian terakhir

Seperti yang Anda lihat, sangat mudah untuk memulai dengan Camunda, apa pun bahasa yang Anda gunakan. Poin kuncinya adalah semua interaksi dilakukan melalui REST API. Instalasinya juga cukup mudah, terutama jika menggunakan Docker.

Sumber: www.habr.com

Tambah komentar