Введение в проблему

Несколько лет назад я экспериментировал с новой функцией gRPC, которую .Net представил в своем каталоге приложений .Net Core. Я был относительно новичком в gRPC и хотел узнать, как взаимодействуют эти API и смогу ли я включить службу gRPC в свой текущий HTTP REST.

Немного покопавшись, я обнаружил, что существует возможность адаптировать сервер gRPC и заставить его понимать и обрабатывать HTTP запросы клиентов. Это называется транскодированием (дополнительную информацию можно найти в официальной документации здесь).

Пока все хорошо, верно? Неправильный! Хотя функция перекодирования действительно была доступна для многих языков, в .Net не было поддержки (это было примерно в 2019/2020), и я попытал счастья, спросив в stackoverflow (библии ИТ), знает ли кто-нибудь об альтернативе (вы можете проверить мой вопрос здесь). Может быть, мне повезло, но спустя 2 года команда .Net откликнулась на мои молитвы и включила в новый .Net 7 функцию транскодирования (объясняют здесь).

В этой статье я покажу вам, как создать и запустить собственный перекодированный сервер gRPC и протестировать его с двумя типами клиентов: HTTP-клиентом и gRPC<. /strong> Клиент.

Предпосылки

Чтобы реализовать это решение, на вашем устройстве должен быть установлен .Net 7 SDK (на момент написания этой статьи доступна только предварительная версия). Вы можете скачать это здесь".

Кроме того, не обязательно, я рекомендую установить IDE, например Visual Studio, и загрузить проект с ее помощью. Это облегчит отладку и навигацию по различным проектам.

Другие конкретные предпосылки будут объяснены ниже.

Реализация сервера

Для серверной реализации мы будем следовать той же реализации, что и официальная, предоставленная командой .Net, которая объясняется здесь.

Если вы используете Visual Studio 2022, вы можете довольно легко создать новый сервер gRPC. Просто нажмите на этот тип при создании нового проекта.

Созданный сервер будет иметь следующую структуру:

Примечание. Я использую Visual Studio для Mac, поэтому он может немного отличаться от версии для Windows.

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

Я уже говорил, что VS создает структуру, которую я показал. Ну это не совсем так. Папка Protos создается вручную и содержит определение нашего файла .proto и всех последующих файлов proto, которые он импортирует и использует. Для примера мы определили следующий файл .proto:

Приведенный выше файл proto определяет одну функцию SayHello. А теперь самое интересное! Эта функция предназначена для доступа как с помощью простого запроса HTTP GET, так и с помощью запроса gRPC. Это делается путем добавления параметраsequence в определение функции.

Основное отличие состоит в том, что если вы хотите получить доступ к серверу через запрос gRPC, вам придется создать сообщение запроса (сообщение HelloRequest, определенное в прото файл). Однако, если вы хотите получить доступ к серверу с помощью запроса HTTP GET, все, что вам нужно сделать, это запустить запрос HTTP и добавить необходимые параметры в путь ( имя).

Для запуска сервера мы будем использовать следующее определение Program.cs.

Этот Program.csсоздает .Net WebApp и объявляет его как сервер gRPC, который можно перекодировать (строка 9 определение). Как только это будет определено, мы добавим службы, которые будут иметь наш сервер gRPC. Поскольку у нас есть только GreeterService, мы добавляем его. Наконец, мы открываем конкретный URL-адрес, на который ответит сервер, и запускаем его. И при этом сервер должен быть запущен!!

Реализация клиентов

Для клиента gRPC вы можете использовать точно такую ​​же реализацию, которая определена в официальной документации .Net.

Примечание. Вам потребуется скопировать файл .proto в клиентский проект и импортировать его в Program.cs, поскольку он содержит определение GreeterService.

Теперь о клиенте HTTP GET. Это также довольно просто: мы просто создадим новый клиент HTTP, используя стандартную библиотеку .Net HTTP, а затем воспользуемся функцию GetAsync клиента, чтобы запустить запрос к серверу gRPC.

Протестируем сервер

Теперь, когда все настроено, давайте поиграем с сервером! Поскольку существует множество конфигурационных файлов и универсальных определений, я буду использовать общий проект, опубликованный в Git. Вы можете видеть это здесь".

В проекте есть 3 разные папки, одна для сервера и по одной для каждой клиентской реализации.

Сначала мы запустим сервер. Для этого вам нужно получить доступ к папке сервера, восстановить пакеты nuget и запустить сервер. Это можно сделать, открыв консоль и выполнив следующие команды:

Для клиентов можно использовать те же команды, что и для сервера, но с доступом к определенной папке клиента (grpcClient или httpClient). Каждый клиент отправляет определенное сообщение-приветствие со своим протоколом связи.

Когда вы отправляете запрос с помощью клиента HTTP, сервер отображает следующее сообщение:

Когда вы отправляете запрос с помощью клиента gRPC, сервер отображает следующее сообщение:

Последние мысли

В заключение я должен сказать, что функциональность gRPC «перекодирования» в .Net требует много времени, но это отличный способ улучшить и расширить ваш служба gRPC. Я особенно рад видеть, как это повлияет на компании и проекты, использующие микросервисную архитектуру. Функция транскодирования позволяет разработчикам создавать новые серверы gRPC (заменяя REST и GraphQL API) и поддерживать совместимость. со своими «запросчиками», которые отправляют HTTP запросы к своим службам.

Я не проводил никаких исследований производительности и того, как перекодированный сервер gRPC работает по сравнению с классическим обменом данными HTTP (REST или GraphQL API). Может быть, это лучше, а может быть, и хуже, но все, что я могу сказать, это то, что (на мой взгляд) чем «универсальнее» ваш сервер, тем лучше. А функция транскодирования вам в этом точно поможет.

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

Удачного кодирования :)