В этой статье я расскажу об основах gRPC, о том, что это такое, почему он существует и как вы можете реализовать свой собственный сервис в .Net.

Что такое RPC

Прежде всего, давайте опишем, что такое RPC; согласно Википедии:

В распределенных вычислениях удаленный вызов процедуры (RPC) — это когда компьютерная программа вызывает выполнение процедуры (подпрограммы) в другом адресном пространстве (обычно на другом компьютере в общей сети), которая записывается так, как если бы это была обычная ( local) вызов процедуры без явного указания программистом деталей удаленного взаимодействия.

RPC — это способ вызова подпрограммы или функции на каком-то удаленном сервере где-то в мире из вашей программы. Вызов RPC будет отображаться как обычный вызов из вашего собственного приложения, но на самом деле будет сетевым вызовом.

Что такое gRPC

GRPC — это версия Google RPC-фреймворка, которую они используют внутри компании уже более десяти лет. Это современная высокопроизводительная платформа удаленного вызова процедур (RPC) с открытым исходным кодом, которая может работать в любой среде.

Чаще всего он используется в распределенных системах для связи между службами. В центре всего этого находится .proto file , его можно считать API-контрактом между сервисами. Он не зависит от языка, и многие популярные языки поддерживают генерацию сервисного кода «из коробки» (подробнее об этом в следующем разделе).

Самые большие преимущества grpc:

  • Это высокая пропускная способность и низкая задержка при создании легковесных микросервисов.
  • Он поддерживает не только традиционную архитектуру запроса/ответа, но также потоковую передачу клиентов и серверных потоков.
  • Он общается через HTTP/2.0.

Буферы протокола

GRPC использует буферы протокола для передачи данных вместо JSON или XML, так что же это такое? С официальной страницы protobuf:

Буферы протоколов обеспечивают независимый от языка и платформы расширяемый механизм сериализации структурированных данных с прямой и обратной совместимостью. Это похоже на JSON, за исключением того, что он меньше и быстрее и генерирует привязки к родному языку.

Проще говоря, protobuf — это формат сериализации, используемый для обмена сообщениями.

Почему бы просто не использовать REST?

Но возникает вопрос: Почему бы нам просто не использовать сервисные вызовы RESTful? Большинство наших команд уже знакомы с REST.

Ключевые преимущества REST, такие как гибкость и относительная простота, делают его лучшим выбором для общедоступных API, которые используются любым сторонним приложением.

Но когда дело доходит до внутренней связи между службами, REST не обеспечивает безопасность, целостность данных, передаваемых в службы и из служб, имеет решающее значение. GRPC обеспечивает более тесную интеграцию между службами.

Это звучит знакомо…

Если вы когда-либо работали со службами WCF, во-первых, я тоже чувствую вашу боль, а во-вторых, gRPC очень похож на WCF, потому что они оба имеют определение службы, а многие популярные языки и фреймворки имеют встроенную автоматическую генерацию кода для обоих. Так что в каком-то смысле gRPC выглядит как более совершенная версия WCF. Однако есть ключевые отличия, поскольку gRPC обменивается данными только через HTTP/2.0, обеспечивая большую производительность и гибкость для разработчиков.

Хватит говорить, покажи мне код

Код, показанный в демо, можно найти на Github здесь.

Сторона сервера

Сначала создадим новый проект gRPC с интерфейсом командной строки dotnet, я использую .Net 6.0 для этой демонстрации, но вы можете использовать версии 6+, если хотите.

dotnet new grpc --name gRPCDemo

Теперь откройте проект в Visual Studio Code.

В центре всего этого находится .proto file , сначала мы определяем версию синтаксиса и, необязательно, мы определяем пространство имен проекта (игнорируйте это, если хотите)

Мы определяем приветствующего service, и это фактический контракт, которым мы поделимся с потребителями нашего приложения. Каждый метод будет иметь тип rpc и всегда будет принимать входной параметр и возвращать выходной параметр. Каждый входной или выходной параметр определяется как message , вы можете думать о сообщении как о классе со свойствами. Вот в чем загвоздка: нам нужно иметь ввод и вывод messages, даже если у них нет никаких свойств.

Теперь идем дальше и удаляем файлы greeter.proto и GreeterService.cs, потому что мы будем писать свой собственный код. Выполните следующее

cd Protos 
dotnet new proto --name productCatalog

Теперь вставьте код в новый файл proto.

Теперь перейдите к файлу csproj и замените welcome.proto на product.proto. Быстро выполните dotnet build, чтобы сгенерировать код службы gRPC.

Теперь создайте новый файл в разделе services и вставьте в него следующий код. Сервис возвращает список продуктов, но для простоты я жестко запрограммировал список продуктов.

И, наконец, обновить program.cs

Клиент в .Net

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

dotnet new console --name gRPCClient

Добавьте следующие пакеты

dotnet add package Grpc.Net.Client 
dotnet add package Google.Protobuf 
dotnet add package Grpc.Tools

Создайте новую папку с именем Protos в проекте и скопируйте файл product.proto, который мы видели ранее. Сделайте быстрый dotnet build и сгенерируйте код на стороне клиента. В этом прелесть gRPC: все, что вам нужно, это файл proto, и вам не нужно писать какую-либо логику подключения, она создается для вас ❤

И, наконец, в файле program.cs вставьте код клиента

Запустите приложение, и вы получите

Заключение

GRPC — это высокопроизводительная упрощенная структура RPC для связи между службами в распределенной системе.