gRPC في TypeScript: متى تستخدمه وكيف سيسرع مشروعك

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: هل مات REST؟ تحيا gRPC!



هل سبق لك أن أمسكت بنفسك تفكر أن REST API الخاص بك يعمل مثل البريد القديم - ترسل طلبًا وتنتظر الرد، ثم تقوم بتحليل JSON الذي يزن أكثر من البيانات نفسها؟ إذا كان الأمر كذلك، فمرحبًا بك في عالم gRPC في TypeScript. تعد هذه التقنية بالسرعة، ودقة الأنواع، ونقل البيانات المتدفق. ولكن، مثل أي أداة قوية، فإن gRPC ليست رصاصة فضية. في هذه المقالة، سنحلل متى يجب استخدامها، ومتى يكون البقاء على REST المألوف أفضل. وكل هذا - مع أمثلة حية على TypeScript، لأن النظرية الجافة مملة.



سنتحدث عن كيف تغير gRPC قواعد اللعبة في الميكروسيرفيسات، ولماذا Protobuf ليس مجرد "تنسيق آخر"، وكيف يساعدنا TypeScript على عدم الضياع في حديقة الحيوانات هذه من الأنواع. هيا بنا!



ما هي gRPC ولماذا أصبحت صديقة لـ TypeScript؟



gRPC هو إطار عمل لاستدعاء الإجراءات عن بُعد (RPC)، طورته Google. بدلاً من إرسال طلبات HTTP مع JSON، تقوم بتعريف الخدمات والرسائل في ملفات .proto (Protocol Buffers)، ثم تقوم بإنشاء كود العميل والخادم. الميزات الرئيسية: تنسيق بيانات ثنائي، دعم التدفقات (streaming)، كتابة صارمة للأنواع، واتصال ثنائي الاتجاه.



والآن تخيل أنك تكتب بلغة TypeScript. لديك بالفعل كتابة ثابتة للأنواع، ولكن في REST API غالبًا ما "تنكسر" على الحدود مع JSON. gRPC في TypeScript يحل هذه المشكلة بشكل جذري: يتم إنشاء الأنواع تلقائيًا من ملفات .proto. لم تعد تتساءل ما الذي جاء في الرد - سيخبرك مترجم TypeScript بذلك في مرحلة التطوير.



لماذا TypeScript هو الزوج المثالي لـ gRPC؟

  • نظام أنواع موحد: تتحول أنواع Protobuf إلى واجهات TypeScript. لا مزيد من any و as any.
  • الإكمال التلقائي: بيئة التطوير المتكاملة (IDE) الخاصة بك تفهم جميع حقول الطلبات والردود.
  • أمان إعادة الهيكلة: هل أعدت تسمية حقل في .proto؟ سيقوم TypeScript بتسليط الضوء على جميع الأماكن التي يستخدم فيها.


متى يكون gRPC في TypeScript اختيار الأبطال؟



ليس كل مشروع يحتاج إلى gRPC. ولكن هناك سيناريوهات حيث يوفر زيادة في الأداء والراحة بمقدار 10 أضعاف. دعنا نحللها بالترتيب.



1. الميكروسيرفيسات على TypeScript: الاتصال الداخلي



إذا كان لديك 5-10 ميكروسيرفيسات على TypeScript تتواصل باستمرار مع بعضها البعض، فإن gRPC هو أفضل صديق لك. تخيل: خدمة المستخدمين تنقل البيانات إلى خدمة الطلبات. بدون gRPC، كنت ستقوم بتسلسل JSON، وإلغاء تسلسله، والتحقق من الأنواع يدويًا. مع gRPC، يحدث هذا على مستوى البروتوكول.



مثال على خدمة بسيطة:

// user.protoservice UserService {  rpc GetUser (GetUserRequest) returns (User);}

message GetUserRequest { string user_id = 1;}

message User { string id = 1; string name = 2; string email = 3;}


بعد إنشاء الكود، تحصل على عميل مكتوب بدقة:

import { UserServiceClient } from './generated/user_grpc_pb';import { GetUserRequest } from './generated/user_pb';

const client = new UserServiceClient('localhost:50051', grpc.credentials.createInsecure());

const request = new GetUserRequest();request.setUserId('123');

client.getUser(request, (error, user) => { if (!error) { console.log(user.getName()); // TypeScript يعرف أن هذا string }});


متى تستخدم: عندما تكون كل ميلي ثانية من التأخير بين الخدمات حرجة (على سبيل المثال، في الأنظمة المالية أو خوادم الألعاب).



2. نقل البيانات المتدفق (Streaming)



REST لا يعرف كيفية البث بشكل صحيح. WebSocket يعرف، لكنه بروتوكول مختلف. تدعم gRPC أربعة أنواع من التدفقات: أحادي الاتجاه (عميل->خادم)، من الخادم (خادم->عميل)، وثنائي الاتجاه

المدونات

توصيات الكتب