الخدمات المصغّرة باستخدام gRPC
الخدمات المصغّرة باستخدام gRPC
gRPC إطار عمل RPC عالي الأداء ومفتوح المصدر طوّرته Google. يستخدم Protocol Buffers (protobuf) لغةً لتعريف الواجهات وتنسيقًا للنقل عبر الشبكة، مما يمنحك عقودًا موثوقة النوع بشكل كامل، وتسلسلًا ثنائيًا كفؤًا، ودعمًا أصليًا للبث ثنائي الاتجاه — كل ذلك ضروري لتواصل الخدمات المصغّرة في بيئات الإنتاج.
لماذا gRPC بدلًا من REST؟
- عقود محكمة الأنواع — ملف
.protoهو المصدر الوحيد للحقيقة؛ يُولَّد الخادم والعميل منه، مما يزيل أي اختلاف بينهما. - تسلسل ثنائي — يُعدّ protobuf أكثر إيجازًا بـ 3–10 أضعاف وأسرع تحليلًا من JSON.
- دعم البث — بث الخادم، والعميل، وثنائي الاتجاه كلها متوفّرة كمواطنين من الدرجة الأولى.
- توليد الكود — تُولَّد أنواع TypeScript تلقائيًا، مما يمنع فئات كاملة من الأخطاء في وقت التشغيل.
تعريف خدمة protobuf
يبدأ كل شيء بملف .proto. يُعلِن عن الرسائل (أشكال البيانات) والخدمة (دوال RPC). ضعه في مجلد proto/ مشترك في جذر المستودع حتى يتمكّن الخادم والعميل من الإشارة إلى الملف نفسه:
إعداد ناقل gRPC في NestJS
ثبّت الحزم المطلوبة، ثم اضبط main.ts لتشغيل خدمة مصغّرة بناقل gRPC:
تنفيذ معالجات gRPC باستخدام @GrpcMethod
استخدم المزيّن @GrpcMethod() لربط دالة في المتحكّم بتعريف RPC. يجب أن يطابق اسم الدالة اسم RPC في ملف .proto (أو يُمرَّر كوسيط ثانٍ):
الاستدعاءات الأحادية مقابل البث
- أحادي (Unary) — طلب واحد واستجابة واحدة (مثل HTTP المعتاد). يُعالَج بدالة عادية تُعيد قيمة أو Promise.
- بث الخادم — طلب واحد وسيل من الاستجابات. أعِد
Observableمن المعالج؛ سيُصدر NestJS كل قيمة كرسالة protobuf منفصلة. - بث العميل / ثنائي الاتجاه — اقبل
Observableكوسيط أول. أنماط متقدّمة لسيناريوهات الوقت الفعلي.
Observable من معالج @GrpcMethod يحوّله تلقائيًا إلى تدفق بث gRPC من جانب الخادم، مما يُبقي كودك نظيفًا وقابلًا للاختبار.
استدعاء خدمة gRPC من عميل NestJS
أدخِل عميل gRPC عبر @Inject() بعد تسجيله كمزوِّد في ClientsModule. يمنحك وكيل العميل كعبًا موثوق النوع يطابق واجهة ملف .proto:
ts-proto أو protoc مع إضافة TypeScript لتوليد أنواع دقيقة وإبقائها متزامنة كلّما تغيّر الـ proto.
الخلاصة
تتّبع الخدمات المصغّرة عبر gRPC في NestJS نمطًا واضحًا: عرّف العقد في ملف .proto، واضبط ناقل Transport.GRPC في main.ts، وزيّن المعالجات بـ @GrpcMethod(). تُعيد الاستدعاءات الأحادية قيمًا عادية أو Promises؛ وتُعيد استدعاءات بث الخادم Observable من RxJS. تسجّل العملاء مزوّدًا في ClientsModule وتستدعي الخدمة البعيدة بأمان تام من حيث الأنواع. يضمن عقد protobuf أن كلا الطرفين يتحدّثان اللغة ذاتها — حتى عبر لغات برمجة مختلفة.