В этой статье я расскажу об основах 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 для связи между службами в распределенной системе.