gRPC یک پروتکل باینری با کارایی بالا برای فراخوانی روش از راه دور تقریباً در هر پلتفرمی است. در اینجا یک مقدمه عملی برای استفاده از gRPC با Node آورده شده است.
- معرفی gRPC
- تعریف API سرویس Node را ایجاد کنید
- تنظیم پروژه Node
- از تعریف برای ایجاد سرور استفاده کنید
- کارخواه Node
- سکوهای دیگر
- نتیجهگیری
gRPC یک پروتکل باینری برای تماسهای رویه از راه دور است که توسط Google منبع باز است. این یک جایگزین برای REST است که به دلیل عملکرد و سادگی آن مورد توجه قرار گرفته است. gRPC به شما یک اتصال دوطرفه کامل از طریق HTTP/2 می دهد. در حال حاضر، هنگام استفاده در مرورگر به یک آداپتور نیاز دارد و در سرویسهای بکاند بیشترین محبوبیت را دارد. gRPC مخصوصاً برای microservices محبوب است، زیرا قراردادهای قوی API و انتزاع روش آن به کاهش پیچیدگی کمک می کند. اگرچه gRPC به کار اولیه بیشتری نسبت به یک پشته REST معمولی نیاز دارد، اما میتواند برای پروژههای بزرگتر و سازمانهایی که از رویکرد ساختارمندتری بهره میبرند جذاب باشد.
معرفی gRPC
gRPC جایگزین مناسبی برای REST است و نشاندهنده آخرین هنر در فراخوانیهای رویه از راه دور است. این چند زبانه است و کیت هایی را برای سرور و کلاینت در تمام زبان ها و پلتفرم های اصلی پشتیبان ارائه می دهد. همچنین پروژه gRPC-web برای استفاده در مرورگر وجود دارد.
در این مقاله، ما مستقیماً کد را بررسی میکنیم و یک کلاینت Node.js میسازیم که با سرویس Node.js صحبت میکند. این به ما نگاهی به هر دو طرف کانال ارتباطی می دهد. gRPC روی HTTP/2 اجرا میشود و از یک پروتکل باینری استفاده میکند که از چندین ترکیب درخواستهای مسدود کردن و پخش جریانی پشتیبانی میکند: درخواست/پاسخ، استریم مشتری، استریم سرور و پخش دوبلکس کامل. برای مثال ساده ما، به تعامل درخواست/پاسخ (چیزی که gRPC آن را تعامل «یوناری» در مقابل جریان مینامد، پایبند میمانیم.
نمای کلی gRPC
اگر میخواهید نمای کلی تری از gRPC داشته باشید، با این معرفی شگفت انگیز، که شامل نگاهی سطح بالا به انگیزه ها و مزایای پروتکل است.
تعریف API سرویس Node را ایجاد کنید
gRPC با ایجاد یک تعریف سرویس در متن ساده، سپس کامپایل آن در “خرد” کار میکند. خردها کتابخانههای کدی هستند که برنامه شما وارد میکند و برای تعریف سرورها و کلاینتها به آنها تکیه میکند. اساساً، تعریف متن به شما امکان میدهد به راحتی نقاط پایانی را توصیف کنید. و ارتباط آنها در قالبی قابل خواندن برای انسان، سپس آن را در کتابخانههای کدی که در داخل برنامهتان برای تعامل با نقاط پایانی استفاده میکنید، کامپایل کنید. خردهها تمام کارهای ورودی/خروجی واقعی را انجام میدهند و کد شما به تعریف API دسترسی پیدا میکند و آن را اضافه میکند. منطق تجاری برای آن.
این جریان کلی مشابه سایر چارچوب های RPC است. برای اهداف یادگیری، نکته مهمی که باید بدانید این است که تعریف خدمات نقطه اتصال بین تمام مشتریان و خدمات شما است. تعاریف سطوح API و سرورهای درون کد و کلاینت ها از نسخه کامپایل شده آنها خارج می شوند.
gRPC و بافرهای پروتکل
gRPC از بافرهای پروتکل به عنوان مکانیزم ارتباطی زیربنایی خود استفاده می کند. این پروتکل سرعت و بی طرفی پلتفرم را فراهم می کند که gRPC را متمایز می کند. این یک قطعه مهندسی پیچیده برای سریال سازی و تعاریف رابط است، اما به طور کلی هنگام استفاده از gRPC نیازی نیست نگران آن باشیم—همه اینها برای ما انجام می شود.
در تئوری، داشتن مرحله اضافی برای حفظ تعاریف سرویس و انتقال آنها به همراه تغییرات کد، سربار را اضافه می کند. این در عمل نیز صادق است; با این حال، ادغام تعریف در فرآیند ساخت و پشتیبانی در IDE ها، فرآیند را دشوارتر می کند.
بیایید با ایجاد تعریف API برای سرویس تربیع اعداد مبتنی بر Node، همانطور که در فهرست ۱ نشان داده شده است، شروع کنیم.
syntax = "proto3";
package myservice;
// Define the service
service NumberSquarer {
// Unary RPC method for squaring a number
rpc SquareNumber(Number) returns (Number) {}
}
// Define the message types
message Number {
int32 value = 1;
}
فهرست ۱ با گفتن به gRPC شروع می شود که از چه نسخه ای از پروتکل Protocol Buffers استفاده کند. در حال حاضر، آخرین نسخه proto3
است. پس از آن بسته ای به نام myservice
تعریف می کنیم.
سپس، دو بلوک داریم، یکی با سرویس و دیگری با ساختار داده. این سرویس NumberSquarer
نام دارد و روی آن یک روش راه دور تکی دارد، SquareNumber
که نوع Number
را می پذیرد. این نوع در فهرست ۱ تعریف شده است و SquareNumber
همچنین از Number
به عنوان نوع برگشتی خود استفاده میکند.
تنظیم پروژه Node
برای شروع یک پروژه Node جدید، می توانید از مراحل نشان داده شده در لیست ۲ استفاده کنید که شامل وابستگی های لازم می شود. (توجه داشته باشید که باید Node/NPM نصب شود.)
$ cd iw-grpc
$ npm init -y
$ npm install @grpc/proto-loader async google-protobuf @grpc/grpc-js
از تعریف برای ایجاد سرور استفاده کنید
برخی از پلتفرمها، مانند جاوا، به مرحله کامپایل در فرآیند ساخت نیاز دارند، اما در جاوا اسکریپت میتوانیم در زمان اجرا کامپایل کنیم. در فهرست /iw-grpc
، فایل service.proto
را با محتویاتی که قبلاً در فهرست ۱ نشان داده شده بود، ایجاد کنید.
در مرحله بعد، از این تعریف برای راه اندازی سرور Node استفاده کنید که نقطه پایانی مربع شدن را نشان می دهد، همانطور که در فهرست ۳ نشان داده شده است.
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
// Load the protobuf definition dynamically
const packageDefinition = protoLoader.loadSync('service.proto');
const { myservice } = grpc.loadPackageDefinition(packageDefinition);
// Implement the NumberSquarer service
const server = new grpc.Server();
function squareNumber(call, callback) {
const number = call.request.value;
const squaredValue = number * number;
callback(null, { value: squaredValue });
}
server.addService(myservice.NumberSquarer.service, {
SquareNumber: squareNumber,
});
// Start the gRPC server
const port = 50051;
server.bindAsync(`0.0.0.0:${port}`, grpc.ServerCredentials.createInsecure(), (err, port) => {
if (err) {
console.error(`Failed to bind gRPC server: ${err}`);
return;
}
console.log(`gRPC server is listening on port ${port}`);
server.start();
});
سه تکه اصلی (پس از وارد کردن) در فهرست ۳ عبارتند از: بارگذاری تعریف سرویس، پیاده سازی منطق نقطه پایانی و راه اندازی سرور. از آنجایی که ما سرویس خود را در یک بسته تعریف کردیم، با بارگیری بسته شروع می کنیم و سپس سرویس را از آن می گیریم:
const { myservice } = grpc.loadPackageDefinition(packageDefinition);
پس از آن، یک سرور gRPC جدید ایجاد میکنیم، روش مربعبندی خود را تعریف میکنیم و از شی سرور برای اتصال متد جدید به نقطه پایانی SquareNumber
استفاده میکنیم.
در نهایت، ما شروع به گوش دادن سرور در پورت ۵۰۰۵۱ میکنیم. ما از روش createInsecure
استفاده میکنیم، که فقط به این معنی است که به جای HTTPS از HTTP استفاده میکند.
اکنون می توانید این سرور را با تایپ کردن: $ node server.js
راه اندازی کنید.
کارخواه Node
هنگامی که سرور Node اجرا می شود، می توانیم از همان تعریف سرویس برای ساخت کلاینت خود استفاده کنیم که در لیست ۴ نشان داده شده است.
const grpc = require('@grpc/grpc-js');
const protoLoader = require('@grpc/proto-loader');
// Load the protobuf definition dynamically
const packageDefinition = protoLoader.loadSync('service.proto');
const { myservice } = grpc.loadPackageDefinition(packageDefinition);
// Create a gRPC client
const client = new myservice.NumberSquarer('localhost:50051', grpc.credentials.createInsecure());
// Read the number from the command line argument
const number = parseInt(process.argv[2]);
// Create the request message
const request = { value: number };
// Make the gRPC unary RPC call
client.SquareNumber(request, (err, response) => {
if (err) {
console.error(`Error: ${err.message}`);
return;
}
console.log(`Squared number: ${response.value}`);
});
کاربر یک آرگومان خط فرمان را برای یک عدد می پذیرد (process.argv[2]
) و از سرور برای خروجی مربع آن استفاده می کند. برای بارگیری تعریف سرویس از همان فرآیند سرور پیروی می کند. به جای ایجاد یک سرور، یک سرویس مشتری ایجاد می کند که به سروری که در حال اجرا هستیم ارجاع می دهد، با:
const client = new myservice.NumberSquarer('localhost:50051', grpc.credentials.createInsecure());.
فراخوانی روش از راه دور ساده است و به نظر می رسد فراخوانی یک روش ناهمزمان در شی مشتری است. RPC دو آرگومان را می پذیرد: درخواست و کنترل کننده پاسخ به تماس.
برای اجرای کلاینت، می توانید $ node client.js 7
را تایپ کنید و پاسخی مانند این دریافت کنید:
Squared number: 49. (Make sure the server is running!)
میتوانید کد این مثال را در اینجا پیدا کنید.
سکوهای دیگر
در پلتفرمهای دیگر، کامپایل سرویس را به عنوان بخشی از فرآیند ساخت وارد میکنید و سپس از رابطهای کامپایلشده برای نوشتن پیادهسازیهای نقطه پایانی خود استفاده میکنید. یک راه خوب برای مشاهده نحوه عملکرد آن، شبیهسازی نمونههایی از مخزن gRPC در GitHub.
برای مثال، میتوانید از یکی از مثالهای جاوا استفاده کنید. میتوانید نمونههای مشابه و شروع سریع برای همه پلتفرمهای پشتیبانیشده را اینجا پیدا کنید. اگر به gRPC از مرورگر علاقه دارید، به پروژه grpc-web مراجعه کنید. همچنین میتوانید پروژه Android برای gRPC را بررسی کنید.
فهرست ۵ نشان می دهد که چگونه می توانید مرحله کامپایل gRPC را در یک ساخت Gradle برای جاوا ادغام کنید.
protobuf {
protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" } }
generateProtoTasks {
all()*.plugins { grpc {} }
}
}
در اصل، شما فقط باید یک هدف generateProtoTasks
را به ساخت اضافه کنید.
نتیجه گیری
این مقاله فقط طعم استفاده از gRPC را به شما می دهد. اگرچه با فرمول REST همه جا حاضر متفاوت است، تعویض دنده های ذهنی چندان سخت نیست. بزرگترین تغییر این است که باید مرحله تدوین اضافی را در نظر گرفت. همانطور که در مورد Node مشاهده کردید، اضافه کردن کامپایل نسبتاً بدون درد است.
منصفانه است که بپرسیم آیا مهاجرت به gRPC ارزش آن را دارد در حالی که REST برای توسعه دهندگان بسیار رایج و آشناست. پاسخ این است که gRPC ارزش خود را زمانی نشان میدهد که در محیطهای میکروسرویس با شدت بالا استفاده میشود، جایی که بسیاری از سرویسها با حجم زیادی در تعامل هستند. در آن صورت، یک سازمان بزرگ از استحکام بیشتری که توسط قراردادهای صریح RPC ایجاد میشود، سود میبرد، و پروتکل دادههای باینری، مزایای عملکردی را که در کل معماری میکروسرویسها بزرگنمایی میشوند، خالص میکند.
این بدان معنا نیست که gRPC یک راهانداز برای استارتآپهای سریع و مانند آن نیست. فقط باید مطمئن شوید که مایل به استفاده از تنظیمات اضافی هستید، متقاعد شده اید که به مزایای عملکرد نیاز دارید و کارهای اضافی مورد نیاز برای یافتن و آموزش توسعه دهندگان را درک کنید.
البته، ممکن است شما واقعاً رویکرد gRPC را دوست داشته باشید، که دلیل کاملاً قانونی دیگری برای شروع آزمایش امروز با آن است.
پست های مرتبط
مقدمه gRPC: جایگزین REST
مقدمه gRPC: جایگزین REST
مقدمه gRPC: جایگزین REST