مقدمة: هل مات REST؟ تحيا gRPC!
\nفي عالم تطوير Go، يدور نقاش دائم: ماذا تختار للتواصل بين الخدمات المصغرة — REST التقليدي أم gRPC العصري؟ إذا كنت قد كتبت كوداً بلغة Go ولو مرة واحدة، فبالتأكيد سمعت أن gRPC "سريع، صارم، وثنائي". لكن هل هذا صحيح فعلاً؟ والأهم — متى تستخدمه حتى لا تعقد حياتك؟
\nاسمي [اسمك]، وأنا مطور Go لسنوات طويلة. اليوم على PythonLib سنشرح gRPC في Go بأمثلة واقعية: أين لا غنى عنه، وأين الأفضل البقاء مع REST. هيا بنا!
\n\nما هو gRPC ولماذا Go؟
\ngRPC هو إطار عمل لاستدعاء الإجراءات عن بُعد (RPC) من Google، يستخدم Protocol Buffers (protobuf) لتسلسل البيانات. Go هي إحدى لغات "الخط الأول" لدعم gRPC، إلى جانب C++ وJava. لماذا؟
\n- \n
- الأداء: Go يُترجم إلى كود أصلي، وprotobuf يسلسل البيانات بتنسيق ثنائي أسرع بكثير من JSON. \n
- البساطة: خادم Go على gRPC يُكتب حرفياً في 20 دقيقة. \n
- الكتابة الثابتة: ملفات .proto تُنشئ عملاء وخوادم مقيدة الكتابة بشكل صارم. \n
لكن الأهم — gRPC في Go يوفر البث (streaming) مباشرة من الصندوق. هذه ميزة قاتلة للعديد من المهام.
\n\nمتى يكون gRPC في Go أفضل صديق لك
\n1. الخدمات المصغرة ذات الأحمال العالية
\nإذا كانت خدماتك تتبادل آلاف الطلبات في الثانية، فسيظهر gRPC بأفضل صورة. البروتوكول الثنائي وHTTP/2 يقللان زمن الانتقال وعبء المعالج.
\nمثال: خدمة توصيات في الوقت الفعلي. كل طلب إليها هو حزمة بيانات صغيرة، لكنها كثيرة. REST مع JSON سيكون "ثقيلاً" وبطيئاً.
\n\n2. بث البيانات (التحديثات المباشرة)
\nيدعم gRPC أربعة أنواع من البث: من الخادم، من العميل، ثنائي الاتجاه. في Go، يُنفذ ذلك عبر القنوات (channels)، مما يجعل الكود أنيقاً.
\nمثال: خدمة مراقبة ترسل مقاييس إلى الخادم كل 100 مللي ثانية. REST كان سيجبرك على استخدام WebSocket أو long-polling. gRPC — فقط استدعِ بثاً.
\n\n3. تطبيقات الجوال وإنترنت الأشياء
\nالتنسيق الثنائي لـ protobuf يوفر حركة المرور والبطارية. خادم Go على gRPC يخدم آلاف العملاء المحمولين بسهولة.
\n\nمتى يكون gRPC تعقيداً غير ضروري
\n1. تطبيقات CRUD البسيطة
\nإذا كان لديك خادم ويب نموذجي مع نقطتي نهاية (إنشاء مستخدم، جلب قائمة)، فإن gRPC يشبه استخدام مدفع لقتل عصفور. REST + JSON سيكون أبسط، وفرق الأداء غير ملحوظ.
\n\n2. عملاء المتصفح
\nالمتصفحات لا تدعم gRPC مباشرة (فقط عبر gRPC-Web الذي يضيف طبقة وسيطة). لتطبيقات SPA على React/Vue، الأفضل البقاء مع REST أو GraphQL.
\n\n3. فريق مبتدئ في Go
\nيتطلب gRPC فهم protobuf، المعترضات (interceptors)، وتوزيع الأحمال. إذا كان فريقك يتعلم Go للتو، ابدأ بـ REST — فهذا يخفض حاجز الدخول.
\n\nمثال واقعي: كتابة خادم وعميل في Go
\nلنكتب خدمة بسيطة لجلب معلومات المستخدم. هذا سيُظهر كيف يبدو gRPC في الكود.
\n\nالخطوة 1: تعريف ملف .proto
\nsyntax = "proto3";\npackage user;\n\nservice UserService {\n rpc GetUser (UserRequest) returns (UserResponse);\n}\n\nmessage UserRequest {\n int32 id = 1;\n}\n\nmessage UserResponse {\n string name = 1;\n string email = 2;\n}\nنقوم بالتجميع: protoc --go_out=. --go-grpc_out=. user.proto
الخطوة 2: تنفيذ الخادم في Go
\npackage main\n\nimport (\n "context"\n "log"\n "net"\n "google.golang.org/grpc"\n pb "path/to/your/proto"\n)\n\ntype server struct {\n pb.UnimplementedUserServiceServer\n}\n\nfunc (s *server) GetUser(ctx context.Context, req *pb.UserRequest) (*pb.UserResponse, error) {\n // محاكاة قاعدة بيانات\n users := map[int32]*pb.UserResponse{\n 1: {Name: "Alice",