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

1. Обзор

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

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

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

  • Язык буфера протокола.
  • Как реализовать службу 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, а затем скомпилировать приложение.

В конце вы должны увидеть сообщение Build succeeded в выходных данных консоли Visual Studio.

3. Изучите образец Greet

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

Приветственный проект

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

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

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

Приветственный сервер

Это проект для сервера 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

Сначала запустите сервер 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. Обновите образец Greeter

Давайте посмотрим, как выглядит обновление нашего сервиса. Добавьте в нашу службу gRPC новый метод под названием Goodbye, который возвращает клиенту «Прощай» вместо «Привет».

Первым шагом является обновление файла определения службы 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.

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