Введение в gRPC в .NET Core – iFour Technolab

gRPC – это система удаленного вызова процессов с открытым исходным кодом, разработанная в Google в 2015 году.Поддерживаемые языки программирования: C++, Java (+ Android), Objective-C (iOS), Python, Ruby, Go, C#, NodeJS и другие.Он использует HTTP / 2 для передачи двоичных сообщений и через буфер протокола по умолчанию в качестве языка определения интерфейса (IDL) для описания интерфейса службы и состава сообщений.


service Greeter
{  
  rpcSayHi (HiRequest) returns (HiReply) {}  
}  

message HiRequest {  
    string name = 1;  
}  

message HiReply {  
    string message = 1;  
} 

Вход в полноэкранный режим Выход из полноэкранного режима

gRPC определяет два типа сервисных методов,

  • Унарные RPC, когда клиент посылает запрос на сервер и получает такой же ответ.
  • Клиентские потоковые RPC, когда клиент пишет последовательность сообщений и отправляет их на сервер, используя повторно предоставленный поток.
  • Двунаправленный потоковый RPC, когда клиент и сервер обмениваются сообщениями в обоих направлениях.
  • Серверный потоковый RPC, когда клиент посылает серверу сообщение с призывом к участию и получает последовательность ответов.

Если сравнивать gRPC с Web API, то различия заключаются в следующем,

  • Web API основан на архитектуре REST, в то время как gRPC предлагает модель RPC, модель, в которой удаленный процесс запрашивается на сервере как клиент.
  • Web API использует HTTP для транспортировки, в то время как gRPC использует HTTP / 2.
  • Данные, которыми обменивается Web API, имеют человекочитаемый формат (особенно JSON), в то время как gRPC использует компактный двоичный формат.

Создание службы gRPC

Приложение, которое мы будем создавать, представляет собой микросервис, который рассчитывает скидку в зависимости от типа клиента – Золотой, Платиновый или Серебряный.

Давайте начнем с создания новой папки, gRPC-dotnet-microservice, добавив в нее как клиентские, так и сервисные приложения.

Перейдите в эту папку и создайте проект сервера, набрав в окне консоли следующую команду.

Приведенная выше команда создает новый шаблон . .NET Core gRPC-проект в папке DiscountServices.

Определение контракта

Первым шагом является определение контракта, который представляет собой интерфейс, указывающий на функциональность или функции, открываемые службой. Во фреймворке gRPC этот интерфейс определяется буфером протокола или protobuf. Этот интерфейс конкретно определяется в файле .proto.


syntax = "proto3";  

  option csharp_namespace = "DiscountService";  
  package Discount;  

service DiscountAmount 
{  
  rpc Amount (CalculateRequest) returns (CalculateReply);  
}  

message CalculateRequest 
{  
  string customertype = 1;  
}  

message CalculateReply 
{  
  double customerdiscount = 1;  
} 

Вход в полноэкранный режим Выход из полноэкранного режима

Давайте разберем строку за строкой. Первые две строки используют синтаксис используемой версии proto buff и пространство имен C#. В следующей строке указывается имя пакета, в данном случае = Discount.

После того как контракт определен, необходимо создать приложение, осведомленное о новом proto файле. Обновите файлDiscountService.csproj, приведенный ниже,

<project sdk="Microsoft.NET.Sdk.Web">
<propertygroup>
<targetframework>netcoreapp3.1</targetframework>
</propertygroup>
<itemgroup>
<protobuf grpcservices="Server" include="Protosdiscount-service.proto"></protobuf></itemgroup>
<itemgroup>
<packagereference include="Grpc.AspNetCore" version="2.27.0">
</packagereference></itemgroup>
</project>

Войдите в полноэкранный режим Выйдите из полноэкранного режима

Читать далее: Как защитить публичные Apis в Asp.net Core?

Реализация службы

Перейдите в папку services, переименуйте файл GreeterService.cs в DiscountService.cs и измените его содержимое на следующее.


using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Threading.Tasks;  
using Grpc.Core;  
using Microsoft.Extensions.Logging;  
namespace DiscountService
{  
    public class DiscountAmountService :DiscountAmount.DiscountAmountBase
    {  
        private readonlyILogger<discountamountservice> _logger;  
        public DiscountAmountService(ILogger<discountamountservice> logger)  
        {  
            _logger = logger;  
        }  
        public override Task<calreply>AmountCalculate(CalRequest request, ServerCallContext context)  
        {  
            return Task.FromResult(new CalReply
            {  
        Customerdiscount=ReturnDiscount(request.Customertype)  
            });  
        }   
        private double ReturnDiscount(string customertype)  
        {  
            double discount=0.0;  
            if (customertype=="GOLD")  
            {  
                discount=15.6;   
            }  
            else if (customertype=="PLATINUM")  
            {  
                discount=20.6;  
            }  
            else if (customertype=="DIAMOND")  
            {  
                discount=25.6;  
            }  
            return discount;  
        }  
    }  
} </calreply></discountamountservice></discountamountservice>

Вход в полноэкранный режим Выйти из полноэкранного режима

Мы реализуем класс DiscountAmountService, который наследуется от класса DiscountAmount.DiscountAmountBase. Этот базовый класс создается на основе данных, содержащихся в файле .proto во время сборки.

Он имеет функцию AmountCalculate, которая реализует определение rpc в файле .proto, типы CalculatorReply и CalculateRequest в качестве возвращаемых типов и параметры запроса, определенные как типы сообщений.

Создание клиента gRPC

Перейдите в папку grpc-dotnet-microservice и создайте новый проект, введя следующую команду в cmd.

Приведенная выше команда создаст консольное приложение в созданной папке DiscountCalClient. Теперь перейдите в эту папку и добавьте необходимые зависимости, введя следующие команды.


<code>dotnet add DiscountCalClient.csproj package Grpc.Net.Client
dotnet add DiscountCalClient.csproj package Google.Protobuf
dotnet add DiscountCalClient.csproj package Grpc.Tools</code>

Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь клиентское приложение должно знать подробности о том, как запрашивать серверное приложение, какие параметры передавать, и каков будет возможный тип возврата.

Ищете выделенного веб-разработчика ASP.NET Core? Ваши поиски на этом заканчиваются.

Это делается путем добавления предопределенного файла proto. Сначала нужно создать папку proto внутри DiscountCalClient и скопировать discount-service.proto из службы gRPC и обновить файл проекта DiscountCalClient.csproj, добавив ссылку на файл .proto.

          <project sdk="Microsoft.NET.Sdk">

<propertygroup>
<outputtype>Exe</outputtype>
<targetframework>netcoreapp3.1</targetframework>
</propertygroup>

<itemgroup>
<packagereference include="Google.Protobuf" version="3.14.0">
<packagereference include="Grpc.Net.Client" version="2.33.1">
<packagereference include="Grpc.Tools" version="2.34.0">
<includeassets>runtime; build; native; contentfiles; analyzers; buildtransitive</includeassets>
<privateassets>all</privateassets>
</packagereference>
</packagereference></packagereference></itemgroup>

<itemgroup>
<protobuf grpcservices="Client" include="Protosdiscount-service.proto">
</protobuf></itemgroup>

</project>

Вход в полноэкранный режим Выход из полноэкранного режима

Обратите внимание, что в элементе Protobuf атрибут GrpcServices установлен на client. Теперь, чтобы вызвать службу gRPC из клиента, отредактируйте файл Program.cs,


using System;  
using DiscountService;  
using Grpc.Net.Client;  
using System.Net.Http;  
namespace DiscountCalClient
{  
    class Program  
    {  
        static void Main(string[] args)  
        {  
      varhttpHandler = new HttpClientHandler();  

      httpHandler.ServerCertificateCustomValidationCallback = HttpClientHandler.DangerousAcceptAnyServerCertificateValidator;  

            string customerType="GOLD";  
      var model=GrpcModel.ForAddress("https://localhost:5000",new GrpcModelOptions{ HttpHandler = httpHandler });  
      var client=new DiscountAmount.DiscountAmountClient(model);  
      var request=new CalculateRequest{Customertype=customerType};  
      var reply=  client.AmountCalculate(request);  

      Console.WriteLine(${customerType} is {( reply.Customerdiscount)}");   
      Console.ReadKey();  

        }  
    }  
}  

Войдите в полноэкранный режим Выйти из полноэкранного режима

Здесь мы создаем модель, которая указывает на адрес, где запущен сервис, с добавлением необходимой конфигурации для игнорирования недействительного сертификата или сертификата, который не установлен, и далее передаем в качестве конструктора в класс gRPC клиента DiscountAmountClient. Наконец, вызывается его функция с передачей необходимых параметров.

Вывод в клиентском приложении после запуска командой: DotNet Run,

Заключение

В этом посте мы рассмотрели основные принципы GRPC. Надеемся, теперь вы сможете самостоятельно реализовать gRPC-сервисы. Хотя основным недостатком является отсутствие поддержки браузерами, нет недостатка в видах, в которых он будет блистать или, по крайней мере, станет достойным дополнением к вашему набору инструментов. Создание микросервисов, нативных мобильных приложений или Интернета вещей (IoT) – вот лишь несколько примеров, где gRPC будет как нельзя кстати.

Оцените статью
Procodings.ru
Добавить комментарий