Создание службы gRPC с помощью C#

1. Обзор

gRPC — это независимая от языка программирования и платформы платформа удаленного вызова процедур (RPC) и набор инструментов, разработанные в Google. Она позволяет определять сервис с помощью Protocol Buffers, особенно мощного набора инструментов и языка для бинарной сериализации. Затем она позволяет генерировать идиоматические клиентские и серверные заглушки из определения вашего сервиса на различных языках.

В этом практическом занятии вы научитесь создавать сервис на C#, предоставляющий API с использованием фреймворка gRPC. Вы будете взаимодействовать с этим сервисом с помощью консольного клиента, написанного на C#, который использует то же описание сервиса, что и сам сервис.

Что вы узнаете

  • Язык протокола Buffer.
  • Как реализовать gRPC-сервис с использованием C#.
  • Как реализовать gRPC-клиент на C#.
  • Как обновить службу gRPC.

Что вам понадобится

Как вы будете использовать этот учебный материал?

Прочитайте только от начала до конца. Прочитайте текст и выполните упражнения.

Как бы вы оценили свой опыт работы с Google Cloud Platform?

Новичок Средний Профессионал

2. Загрузите и соберите примеры gRPC на C#.

Скачать образец

Загрузите репозиторий с примерами gRPC на C# в виде ZIP-архива и распакуйте его.

В качестве альтернативы вы можете клонировать его репозиторий Git.

git clone https://github.com/meteatamel/grpc-samples-dotnet.git

В любом случае, у вас должна быть папка grpc-samples-dotnet со следующим содержимым:

d056832ff4ce0c8f.png

Создайте решение

В папке с примерами приложений находится файл GrpcSamples.sln , представляющий собой решение Visual Studio. Дважды щелкните по нему, чтобы открыть решение в Visual Studio. Вы должны увидеть решение, содержащее несколько проектов.

61da9ddc86c08019.png

В следующем разделе мы подробнее рассмотрим проекты, а сначала давайте просто соберем проект. Перейдите в Build > Build Solution или Ctrl + Shift + B чтобы собрать решение. Это загрузит все зависимости из NuGet, а затем скомпилирует приложение.

В итоге в консоли Visual Studio должно отобразиться сообщение « Build succeeded .

3. Ознакомьтесь с примером «Приветствующий».

Greeter — это простой пример gRPC, в котором клиент отправляет запрос с именем, а сервер отвечает сообщением, за которым следует это имя. Существует проект Greeter, который включает в себя общее определение сервиса (proto-файл), на котором основаны клиент и сервер.

Проект «Приветствующий»

Это общий проект, используемый как клиентом, так и сервером. Он содержит файл greeter.proto , в котором определяется gRPC-сервис, используемый как клиентом, так и сервером. В определении сервиса описывается gRPC-сервис под названием GreetingService , который имеет метод greeting , принимающий в качестве входных данных HelloRequest и в качестве выходных данных HelloResponse .

service GreetingService {
    rpc greeting(HelloRequest) returns (HelloResponse);
}

Это унарный (то есть без потоковой передачи) метод, при котором клиент отправляет один запрос и получает один ответ от сервера. Вы можете изучить остальное содержимое файла greeter.proto. В этом проекте также есть скрипт generate_protos.bat , который можно использовать для генерации заглушек клиента и сервера из файла proto. Проект уже содержит сгенерированные заглушки клиента и сервера, поэтому вам не нужно генерировать их самостоятельно. Однако, если вы измените что-либо в файле определения сервиса, вам потребуется запустить этот скрипт для повторной генерации заглушек.

Сервер приветствия

Это проект для gRPC-сервера. Program.cs является основной точкой входа, где настраивается порт и реализация сервера. Важный класс — GreeterServiceImpl.cs . В нём есть метод greeting , в котором реализована фактическая функциональность.

public override Task<HelloResponse> greeting(HelloRequest request,
       ServerCallContext context)
{
    return Task.FromResult(new HelloResponse { 
          Greeting = "Hello " + request.Name });
}

Приветствующий клиента

Это клиентская часть gRPC-сервиса. В качестве точки входа используется файл Program.cs . Он создает канал для связи с сервером, а затем создает клиент с этим каналом из сгенерированного заглушки. После этого он формирует запрос и отправляет его на сервер, используя клиентскую заглушку.

4. Запустите пример приветствия.

Сначала запустите сервер Greeter. Откройте командную строку, перейдите в папку bin > Debug сервера Greeter и запустите исполняемый файл. Вы должны увидеть, что сервер прослушивает соединение.

> C:\grpc-samples-dotnet\GreeterServer\bin\Debug>GreeterServer.exe
GreeterServer listening on port 50051
Press any key to stop the server...

Далее запустите клиент Greeter. В отдельной командной строке перейдите в папку bin > Debug сервера Greeter и запустите исполняемый файл. Вы должны увидеть, как клиент отправляет запрос и получает ответ от сервера.

> 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. Обновите пример приветствия.

Давайте посмотрим, как выглядит обновление нашего сервиса. Добавим в наш 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. Ознакомьтесь с примером чата.

В решении также присутствуют проекты ChatServer и ChatWindowsClient . Как следует из названия, это пара клиент-сервер для простого приложения чата. Проект Chat содержит файл определения сервиса под названием chat.proto . В нем определяется ChatService с методом chat .

service ChatService {
 rpc chat(stream ChatMessage) returns (stream ChatMessageFromServer);
}

Важно отметить, что как входящие, так и исходящие сообщения чата помечаются ключевым словом stream . Это, по сути, превращает соединение в двунаправленный поток, где клиент и сервер могут отправлять сообщения друг другу в любое время; идеальное решение для чат-приложения.

Вы можете подробнее изучить пример, собрать и запустить его, чтобы посмотреть, как он работает, в качестве практического упражнения.

7. Поздравляем!

Что мы рассмотрели

  • Язык протокола буферизации.
  • Как реализовать gRPC-сервис с использованием C#.
  • Как реализовать gRPC-клиент на C#.
  • Как обновить службу gRPC.

Следующие шаги