Hei Habr! Untuk perhatian Anda, saya persembahkan terjemahan artikel tersebut oleh Bernd Rucker.
07.07.2020/XNUMX/XNUMX, terjemahan Bernd Rucker

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 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:

Alur kerja di Camunda didefinisikan dalam BPMN, yang pada dasarnya adalah file XML. Itu bisa dimodelkan dengan .
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.

Dalam hal ini, jalankan saja:
docker run -d -p 8080:8080 camunda/camunda-bpm-platform:latest
Anda tidak perlu khawatir tentang Linux, mesin virtual Java, atau Tomcat. Dockerfile dan dokumentasi dasar (seperti petunjuk tentang cara terhubung ke basis data yang dibutuhkan) tersedia di .
Jika Anda ingin menjalankan Camunda Enterprise Edition Anda dapat dengan mudah mengubahnya .
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:

Sekarang Anda dapat menggunakan . 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 "trip.bpmn=@trip.bpmn"
http://localhost:8080/engine-rest/deployment/creat
Sekarang kamu bisa lari 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 , 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).

Jadi pertama-tama Anda perlu mengeksekusi (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 (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: . Didukung oleh Camunda;
- Jawa: . Didukung oleh Camunda;
- C #: и . Kedua proyek ini berada dalam tahap peralihan dan praktis tidak aktif, namun dapat berfungsi sebagai titik awal yang baik;
- PHP: - 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: . Contoh lain tersedia di .
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
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.

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 atau perakitan .
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 .

Untuk mengubah database atau melakukan hal lain, Anda perlu mengkonfigurasi seperti Tomcat . 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, Ini akan memberi Anda pilihan untuk menggunakan versi Tomcat apa pun yang Anda sukai, atau, misalnya, menginstalnya sebagai layanan. Windows.
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
