آموزش gRPC در ASP.NET Core - قسمت اول

آموزش gRPC در ASP.NET Core
آموزش gRPC در ASP.NET Core


جی آر پی سی(gRPC) چیست ؟

جی آر پی سی(gRPC) یک فریمورک رایگان، قدرتمند، مدرن، پر سرعت و متن بازِ RPC است.

به طور کلی 3 نوع مدل برای طراحی API وجود دارد.

  1. SOAP
  2. REST
  3. RPC (Remote procedure call)


فریمورک gRPC به ما اجازه میدهد که API هایی از نوع RPC بسازیم.
این نوع API ها به Client ها اجازه میدهند که متدهای قرار گرفته در Server را در برنامه خودشان فراخوانی کنند به شکلی که انگار متدها واقعا در برنامه خودشان پیاده سازی شده است.

مثال:
در تصویر زیر برنامه Server دارای یک متد به نامGetOrder است.

public Order GetOrder(int num);

حالا gRPC چیکار میکنه دقیقا ؟ اجازه میده به Client ها که دقیقا این متد رو داخل برنامه خودشون فراخوانی کنن و از خروجی اش استفاده کنن.

مکانیزم RPC
مکانیزم RPC



مزایای فریمورک gRPC

  • تسهیل ایجاد ارتباط بین Microservice ها.
  • پر سرعت است.
  • استفاده از HTTP/2 به عنوان Transfer Protocol.
  • پشتیبانی از Client Streaming
  • پشتیبانی از Server Streaming
  • پشتیبانی از Bidirectional Streaming
  • از XML و JSON سریع تر، سبک تر، ساده تر است.
  • به دلیل Serialize کردن داده ها به binary data format حجم Payload خیلی کمی دارد.
  • امکان استفاده در بیشتر زبان های برنامه نویسی( Polyglot )



پروتکل بافر (Protocol Buffer) چیست ؟

پروتکل بافر یک سریالایزرِ Binary است.
فریمورک gRPC به صورت پیش فرض برای Serialize کردن داده ها از Protcol Buffer استفاده میکند.
پروتکل بافر داده ها را به آرایه ای یا استریمی از byte ها تبدیل میکند، و به همین دلیل سبک تر و سرعتش نسبت به JSON و XML بالاتر است.



فایل تنظیماتی proto. چیست ؟

فریمورک gRPC برای ساخت API ها از رویکرد contract-first استفاده میکند.

رویکرد contract-first چیست ؟
در این روش، ابتدا قبل از کد نوشتن باید متدهایی که قرار است در API مان ارائه بدهیم را به صورت کامل همراه با پارامتر هایشان را بنویسیم و سپس آن ها را پیاده سازی میکنیم.

در فریمورک gRPC متد هایمان را باید در یک service قرار بدهیم، و پارامتر های آن ها را باید به صورت message تعریف کنیم، و سپس آن ها را در یک فایل با فرمت proto. قرار دهیم.
message را دقیقا مثل DTO های خودمان تصور کنید.

فایل proto محل قرارگیری متد ها و پارامتر هایی است که قراره در API مان به سرویس گیرندگان ارائه کنیم.
( فایل ها proto را مثل یک قرارداد بین Client ها و Server ها تصور کنید ).

در قسمت های بعدی به صورت کامل و عمیق با فایل های تنظیماتی proto آشنا می شویم.


ساخت اولین پروژه با gRPC در ASP.NET Core

در ادامه قصد داریم که یک پروژه خیلی ساده را با فریمورک gRPC و ASP.NET Core پیاده سازی کنیم.

در این پروژه Server یک متد به نام Sum برای جمع دو عدد با نوع داده long به Client ارائه میکند و Client می تواند با فراخوانی این متد در برنامه خودش از پیاده سازی آن استفاده کند.

در ابتدا یک پروژه ASP.NET Core به صورت Empty میسازیم.

سپس باید پکیج Grpc.AspNetCore را نصب کنیم.

Install-Package Grpc.AspNetCore -Version 2.34.0

در مرحله بعدی طبق رویکرد contract-first اول باید متدها و پارامتر هایی که میخواهیم به بیرون ارائه کنیم را در یک فایل proto بنویسیم.

یک فولدر به نام Protos میسازیم و در آن یک فایل proto به نام calculator اضافه میکنیم.

سپس باید در فایل ساخته شده متد ها و پارامتر های آن ها را بنویسیم.

همانطور که مشاهده میکنید متد Sum یک ورودی به نام SumRequest دارد و یک خروجی از نوع SumResponse

https://gist.github.com/ArminShoeibi/0ed2d7fe6b12d29fbab752b30f66ca30


وقتی که قرارداد رو نوشتیم، باید آن را توسط Protobuf Compiler کامپایل کنیم، در قسمت های بعدی در مورد این کامپایلر صحبت خواهیم کرد.

وارد Properties فایل calculator.proto می شویم.
وارد Properties فایل calculator.proto می شویم.


مقدار BuildAction را بر روی Protobuf Compiler قرار دهید.

سپس مقدار gRPC Stub Classes را بر روی Server Only قرار دهید.

سپس پروژه را Build کنید.( خیلی مهم)


وقتی که مرحله بالا را انجام دهید، Protobuf Compiler از روی آن فایل calculator.proto برای شما دو عدد فایل سی شارپی با فرمت cs ایجاد میکند.
(در مورد این 2 فایل در قسمت های بعدی به صورت کامل صحبت خواهیم کرد.)

الان فقط برای پیاده سازی متد Sum در برنامه سرور باید از کلاس CalculatorServiceBase ارث بری کنیم، این کلاس در یک کلاس Static به نام CalculatorService قرار گرفته است.


پس یک فولدر به نام GrpcServices ایجاد کنید و در آن یک کلاس به نام CalculatorGrpcService بسازید و سپس از کلاس CalculatorServiceBase ارث بری کنید.

حالا باید متد Sum را پیاده سازی کنیم، Protobuf Compiler این متد را به صورت virtual در کلاس CalculatorServiceBase قرار داده است و ما باید آن را override کنیم.

بعد از اینکه متد Sum رو override کردیم باید منطق خودمون در اون پیاده سازی کنیم.

https://gist.github.com/ArminShoeibi/61561512c7b6207f0c9ba0c7b6a595b2


حالا که متد Sum تکمیل شد باید سرویس gRPC رو به DI Container پروژه مون اضافه کنیم.
سپس میان افزار UseHttpsRedirection را هم اضافه می کنیم.(خیلی مهم)
و سپس کلاس CalculatorGrpcService رو هم در endpoint ها ثبت می کنیم.

https://gist.github.com/ArminShoeibi/6980cb25e9951210fe56e5dd34057bf0


بعد از این مرحله باید اجرای پروژه مون رو به دست Kestrel بسپاریم، چون IIS هنوز از gRPC پشتیبانی نمیکنه

نکته: اگر سیستم عامل تان ویندوز 10 هست و Build آن 20300.1000 و یا بالاتر است، همچنان میتوانید از IIS استفاده کنید و پروژه را با آن اجرا کنید.
همچنین پروژه باید بر روی In-process hosting قرار گرفته باشد.

طبق تصویر اجرای پروژه را به عهده Kestrel بزارید.

خب الان پروژه سرور مان تکمیل شد و در اصل یک متد RPC به بیرون ارائه میکنه.
الان وقت ساختن یک پروژه Client است که بتواند از این متد Sum استفاده کند، در همان سولوشن یک پروژه Console اضافه کنید.

سپس 3 پکیج در آن نصب کنید.

Install-Package Grpc.Tools -Version 2.34.0
Install-Package Grpc.Net.Client -Version 2.34.0
Install-Package Google.Protobuf -Version 3.14.0


فایل های proto قراردادی هستند که باید هم در Server وجود داشته باشند و هم در Client و به 2 صورت مختلف هم Compile می شوند.

1.کامپایل مخصوص Server
2.کامپایل مخصوص Client


سپس باید فایل proto ای که در سرور قرار گرفته است را در Client هم اضافه کنیم، به صورت زیر اینکار را انجام دهید.

بعد از اینکه فایل اضافه شد، Solution را یکبار Build کنید.(خیلی مهم)

در این مرحله باید بتونیم متد Sum رو در برنامه Console ای که ساختیم استفاده کنیم.

ابتدا لازم است که یک ارتباط با سرور برقرار کنیم و سپس میتوانیم متد Sum را در برنامه خودمان فراخوانی کنیم، آرگومان ورودی اش را باید حتما بهش پاس بدیم.

https://gist.github.com/ArminShoeibi/837347164542cba523e49ebc5143649a


خب الان که هم سرور و هم کلاینت کدهاشون رو نوشتیم باید فقط اجراشون کنیم.

ولی اول باید ترتیب اجرای پروژه ها را تنظیم کنیم و سپس اجرایشان کنیم.

بعد از اینکه ترتیب اجرا پروژه ها را تنظیم کردید، روی Start کلیک کنید.

در ادامه اگر HTTPS certificate بر روی سیستم تون نصب نشده باشه، این پیام رو خواهید دید، بر روی Yes کلیک کنید.

و دوباره بر روی Yes کلیک کنید، تا پروژه ها اجرا شوند.


و همینطور که می بینید، 2 عدد از سمت کلاینت به سرور ارسال شد و سرور و جواب جمع دو عدد رو بهمون داد و ما جواب رو چاپ کردیم.

در قسمت های بعدی به طور کامل و عمیق در مورد تمامی اجزای gRPC و کامپایلر آن یعنی protoc صحبت خواهیم کرد.

سورس کد پروژه:

https://github.com/ArminShoeibi/DNZ.Calculator-gRPC
مقالات بیشتر در کانال دات نت زوم
https://t.me/DotNetZoom