1. Обзор
gRPC — это независимая от языка программирования и платформы платформа удаленного вызова процедур (RPC) и набор инструментов, разработанные в Google. Она позволяет определять сервис с помощью Protocol Buffers, особенно мощного набора инструментов и языка для бинарной сериализации. Затем она позволяет генерировать идиоматические клиентские и серверные заглушки из определения вашего сервиса на различных языках.
В этом практическом занятии вы научитесь создавать сервис на C#, предоставляющий API с использованием фреймворка gRPC. Вы будете взаимодействовать с этим сервисом с помощью консольного клиента, написанного на C#, который использует то же описание сервиса, что и сам сервис.
Что вы узнаете
- Язык протокола Buffer.
- Как реализовать gRPC-сервис с использованием C#.
- Как реализовать gRPC-клиент на C#.
- Как обновить службу gRPC.
Что вам понадобится
- Браузер, например Chrome или Firefox .
- Установлена Visual Studio 2013 или более поздней версии.
- Знание платформы .NET Framework и языка C# .
Как вы будете использовать этот учебный материал?
Как бы вы оценили свой опыт работы с Google Cloud Platform?
2. Загрузите и соберите примеры gRPC на C#.
Скачать образец
Загрузите репозиторий с примерами gRPC на C# в виде ZIP-архива и распакуйте его.
В качестве альтернативы вы можете клонировать его репозиторий Git.
git clone https://github.com/meteatamel/grpc-samples-dotnet.git
В любом случае, у вас должна быть папка grpc-samples-dotnet со следующим содержимым:

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

В следующем разделе мы подробнее рассмотрим проекты, а сначала давайте просто соберем проект. Перейдите в 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.
Следующие шаги
- Узнайте больше о Windows на платформе Google Cloud Platform .
- Узнайте больше о .NET на платформе Google Cloud Platform .
- Узнайте больше об облачных инструментах для Visual Studio .