انجمن gRPC و Net Core – DEV
بهعنوان توسعهدهندگان، در حین ساخت برنامههای API، خود را بین انتخابهای مختلفی از فریمورکها مییابیم باقی مانده، صابون، GraphQL، HTTP API و بیشتر. ممکن است برای یک توسعه دهنده دشوار باشد که برنامه درستی را انتخاب کند که نیازهای برنامه را برآورده کند.
در این پست، میخواهم gRPC را که یکی از روشهای جدیدتر است، به شما معرفی کنم. gRPC از بسیاری از زبانها پشتیبانی میکند C#/.Net، C++، دارت، برو، جاوا و سایر زبان های رایج امروز ما بر روی چگونگی ادغام gRPC با ASP.Net Core تمرکز می کنیم.
در پایان این پست، درک اولیه ای از اینکه gRPC چیست، چگونه با ASP.Net Core کار می کند و اینکه آیا برای برنامه شما مناسب است یا نه، خواهید داشت. ما یک برنامه Client/Server پیاده سازی خواهیم کرد، شما می توانید کد کار کامل را در مخزن Git، پیوند زیر، پیدا کنید.
بیا شروع کنیم…
gRPC چیست؟
gRPC مخفف Google Remote Procedure Calls است. در ابتدا توسط گوگل طراحی شد تا برنامه های کاربردی توزیع شده را برای هر دو قابل مدیریت تر کند Client
و Server
. gRPC با استفاده از بافرهای پروتکل و HTTP/2، طراحی قدیمی RPC را قابل اجرا و کارآمد میکند. gRPC با بافرهای پروتکل معادل JSON یا XML با REST API است. مشخصات HTTP/2 در سال 2015 منتشر شد و بر روی طراحی 20 ساله HTTP/1.1 بهبود یافت.
بافرهای پروتکل چیست؟
gRPC از چندین فرمت سریالسازی پشتیبانی میکند، اما رایجترین آنها Protocol Buffers است. این یک ساختار سریال سازی منبع باز است که به طور خاص برای کارایی و بهینه سازی طراحی شده است. تجزیه داده ها با بافرهای پروتکل از CPU کمتری استفاده می کند زیرا داده ها در قالب دودویی نمایش داده می شوند که امکان به حداقل رساندن اندازه پیام های رمزگذاری شده را فراهم می کند.
gRPC و .Net Core
از طرف مایکروسافت، تیم دات نت برای آوردن gRPC به جامعه دات نت کار کرده است. قبلاً یک کتابخانه اولیه داشتید که به خوبی کتابخانه های دیگر نبود و هیچ الگوی پروژه ای نداشتید که به شما کمک کند برنامه خود را با gRPC تنظیم کنید. اکنون کتابخانه بهتر و پشتیبانی بهتری داریم.
اکنون یک برنامه gRPC برای هر دو a ایجاد می کنیم Server
و الف Client
. در حین ایجاد برنامه gRPC، سعی خواهیم کرد تا حد امکان نیازهای زندگی واقعی را برآورده کنیم. برای آن دو برنامه مستقل یکی برای Client و دیگری برای سرور ایجاد خواهیم کرد. ما داده های تو در تو را از Client
شامل عدد صحیح، رشته و تاریخ و همچنین دریافت پاسخ از Server
و آن را پردازش کنید.
راه اندازی gRPC
برای Server
ما یک برنامه وب AspNetCore جدید ایجاد می کنیم و بسته های زیر را اضافه می کنیم. شما می توانید از هر قالب دیگری به دلخواه استفاده کنید.
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.22.1" />
<PackageReference Include="Grpc.AspNetCore" Version="2.51.0" />
<PackageReference Include="Grpc.AspNetCore.Web" Version="2.51.0" />
<PackageReference Include="Grpc.Tools" Version="2.52.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
برای Client
ما یک برنامه کنسول ایجاد می کنیم و بسته های زیر را اضافه می کنیم.
<ItemGroup>
<PackageReference Include="Google.Protobuf" Version="3.22.1" />
<PackageReference Include="Grpc.Net.Client" Version="2.51.0" />
<PackageReference Include="Grpc.Net.Client.Web" Version="2.51.0" />
<PackageReference Include="Grpc.Tools" Version="2.52.0">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
برای هر دو پروژه یک پروژه جدید اضافه کنید Protos
پوشه و یک فایل خالی جدید با نام company.proto ایجاد کنید.
ما از Proto Buffers برای ترسیم سرویس gRPC، درخواست و پاسخ خود استفاده خواهیم کرد. ما یک ساختار تودرتوی شرکت و کارمند و یک ظرف برای پاسخ ایجاد خواهیم کرد.
syntax = "proto3";
import "google/protobuf/timestamp.proto";
option csharp_namespace = "GrpcServer";
// The Company service definition.
service Company {
// Sends a greeting
rpc PostCompanyWithEmployees (CompanyModel) returns (Response);
}
// The request message containing the companies's details with employees.
message CompanyModel {
int32 companyId = 1;
string comapnyName = 2;
repeated EmployeeModel employees = 3;
}
// The request message containing the employee's details.
message EmployeeModel {
int32 empId = 1;
string empName = 2;
int32 companyId = 3;
google.protobuf.Timestamp birthDate = 4;
}
// The response message containing the response status.
message Response {
int32 status = 1;
}
اکنون، فقط برنامه را ذخیره و بسازید. خط زیر اضافه خواهد شد .csproj
فایل.
<ItemGroup>
<Protobuf Include="Protos\company.proto" GrpcServices="Server" />
</ItemGroup>
ما باید به ویژگی GrpcServices توجه کنیم. این نشان می دهد که برنامه در کدام سمت قرار خواهد گرفت، Server
یا Client
. در حالت فوق به صورت نشان داده می شود Server
جایی که در برنامه دیگر مانند آن خواهد بود Client
. در صورتی که در آن Server
و Client
هر دو در همان پروژه هستند که خواهد بود Server,Client
.
سرویس gRPC
در Client
برنامه را باز کنید program.cs
فایل و روشی برای اضافه کردن جزئیات شرکت و کارمند ایجاد کنید. ما این روش را از قسمت فراخوانی خواهیم کرد Main()
تابع.
در اینجا ما یک کانال gRPC با URL راه دور سرور gRPC ایجاد می کنیم که با سرور gRPC ارتباط برقرار می کند. پس از آن باید ایجاد کنیم Employee
و Company
اشیاء برای ارسال آن با سرویس.
var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions
{
HttpHandler = new GrpcWebHandler(new HttpClientHandler())
});
var readerClient = new Company.CompanyClient(channel);
//Creating new employees
var employees = new EmployeeModel[]
{
new EmployeeModel
{
EmpId = 1,
EmpName = "Rama Bapat",
BirthDate = Timestamp.FromDateTime(DateTime.UtcNow.AddYears(-24).AddMonths(-4)),
CompanyId = 1
},
new EmployeeModel
{
EmpId = 2,
EmpName = "Krishna Nene",
BirthDate = Timestamp.FromDateTime(DateTime.UtcNow.AddYears(-22).AddMonths(-7)),
CompanyId = 1
}
};
//Creating new company
var company = new CompanyModel
{
CompanyId = 1,
ComapnyName = "Patankar Khauwale"
};
//Adding employees to company model
company.Employees.Add(employees);
//Calling the server channel
var responseData = await readerClient.PostCompanyWithEmployeesAsync(company);
if (responseData.Status == 1)
{
Console.WriteLine("Company & Employees added Successfully.");
}
else
{
Console.WriteLine("Company & Employees could not be added, please try again.");
}
در حال حاضر در Server
برنامه، یک متد با نام ایجاد کنید PostCompanyWithEmployees
و انتظار CompanyModel
به عنوان ورودی با gRPC.Respose
به عنوان نوع برگشتی
public override Task<Response> PostCompanyWithEmployees(CompanyModel request, ServerCallContext context)
{
try
{
//Add your database/API call here to save the Employee & Company details.
//After successful post call return the Status as 1 else 0.
return Task.FromResult(new Response
{
Status = 1
});
}
catch
{
return Task.FromResult(new Response
{
Status = 0
});
}
}
پس از انجام همه کارها، ما هر دو برنامه را اجرا می کنیم و سرور را صدا می کنیم و باید از آن پاسخ دریافت کنیم. در مورد ما Server
با یک عدد صحیح پاسخ خواهد داد. ما نتایج را در پنجره خروجی کنسول خواهیم دید.
تبریک می گویم! ما فقط با موفقیت یک Client
و Server
برنامه gRPC
منابع
عکس روی جلد توسط کریم منجرا در Unsplash