برنامه نویسی

انجمن 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 با یک عدد صحیح پاسخ خواهد داد. ما نتایج را در پنجره خروجی کنسول خواهیم دید.

خروجی Colsole

تبریک می گویم! ما فقط با موفقیت یک Client و Server برنامه gRPC

منابع

عکس روی جلد توسط کریم منجرا در Unsplash

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

همچنین ببینید
بستن
دکمه بازگشت به بالا