ساخت سرویس gRPC با سی شارپ

۱. مرور کلی

gRPC یک چارچوب و مجموعه ابزار فراخوانی رویه از راه دور (RPC) است که در گوگل توسعه داده شده است. این چارچوب به شما امکان می‌دهد با استفاده از Protocol Buffers، یک مجموعه ابزار و زبان سریال‌سازی دودویی بسیار قدرتمند، یک سرویس تعریف کنید. سپس به شما امکان می‌دهد stubهای اصطلاحی کلاینت و سرور را از تعریف سرویس خود به زبان‌های مختلف تولید کنید.

در این آزمایشگاه کد، شما یاد می‌گیرید که چگونه یک سرویس C# بسازید که با استفاده از چارچوب gRPC یک API را در معرض نمایش قرار می‌دهد. شما با استفاده از یک کلاینت کنسول نوشته شده با C# که از همان توصیف سرویس به عنوان سرویس استفاده می‌کند، با این سرویس تعامل می‌کنید.

آنچه یاد خواهید گرفت

  • زبان پروتکل بافر.
  • نحوه پیاده سازی سرویس gRPC با استفاده از سی شارپ
  • نحوه پیاده سازی کلاینت gRPC با استفاده از سی شارپ.
  • نحوه به‌روزرسانی سرویس gRPC

آنچه نیاز دارید

چگونه از این آموزش استفاده خواهید کرد؟

فقط تا انتها بخوانید آن را بخوانید و تمرین‌ها را انجام دهید

تجربه خود را با پلتفرم ابری گوگل چگونه ارزیابی می‌کنید؟

تازه کار متوسط ماهر

۲. دانلود و ساخت نمونه‌های gRPC C#

دانلود نمونه

مخزن نمونه gRPC C# را به صورت یک فایل زیپ دانلود کرده و آن را از حالت فشرده خارج کنید.

از طرف دیگر، می‌توانید مخزن git آن را کلون کنید.

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

در هر صورت، شما باید یک پوشه grpc-samples-dotnet با محتویات زیر داشته باشید:

d056832ff4ce0c8f.png

راه حل را بسازید

پوشه برنامه نمونه حاوی GrpcSamples.sln ، یک راه‌حل ویژوال استودیو است. برای باز کردن راه‌حل در ویژوال استودیو، دوبار کلیک کنید. شما باید یک راه‌حل با تعدادی پروژه ببینید.

61da9ddc86c08019.png

در بخش بعدی با جزئیات بیشتری به بررسی پروژه‌ها خواهیم پرداخت، اما ابتدا، بیایید پروژه را بسازیم. برای ساخت راه‌حل به Build > Build Solution یا Ctrl + Shift + B بروید. این کار تمام وابستگی‌ها را از NuGet دانلود کرده و سپس برنامه را کامپایل می‌کند.

در نهایت، باید پیام Build succeeded را در خروجی کنسول ویژوال استودیو مشاهده کنید.

۳. نمونه خوشامدگو را بررسی کنید

Greeter یک نمونه ساده gRPC است که در آن کلاینت درخواستی را با یک نام ارسال می‌کند و سرور با پیامی که به دنبال آن نام آمده است پاسخ می‌دهد. یک پروژه Greeter وجود دارد که شامل تعریف سرویس مشترک (پروتو فایل) است که کلاینت و سرور بر اساس آن ساخته شده‌اند.

پروژه خوشامدگویی

این پروژه مشترکی است که بین کلاینت و سرور به اشتراک گذاشته می‌شود. این پروژه دارای یک greeter.proto است که تعریف سرویس gRPC است که کلاینت و سرور از آن استفاده می‌کنند. تعریف سرویس، یک سرویس gRPC به نام GreetingService را تعریف می‌کند و دارای یک متد greeting است که HelloRequest به عنوان ورودی و HelloResponse به عنوان خروجی می‌گیرد.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

این یک روش unary (یعنی بدون جریان) است که در آن کلاینت یک درخواست واحد ارسال می‌کند و یک پاسخ واحد از سرور دریافت می‌کند. می‌توانید بقیه محتوای greeter.proto. این پروژه همچنین دارای اسکریپتی به نام generate_protos.bat است که می‌تواند برای تولید stubهای کلاینت و سرور از فایل proto استفاده شود. این پروژه از قبل حاوی stubهای کلاینت و سرور تولید شده است، بنابراین لازم نیست آنها را خودتان تولید کنید. با این حال، اگر چیزی را در مورد فایل تعریف سرویس تغییر دهید، باید این اسکریپت را برای تولید مجدد stubها اجرا کنید.

سرور خوشامدگویی

این پروژه برای سرور gRPC است. Program.cs نقطه ورودی اصلی است که در آن پورت و پیاده‌سازی سرور تنظیم می‌شود. کلاس مهم GreeterServiceImpl.cs است. این کلاس یک متد greeting دارد که عملکرد واقعی در آن پیاده‌سازی می‌شود.

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

مشتری خوشامدگو

این سمت کلاینت سرویس gRPC است. همچنین Program.cs را به عنوان نقطه ورود دارد. این کانالی برای صحبت با سرور ایجاد می‌کند و سپس یک کلاینت با کانال از stub تولید شده ایجاد می‌کند. سپس یک درخواست ایجاد می‌کند و آن را با استفاده از stub کلاینت به سرور ارسال می‌کند.

۴. نمونه خوشامدگویی را اجرا کنید

ابتدا، سرور Greeter را اجرا کنید. یک خط فرمان باز کنید و به پوشه bin > Debug سرور Greeter بروید و فایل اجرایی را اجرا کنید. باید ببینید که سرور در حال گوش دادن است.

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

سپس، کلاینت Greeter را اجرا کنید. در یک خط فرمان جداگانه، به پوشه bin > Debug در Greeter Server بروید و فایل اجرایی را اجرا کنید. باید ببینید که کلاینت درخواست را ارسال و پاسخی از سرور دریافت می‌کند.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
Press any key to exit...

۵. نمونه خوشامدگو را به‌روزرسانی کنید

بیایید ببینیم به‌روزرسانی سرویس ما چگونه است. یک متد جدید به سرویس gRPC خود به نام goodbye اضافه کنید که به جای hello به کلاینت، goodbye را برمی‌گرداند.

اولین قدم، به‌روزرسانی فایل تعریف سرویس greeter.proto.

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
    
    rpc goodbye(HelloRequest) returns (HelloResponse);
}

در مرحله بعد، باید stub های کلاینت و سرور را دوباره تولید کنید. در خط فرمان، generate_protos.bat را اجرا کنید. پس از تولید stub ها، ممکن است لازم باشد پروژه‌های ویژوال استودیو خود را رفرش کنید تا کد به‌روز شده را دریافت کنید.

در نهایت، کد کلاینت و سرور را به‌روزرسانی کنید تا از مزایای متد جدید بهره‌مند شوید. در سرویس، GreeterServiceImpl.cs را به‌روزرسانی کنید و یک متد جدید goodbye اضافه کنید.

public override Task<HelloResponse> goodbye(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Goodbye " + request.Name });
}

در کلاینت، متد goodbye را در Program.cs.

response = client.goodbye(request);
Console.WriteLine("GreeterClient received response: " 
                       + response.Greeting);

پروژه را دوباره بسازید و سرور و کلاینت را دوباره اجرا کنید. اکنون باید ببینید که کلاینت یک پیام خداحافظی دریافت می‌کند.

> C:\grpc-samples-dotnet\GreeterClient\bin\Debug>GreeterClient.exe
GreeterClient sending request
GreeterClient received response: Hello Mete - on C#
GreeterClient received response: Goodbye Mete - on C#
Press any key to exit...

۶. نمونه چت را بررسی کنید

همچنین یک پروژه ChatServer و یک پروژه ChatWindowsClient در این راهکار وجود دارد. همانطور که از نامش پیداست، این یک جفت کلاینت و سرور برای یک برنامه چت ساده است. پروژه Chat دارای فایل تعریف سرویس به نام chat.proto است. این فایل یک ChatService با یک متد chat تعریف می‌کند.

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

نکته مهم اینجاست که هم پیام‌های چت ورودی و هم خروجی با کلمه کلیدی stream مشخص می‌شوند. این اساساً اتصال را به یک جریان دو طرفه تبدیل می‌کند که در آن کلاینت و سرور می‌توانند در هر زمانی به یکدیگر پیام ارسال کنند؛ یک راه‌حل عالی برای یک برنامه چت.

شما می‌توانید به عنوان یک تمرین، نمونه را بیشتر بررسی کنید، آن را بسازید و اجرا کنید تا ببینید چگونه کار می‌کند.

۷. تبریک می‌گویم!

آنچه ما پوشش داده‌ایم

  • زبان بافر پروتکل.
  • نحوه پیاده سازی سرویس gRPC با استفاده از سی شارپ
  • نحوه پیاده سازی کلاینت gRPC با استفاده از سی شارپ.
  • نحوه به‌روزرسانی سرویس gRPC

مراحل بعدی