gRPC چیست؟gRPC چیست؟

gRPC چیست؟

نویسنده: مهدی خدابخش

دسته بندی: طراحی نرم‌افزار
12 دقیقه زمان مطالعه
۱۴۰۰/۰۹/۳۰
0 نظر
امتیاز 4.7 از 5

gRPC یک framework قدرت مند متن باز است که بر پایه RPC(Remote Procedure Call) طراحی شده و می‌تواند در تمامی محیط های توسعه قابل پیاده سازی باشد. این تکنولوژی امکان ارتباط و هماهنگی شفاف و راحت بین client و server را فراهم و همچنین ساخت سیستم‌های connected را برای شما ساده‌تر می‌کند. از ویژگی های جالب این تکنولوژی می‌توان به اتصال بین سرویس ها و تمامی data center ها با قابلیت load balancing, tracing بررسی سطح دسترسی و سلامت سرویس اشاره کرد و همچنین قابلیت اتصال موبایل ومرور گر به سرویس های back end  را دارد.

مزایای اصلی استفاده از gRPC:

کاهش استفاده از شبکه با استفاده از Protobuf binary serialization
پشتیبانی از client, server, و bi-directional در فرا خوانی های سریالی
ابزار های زیاد برای بسیاری از زبان های برنامه نویسی برای ساختن سرویس های قدرت مند
جدید،کارایی زیاد و کم حجم
پشتیبانی از چند زبان برنامه نویسی در یک محیط

 

 gRPC

در تکنولوژی gRPC اپلیکیش  client sideمی‌تواند به طور مستقیم یک متد را از  server sideو چند دستگاه به طور همزمان فراخوانی کند. به این ترتیب ساختن اپلیکیشن و سرویسهای توزیع پذیر برای برنامه‌نویس راحتتر می‌شود. مانند بسیاری از سیستم های PRC، سیستم gRPC در ابتدا سرویس را شناسایی می‌کند و سپس متدها به همراه پارامترهای درون آن و return typeهایی که به صورت remote فراخوانی می‌شود را تشخیص می‌دهد.
server side: در ابتدا server یک interface را پیادهسازی و سپس سرور، gRPC را برای رسیدگی به درخواستهای  سمت client اجرا می‌کند.
client side: سمت client یک  stubدارد که همانند بخش server side عمل می‌کند.
در این تکنولوژی، کدهای سمت client  و server می‌توانند در محیطهای مختلف اجرا شوند و به راحتی با یکدیگر صحبت کنند (از سرورهای داخلی Google  به دسکتاپ شخصی شما) به علاوه می‌توانید با تمامی زبانهای برنامه نویسی که از gRPC پشتیبانی می‌کند این سروسها را بنویسید. به طور مثال می‌توانید برای server side از زبان Java و برای client side از زبانهای Go, Python, Ruby  استفاده کنید.
 

زبانهایی که از gRPC پشتیبانی می‌کنند:

 

برای درک بهتر gRPC به workflow زیر توجه کنید
 

از نظر ساختار gRPC یک لایه framework است که بین لایه اپلیکیشن و transport قرار دارد.در حقیقت این تکنولوژی ساختن و فرا خواندن سرویس های API که بر پایه PRC است را برای توسعه دهندگان راحت تر می‌کند.همانطور که اشاره شد، این تکنولوژی از پروتوکل HTTP/2 استفاده می‌کند، بنا بر این بازدهی بهتری نسبت به سرویس هایی که بر پایه پروتوکل HTTP/1.1   دارد.
 

طی یک مقایسه بین gRPC و HTTP.1/JSON، این تکنولوژی توانست 3 برابر performance بهتری نسبت به HTTP1.1/JSON دریافت کند



Performance of gRPC/Protobuf vs HTTP1.1/JSON. Source: Adapted from Schapira and Sethuraman 2016

ساختار gRPC

مانند بیشتر سیستم های PRC، gRPC نیز مبتنی بر تعیین کردن سرویس  ها و مدل هایی که به صورت remote به همراه پارامتر ها و return type های آن فرا خوانی می‌شود کار می‌کند.به صورت پیشفرض gRPC از protocol buffers ها به عنوان زبان مشخص کردن کاربر(Interface Definition Language (IDL)) برای شناسایی service interface ها و ساختار پیام ها استفاده می‌کند

پروتکل بافر چیست؟

پروتکل بافرز، یک روش سریالیزه کردن اطلاعات است که توسط گوگل برای استفاده داخلی توسعه یافته بود که بعداً برای استفاده عموم منتشر شد. از این روش برای برقرار کردن ارتباطات بین برنامه‌ها توسط سیم (wire) یا ذخیره کردن اطلاعات استفاده می‌شود. این روش شامل یک زبان توصیف میانی و یک کامپایلر که کدهای مختلف برای زبان‌های برنامه‌نویسی مختلف از این زبان توصیف میانی تولید می‌کند، است.
 

ساختار پیام‌های protocol buffers:

این پیام‌ها شامل مجموعه‌ای از key-value pairها است. قسمت باینری پیام، شماره فیلد را به عنوان کلید (key) استفاده می‌کند. نام و نوع اعلان شده برای هر فیلد فقط در انتهای رمزگشایی (decoding) با ارجاع به نوع پیام قابل شناسایی است. وقتی پیام کد‌گذاری شد، key و value به جریان‌های byte متصل می‌شوند. بعد از اینکه پیام رمزگشایی (decoded) شد، تجزیه‌کننده پیام (parser) باید قابلیت این را داشته باشد که اگر نتوانست فیلد را تشخیص دهد از آن عبور کند؛ از این رو، فیلدهای جدید بدون اینکه برنامه‌های قبلی را که اطلاعاتی درباره آن‌ها نداریم خراب کنند، می‌توانند به پیام اضافه شوند.
در انتها “key” به ازای هر pair در نوشتن فرمت پیام دارای دو مقدار است. شماره فیلد از فایل .proto به علاوه نوع پیام شما که نشان دهد اطلاعات کافی برای یافتن طول مقدار (value) را دارد. در اکثر پیاده‌سازی‌ها در زبان‌های مختلف این key به عنوان یک برچسب شناخته می‌شود.
انواع wireهای موجود به شرح زیر است:
 

برای درک بهتر این ساختار به مثال زیر توجه کنید:

سه بیت آخر را می‌گیرید تا wire type(0) را بدست آورید، سپس سه بیت را به راست تغییر دهید تا عدد فیلد 1 را بدست آورید. بنا بر این اکنون می‌دانید که مقدار فیلد 1 است و مقدار زیر یک نوع variant است. همانطور که مشاهده می‌کنید دو بایت بعدی عدد 150 را ذخیره می‌کنند. این نکته را در نظر بگیرید که برای استفاده از protocol bufferها نیازی به درک ساختار این پیام‌ها ندارید.
 

کار کردن با protocol buffers:

به طور پیشفرض gRPC از  protocol bufferها استفاده می‌کند. به طور کلی، مکانیزم سیستمهای متن‌باز Google (open source) برای ساختار دادن به داده (همینطور قابلیت سازگار بودن با فرمتهای مختلف داده مثل JSON) است.

نحوه کار با buffer ها

اولین نکته مهمی که هنگام کار با protocol buffer ها باید در نظر بگیرید، ساختار دادهای است که می‌خواهید در فایل  .proto مرتب(serialize)کنید. ساختار دادههای این پروتکل بر اساس message است که هر پیام یک logical record کوچکی از اطلاعات است؛این اطلاعات شامل مجموعهای از name-value pair ها به نام fields  را تشکیل می‌دهند. به مثال ساده زیر توجه کنید:

}message Person
  ;string name = 1
 ; int32 id = 2
  ;bool has_ponycopter = 3

{

 
در ادامه وقتی ساختار داده خود را مشخص کردید از کامپایلر protocol buffer (protoc)برای ساختن کلاسهای اولیه سطح دسترسی داده(data access classes)در زبان برنامه نویسی مورد نظر خود استفاده کنید. اینها دسترسی های سادهای را برای هر زمینه فراهم می‌کنند؛ به طور مثال توابع ()name() and set_name علاوه بر متد serialize/parse میتوانند کل ساختار را به صورت byte خام داشته باشند.
برای درک بهتر این مورد اگر شما زبان برنامه نویسی C++ را برای توسعه انتخاب کرده باشید،  کامپایلر مثال بالا را برای فراخوانی کلاس person اجرا کنید؛ سپس می‌توانید از این کلاس در اپلیکیشن خود برای پر کردن (populate)، مرتبسازی (serialize) و بازیابی (retrieve) کلاس person  استفاده کنید.
شما می‌توانید سرویسهای gRPC را در فایلهای معمولی .proto تعریف کنید. در gRPC پارامترها و return typeها به عنوان protocol buffer message  مشخص و تعریف می‌شوند:
// The greeter service definition.
service Greeter {
  // Sends a greeting
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// The request message containing the user's name.
message HelloRequest {
  string name = 1;
}

// The response message containing the greetings
message HelloReply {
  string message = 1;

 

gRPC با استفاده از protoc به همراه یک gRPC plugin مخصوص برای ساختن کدهای فایل proto شما استفاده می‌کند؛ به این شکل که شما gRPC تولید شده سمت client ،server و همچنین protocol buffer code را برای پر کردن (populate)، مرتبسازی (serialize) و بازیابی (retrieve) نوع پیام (message types) دریافت می‌کنید.
gRPC به شما امکان  می‌دهد چهار نوع سرویس را تعریف کنید
Unary PRCs:  clinet یک درخواست به سمت سرور ارسال می‌کند و همان سرویس ارسال شده را دریافت می‌کند،مانند یک function call معمولی 
rpc SayHello(HelloRequest) returns (HelloResponse);


Server streaming PRCs:  clinet یک درخواست به سمت سرور ارسال می‌کند و یک جریان برای خواندن پیاپی پیام ها دریافت می‌کند.client همه پیام ها را تا وقتی که پیامی دیگر نمانده باشد می‌خواند.gRPC تضمین میکند که اولویت بندی پیام ها توسط یک PRC call معمولی بدون هیچ گونه مشکل امکان پذیر است
rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

Client streaming RPCs:  client پیام های پی در پی می‌نوسید و به سمت server  ارسال می‌کند و این روند تکرار می‌شود تا وقتی که client نوشتن پیام را تمام کند، از اینجا به بعد منتظر server می‌شود تا پیام ها بخواند و آنها را برگرداند.در این مورد نیز gRPC تضمین میکند که اولویت بندی پیام ها توسط یک PRC call معمولی بدون هیچ گونه مشکل امکان پذیر است
rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);

Bidirectional streaming: هر دو سمت(client and server) از پیام های پی در پی استفاده می‌کنند.هر دو سمت توانایی خواندن و نوشتن پیام بر اساس اولویت دلخواه را دارند به طور مثال : سمت server   در ابتدا می‌تواند صبر کند تا پیام از سمت client  ردیافت شود و بعد از آن پیام خود را بنویسد یا می‌تواند ابتدا پیام را بخواند سپس آن را بنویسد و همچنین قابلیت این را دارد که از ترکیب این دو به طور همزمان استفاده کند.ترتیب پیام ها در هر جریان حفظ می‌شود
rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);


جمع بندی
با توجه به پیچیدگی نرم افزار و گستردگی زبان های برنامه نویسی دنیای API همیشه دچار چالش های زیادی بوده.در این مقاله سعی کردیم توضیح مختصری از مدل gRPC  به شما بدهیم.در مقالات بعدی آسا این تکنولوژی را به صورت تخصصی تر مورد بررسی قرار می‌دهیم و همینطور به طور کامل نحوه استفاده و مقایسه آن با دیگر روش های سرویس های API مورد نقد و بررسی قرار می‌دهیم
منابع:
1.https://grpc.io
2.https://devopedia.org/grpc
3.https://docs.microsoft.com/en-us/aspnet/core/grpc/?view=aspnetcore-6.0
4.https://developers.google.com/protocol-buffers/docs/encoding