gRPC لجافا سكريبت (Node.js): المكتبات وأمثلة الكود

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

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

ابدأ الدورة

gRPC لجافا سكريبت (Node.js): المكتبات والأمثلة



gRPC هو إطار عالي الأداء لاستدعاء الإجراءات عن بُعد (RPC)، طورته Google. يستخدم Protocol Buffers (protobuf) لتسلسل البيانات و HTTP/2 للنقل. في نظام Node.js البيئي، يسمح gRPC بإنشاء خدمات مصغرة سريعة وموثوقة مع دعم النقل التدفقي ثنائي الاتجاه. في هذه المقالة، سنستعرض المكتبات الرئيسية، التثبيت، ونكتب مثالاً عملياً للخادم والعميل.



المكتبات الرئيسية لـ gRPC في Node.js



للعمل مع gRPC في بيئة Node.js، توجد عدة حزم رئيسية:



  • @grpc/grpc-js — تنفيذ خالص لـ gRPC بلغة جافا سكريبت. لا يتطلب تبعيات أصلية (C++)، مما يبسط التثبيت. موصى به لمعظم المشاريع الحديثة.
  • @grpc/proto-loader — محمّل ملفات .proto. يحول تعريفات protobuf إلى كائنات جافا سكريبت لاستخدامها مع @grpc/grpc-js.
  • protobufjs — مكتبة بديلة للعمل مع protobuf. تدعم التوليد الثابت والديناميكي للكود.
  • grpc-tools — أدوات سطر أوامر لتوليد كود جافا سكريبت من ملفات .proto (بديل للتحميل الديناميكي).


في هذا الدليل، سنستخدم مجموعة @grpc/grpc-js و @grpc/proto-loader — وهي طريقة حديثة ومستقرة.



تثبيت التبعيات



أنشئ مشروعاً جديداً وقم بتثبيت الحزم اللازمة:



mkdir grpc-node-examplecd grpc-node-examplenpm init -ynpm install @grpc/grpc-js @grpc/proto-loader


تعريف الخدمة عبر ملف .proto



أنشئ ملفاً باسم hello.proto مع وصف الخدمة والرسائل:



syntax = "proto3";

service Greeter { rpc SayHello (HelloRequest) returns (HelloReply) {} rpc SayHelloStream (HelloRequest) returns (stream HelloReply) {}}

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


هنا قمنا بتعريف طريقتين: طريقة أحادية بسيطة SayHello وطريقة تدفق من الخادم SayHelloStream.



تنفيذ خادم gRPC على Node.js



أنشئ ملفاً باسم server.js:



const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');

const PROTO_PATH = './hello.proto';

// تحميل تعريف ملف البروتوconst packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true});

const helloProto = grpc.loadPackageDefinition(packageDefinition).helloworld;

// تنفيذ طرق الخدمةfunction sayHello(call, callback) { const name = call.request.name; console.log(`تم استلام الطلب: ${name}`); callback(null, { message: `مرحباً، ${name}!` });}

function sayHelloStream(call) { const name = call.request.name; console.log(`تدفق لـ: ${name}`);

// إرسال عدة ردود for (let i = 0; i < 5; i++) { call.write({ message: `مرحباً ${name} - الرسالة ${i + 1}` }); } call.end();}

// تشغيل الخادمfunction main() { const server = new grpc.Server(); server.addService(helloProto.Greeter.service, { sayHello: sayHello, sayHelloStream: sayHelloStream });

server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => { console.log('خادم gRPC يعمل على المنفذ 50051'); server.start(); });}

main();


تنفيذ عميل gRPC على Node.js



أنشئ ملفاً باسم client.js:



const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');

const PROTO_PATH = './hello.proto';

const packageDefini

توصيات