بمرور الوقت ، ينمو كل مشروع ويصبح تنفيذ وظائف جديدة في وحدة متراصة حالية أكثر صعوبة وأطول وأكثر تكلفة للأعمال.
واحد من الحلول لهذه المشكلة هو استخدام بنية microservice. بالنسبة للمبتدئين أو لأولئك الذين جددوا على هذه البنية لأول مرة ، قد يكون من الصعب معرفة من أين نبدأ وما يجب القيام به وما لا يستحق القيام به.
سوف تكتب هذه المقالة أبسط خدمات microservice على Nodejs & RabbitMQ ، كما توضح عملية نقل متراصة إلى خدمات micros.
ما هو في الهندسة المعمارية microservice؟
- العبارة. الخادم الرئيسي الذي يستقبل الطلبات ويعيد توجيهها إلى الخدمة المجهرية المطلوبة. في أكثر الأحيان ، لا يوجد منطق عمل في البوابة.
- Microservice. خدمة microservice نفسها ، والتي تعالج طلبات المستخدم بمنطق أعمال محدد بوضوح.
- النقل. هذا هو الجزء الذي من خلاله ستقوم Gateway & Microservice بالاتصال. قد يكون النقل HTTP ، gRPC ، RabbitMQ ، إلخ.
لماذا RabbitMQ؟
بالطبع ، لا يمكنك استخدام RabbitMQ ، هناك خيارات أخرى للاتصال بين الخدمات الصغيرة. أبسط هو HTTP ، هناك gRPC من جوجل.
أستخدم RabbitMQ ، لأنني أجد أنه من السهل بما فيه الكفاية أن أبدأ في كتابة خدمات micros وموثوقة وملائمة بحيث يمكنك التأكد من أنه عندما يتم إرسال رسالة إلى قائمة الانتظار ، ستصل الرسالة إلى خدمة microservice (حتى إذا تم إيقاف تشغيلها في الوقت الحالي ثم تشغيلها ). بفضل هذه المزايا ، يمكنك كتابة خدمات micros موثوقة واستخدام نشر سلس.
بداية
أولاً ، نقوم بتنفيذ بوابة بسيطة ستتلقى طلبات HTTP أثناء الاستماع إلى منفذ معين.
ننشر RabbitMQ (من خلاله سوف تتواصل خدماتنا الصغيرة والبوابة):
$ docker run -d -p 5672:5672 rabbitmq
نقوم بتهيئة المشروع وتثبيت حزمة micromq NPM:
$ npm init -y $ npm i micromq -S
كتابة بوابة
كيف ستعمل:
- يبدأ الخادم ، يبدأ الاستماع إلى المنفذ وتلقي الطلبات
- يرسل المستخدم طلبًا إلى https://mysite.com/friends
- بوابة ، وفقا للمنطق الذي وصفناه ، يفوض الطلب:
3.1 يتم إرسال رسالة (معلمات الطلب ، الرؤوس ، معلومات الاتصال ، إلخ) إلى قائمة انتظار RabbitMQ
3.2. يستمع Microservice إلى قائمة الانتظار هذه ، بمعالجة طلب جديد
3.3. يرسل Microservice استجابة إلى قائمة الانتظار
3.4. بوابة يستمع لقائمة انتظار استجابة ، يتلقى استجابة من خدمة microservice
3.5. بوابة يرسل استجابة إلى العميل - يتلقى المستخدم استجابة.
نكتب microservice
كيف ستعمل:
- يبدأ microservice ، يبدأ الاستماع إلى قائمة انتظار الطلب التي سيكتب عبارة.
- تتلقى microservice الطلب ، وتقوم بمعالجته ، وتعمل من خلال جميع البرامج الوسيطة المتاحة
- يرسل Microservice استجابة إلى Gateway
3.1. يتم إرسال الرسالة (رؤوس نص استجابة رمز HTTP) إلى قائمة انتظار RabbitMQ
3.2. بوابة يستمع إلى قائمة الانتظار هذه ، يتلقى رسالة ، يجد العميل الذي يحتاج إلى إرسال استجابة
3.3 بوابة يرسل استجابة إلى العميل
الهجرة متراصة إلى بنية microservice
لنفترض أن لدينا بالفعل تطبيقًا صريحًا ، ونريد بدء نقله إلى خدمات micros.
يبدو مثل هذا:
const express = require('express'); const app = express(); app.get('/balance', (req, res) => { res.json({ amount: 500, }); }); app.get('/friends', (req, res) => { res.json([ { id: 1, name: 'Mikhail Semin', }, { id: 2, name: 'Ivan Ivanov', }, ]); }); app.get('/status', (req, res) => { res.json({ text: 'Thinking...', }); }); app.listen(process.env.PORT);
نحن نريد الحصول على 2 نقاط النهاية للخروج منه: / الأصدقاء و / الحالة. ماذا نحتاج أن نفعل لهذا؟
- سحب منطق العمل في microservice
- تنفيذ تفويض طلبات هاتين النهايتين إلى microservice
- الحصول على استجابة من microservice
- إرسال استجابة إلى العميل
في المثال أعلاه ، عندما أنشأنا المستخدمين microservice ، طبقنا طريقتين / أصدقاء و / الحالة ، والتي تفعل الشيء نفسه الذي يقوم به متراصة لدينا.
من أجل إرسال طلبات بالبروكسي إلى خدمة microservice من البوابة ، سنستخدم نفس الحزمة من خلال توصيل الوسيطة بتطبيقنا السريع:
const express = require('express');
هذا يعمل بالطريقة نفسها كما في المثال أعلاه ، حيث كتبنا بوابة نظيفة. في هذا المثال ، يكون الاختلاف الوحيد هو أنه ليست عبارة عن بوابة تقبل الطلبات ، وإنما عبارة عن متراصة مكتوبة صراحة.
ما التالي
- RPC (استدعاء إجراء عن بُعد) من خدمة micros إلى خدمة متراصة / بوابة (على سبيل المثال ، للترخيص)
- التواصل بين microservices من خلال قوائم الانتظار RabbitMQ لمزيد من المعلومات ، لأن كل microservice لديه قاعدة البيانات الخاصة به
لقد قلت هذا بالفعل في المقال "تعلم التواصل بين Microservices على Node.js من خلال RabbitMQ" .