1. نظرة عامة
gRPC هي مجموعة أدوات وإطار عمل لاستدعاء الإجراء عن بُعد (RPC) لا يعتمد على لغة أو نظام أساسي، وقد تم تطويرها في Google. تتيح لك تحديد خدمة باستخدام "مخازن البروتوكولات المؤقتة"، وهي مجموعة أدوات ولغة تسلسل ثنائي فعّالة بشكل خاص. بعد ذلك، تتيح لك إنشاء نماذج أولية للعملاء والخوادم بلغات مختلفة من تعريف الخدمة.
في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية إنشاء خدمة C# تعرض واجهة برمجة تطبيقات باستخدام إطار عمل gRPC. يمكنك التفاعل مع هذه الخدمة باستخدام برنامج عميل لوحدة التحكّم مكتوب بلغة C# ويستخدم وصف الخدمة نفسه.
ما ستتعلمه
- لغة Protocol Buffer
- كيفية تنفيذ خدمة gRPC باستخدام C#
- كيفية تنفيذ برنامج gRPC باستخدام C#
- كيفية تعديل خدمة gRPC
المتطلبات
- متصفّح، مثل Chrome أو Firefox
- تثبيت Visual Studio 2013 أو إصدار أحدث
- يجب أن يكون لديك معرفة بإطار عمل .NET ولغة C# .
كيف ستستخدم هذا البرنامج التعليمي؟
ما هو تقييمك لتجربة استخدام Google Cloud Platform؟
2. تنزيل نماذج gRPC C# وإنشاؤها
تنزيل عينات
نزِّل مستودع نموذج gRPC C# كملف zip واستخرِج الملفات.
يمكنك بدلاً من ذلك استنساخ مستودع git الخاص به.
git clone https://github.com/meteatamel/grpc-samples-dotnet.git
في كلتا الحالتين، يجب أن يكون لديك مجلد grpc-samples-dotnet يتضمّن المحتوى التالي:

إنشاء الحل
يحتوي مجلد التطبيق النموذجي على GrpcSamples.sln، وهو حلّ Visual Studio. انقر مرّتين لفتح الحل في Visual Studio. من المفترض أن يظهر لك حلّ يتضمّن عددًا من المشاريع.

سنتناول المشاريع بمزيد من التفصيل في القسم التالي، ولكن أولاً، لننشئ المشروع. انتقِل إلى Build > Build Solution أو Ctrl + Shift + B لإنشاء الحلّ. سيؤدي ذلك إلى تنزيل جميع العناصر التابعة من NuGet ثم تجميع التطبيق.
في النهاية، من المفترض أن تظهر لك الرسالة Build succeeded في ناتج وحدة تحكّم Visual Studio.
3- استكشاف نموذج Greeter
Greeter هو نموذج بسيط من gRPC يرسل فيه العميل طلبًا يتضمّن اسمًا، ويردّ الخادم برسالة متبوعة بالاسم. هناك مشروع Greeter يتضمّن تعريف الخدمة الشائعة (ملف proto) الذي يستند إليه كل من العميل والخادم.
مشروع Greeter
هذا هو المشروع المشترك بين العميل والخادم. يحتوي على greeter.proto وهو تعريف خدمة gRPC التي يستخدمها العميل والخادم. يحدّد تعريف الخدمة خدمة gRPC تُسمى GreetingService، وتتضمّن طريقة greeting التي تتلقّى HelloRequest كمدخل وHelloResponse كمخرج.
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
}
هذه طريقة أحادية (أي بدون بث مباشر) يرسل فيها العميل طلبًا واحدًا ويتلقّى ردًا واحدًا من الخادم. يمكنك استكشاف بقية محتوى greeter.proto.. يحتوي هذا المشروع أيضًا على نص برمجي باسم generate_protos.bat يمكن استخدامه لإنشاء نماذج أولية للعميل والخادم من ملف proto. يحتوي المشروع على نماذج أولية للعميل والخادم تم إنشاؤها من قبل، لذا ليس عليك إنشاؤها بنفسك. ومع ذلك، إذا غيّرت أي شيء في ملف تعريف الخدمة، عليك تشغيل هذا النص البرمجي لإعادة إنشاء الرموز.
خادم Greeter
هذا هو مشروع خادم gRPC. Program.cs هي نقطة الدخول الرئيسية التي يتم فيها إعداد المنفذ وتنفيذ الخادم. الفئة المهمة هي GreeterServiceImpl.cs. يحتوي على طريقة greeting يتم فيها تنفيذ الوظيفة الفعلية.
public override Task<HelloResponse> greeting(HelloRequest request,
ServerCallContext context)
{
return Task.FromResult(new HelloResponse {
Greeting = "Hello " + request.Name });
}
Greeter Client
هذه هي جهة العميل في خدمة gRPC. يتضمّن أيضًا Program.cs كنقطة دخول. ينشئ هذا الرمز قناة للتواصل مع الخادم، ثم ينشئ عميلاً باستخدام القناة من الرمز البديل الذي تم إنشاؤه. ثم ينشئ طلبًا ويرسله إلى الخادم باستخدام رمز العميل.
4. تشغيل نموذج Greeter
أولاً، ابدأ تشغيل Greeter Server. افتح موجه الأوامر وانتقِل إلى مجلد bin > Debug الخاص بـ Greeter Server وشغِّل الملف التنفيذي. من المفترض أن يظهر لك الخادم وهو يستمع.
> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...
بعد ذلك، شغِّل Greeter Client. في موجه أوامر منفصل، انتقِل إلى مجلد 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...
5- تعديل نموذج Greeter
لنلقِ نظرة على شكل عملية تعديل خدمتنا. أضِف طريقة جديدة إلى خدمة gRPC باسم goodbye تعرض goodbye بدلاً من hello للعميل.
الخطوة الأولى هي تعديل ملف تعريف الخدمة greeter.proto.
service GreetingService {
rpc greeting(HelloRequest) returns (HelloResponse);
rpc goodbye(HelloRequest) returns (HelloResponse);
}
بعد ذلك، عليك إعادة إنشاء الرموز البديلة للعميل والخادم. في موجه الأوامر، شغِّل generate_protos.bat. بعد إنشاء التعليمات البرمجية الصورية، قد تحتاج إلى إعادة تحميل مشاريع Visual Studio للحصول على التعليمات البرمجية المعدَّلة.
أخيرًا، عدِّل رمز العميل والخادم للاستفادة من الطريقة الجديدة. في الخدمة، عدِّل 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...
6. استكشاف عيّنة Chat
يتضمّن الحل أيضًا مشروع ChatServer ومشروع ChatWindowsClient. كما يوحي الاسم، هذا هو زوج من البرامج، أحدهما للعميل والآخر للخادم، لتطبيق محادثة بسيط. يحتوي مشروع Chat على ملف تعريف الخدمة باسم chat.proto. يحدّد ChatService باستخدام طريقة chat.
service ChatService {
rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}
الأمر المهم هنا هو أنّ رسائل الدردشة الواردة والصادرة يتم وضع علامة stream عليها. يؤدي ذلك بشكل أساسي إلى تحويل الاتصال إلى بث ثنائي الاتجاه يمكن للعميل والخادم من خلاله إرسال الرسائل إلى بعضهما البعض في أي وقت، وهو الحل الأمثل لتطبيق محادثة.
يمكنك استكشاف العيّنة وإنشائها وتشغيلها لمعرفة طريقة عملها كتمرين.
7. تهانينا!
المواضيع التي تناولناها
- لغة "سلسلة البيانات المنظّمة"
- كيفية تنفيذ خدمة gRPC باستخدام C#
- كيفية تنفيذ برنامج gRPC باستخدام C#
- كيفية تعديل خدمة gRPC