gRPC لـ C# (.NET): المكتبات وأمثلة الاستخدام
\n\ngRPC هو إطار عمل عالي الأداء لاستدعاء الإجراءات عن بُعد (RPC) من Google، يعتمد على HTTP/2 و Protocol Buffers (protobuf). في نظام .NET البيئي، أصبح gRPC المعيار الفعلي للتواصل بين الخدمات المصغرة، مما يوفر كتابة صارمة للأنواع، ونقل ثنائي الاتجاه، وزمن انتقال منخفض. في هذه المقالة، سنستعرض المكتبات الرئيسية للعمل مع gRPC في C# ونقدم أمثلة عملية لإعداد الخادم والعميل.
\n\nالمكتبات الأساسية لـ gRPC في .NET
\n\nللعمل مع gRPC في .NET، تُستخدم الحزم التالية من NuGet:
\n\n- \n
- Grpc.AspNetCore — دمج خادم gRPC في ASP.NET Core (موصى به للاستضافة). \n
- Grpc.Net.Client — مكتبة العميل لـ .NET (بما في ذلك .NET Core، .NET 5+). \n
- Grpc.Tools — مولد الكود من ملفات
.proto(يُضاف كعنصرProtobufفي ملف .csproj). \n - Google.Protobuf — العمل مع رسائل protobuf. \n
جميع هذه الحزم مدعومة من Microsoft ويتم تطويرها بنشاط. يتم التثبيت عبر NuGet Package Manager أو واجهة سطر الأوامر dotnet CLI:
\n\ndotnet add package Grpc.AspNetCore\ndotnet add package Grpc.Net.Client\ndotnet add package Google.Protobuf\ndotnet add package Grpc.Tools\n\nإنشاء خادم gRPC بلغة C#
\n\nلننظر في إنشاء خدمة بسيطة للعمل مع الطلبات خطوة بخطوة.
\n\n1. تعريف ملف proto
\nأنشئ ملفًا باسم order.proto في مشروع الخادم (مثل GrpcServer):
syntax = "proto3";\n\nservice OrderService {\n rpc GetOrder (OrderRequest) returns (OrderResponse);\n rpc SubscribeOrders (OrderRequest) returns (stream OrderResponse);\n}\n\nmessage OrderRequest {\n int32 order_id = 1;\n}\n\nmessage OrderResponse {\n int32 order_id = 1;\n string status = 2;\n double total = 3;\n}\n\n2. إعداد ملف .csproj لتوليد الكود
\nأضف إلى ملف .csproj:
<ItemGroup>\n <Protobuf Include="order.proto" GrpcServices="Server" />\n</ItemGroup>\n\n3. تنفيذ الخدمة
\nأنشئ فئة ترث من الفئة الأساسية المُنشأة:
\n\npublic class OrderServiceImpl : OrderService.OrderServiceBase\n{\n public override Task<OrderResponse> GetOrder(OrderRequest request, ServerCallContext context)\n {\n return Task.FromResult(new OrderResponse\n {\n OrderId = request.OrderId,\n Status = "Shipped",\n Total = 99.99\n });\n }\n\n public override async Task SubscribeOrders(OrderRequest request, \n IServerStreamWriter<OrderResponse> responseStream, ServerCallContext context)\n {\n for (int i = 0; i < 5; i++)\n {\n await responseStream.WriteAsync(new OrderResponse\n {\n OrderId = request.OrderId,\n Status = $"Update #{i}",\n Total = 100 + i * 10\n });\n await Task.Delay(1000);\n }\n }\n}\n\n4. التسجيل في Program.cs
\n\nvar builder = WebApplication.CreateBuilder(args);\nbuilder.Services.AddGrpc();\n\nvar app = builder.Build();\napp.MapGrpcService<OrderServiceImpl>();\napp.MapGet("/", () => "gRPC server is running");\napp.Run();\n\nإنشاء عميل gRPC بلغة C#
\n\nالآن سننشئ تطبيق وحدة تحكم عميل (GrpcClient).
1. التحضير
\nانسخ ملف order.proto إلى مشروع العميل وحدد في .csproj:
<Protobuf Include="order.proto" GrpcServices="Client" />\n\n2. كود العميل
\n\nusing Grpc.Net.Client;\nusing GrpcClient;\n\nvar channel = GrpcChannel.ForAddress("https://localhost:5001");\