gRPC
June 25, 2023

Руководство по gRPC и перехватчикам

Ведущий инженер-программист Джек Хьюз рассказывает нам о тонкостях перехватчиков gRPC, о том, как начать работу с первой реализацией, и о реальном примере — развертывании edge locations.

Эта статья предполагает что вы имеете общее понимание и опыт работы с protocol buffers, но если вы новичок в этом вопросе, то в Интернете есть несколько замечательных статей, которые могут послужить предисловием к этой статье, например учебник по основам Go от создатели gRPC здесь.

В этой статье мы расскажем, что такое перехватчики gRPC, а также рассмотрим пример с открытым исходным кодом, в который вы можете внести свои собственные изменения, и посмотрим, как различные компоненты объединяются для формирования более сложных систем.

Что такое перехватчики gRPC?

Перехватчики — это аккуратные небольшие компоненты приложения gRPC, которые позволяют нам взаимодействовать с прото-сообщением или контекстом либо до, либо после того, как оно будет отправлено или получено клиентом или сервером. Например, мы можем захотеть изменить каждый запрос перед его отправкой, возможно, добавив некоторую информацию или метаданные о среде, в которой работает клиент, — и мы можем это сделать! На стороне сервера — мы также можем перехватить это сообщение до того, как будет выполнен фактический вызов функции — возможно, запустив некоторую проверку или проверку перед запуском нашей основной бизнес-логики.

Есть безграничное количество причин, по которым это полезно, как вы, вероятно, уже поняли, но перечислим несколько распространенных вариантов использования:

  • Трассировка (т. е. просмотр потока данных через приложение от запроса до ответа, время, затраченное на обработку на сервере, и многое другое (читайте наш блог по отслеживанию здесь!)
  • Авторизация (убедитесь, что аутентифицированному пользователю действительно разрешено выполнять действие)
  • Добавление метаданных в запрос, таких как конфигурация среды клиента.

Типы перехватчиков

Чтобы не путаться — есть четыре разных типа перехватчиков — 2 унарных перехватчика и 2 потоковых перехватчика. Для клиента и для сервера!

Унарный перехватчик клиента

Он выполняется на клиенте до того, как будет сделан запрос к функции на стороне сервера. Здесь мы можем дополнить сообщение метаданными на стороне клиента, такими как информация об оборудовании или ОС, на которой работает клиент, или, возможно, запустить поток трассировки.

Унарный перехватчик сервера

Он выполняется на стороне сервера, когда от клиента поступает запрос. Именно в этот момент мы можем выполнить некоторые проверки подлинности запроса, такие как авторизация или проверка наличия определенных полей / проверить запрос.

Перехватчик потока клиента

Они служат той же цели, что и унарный перехватчик, только когда мы передаем данные от клиента на сервер. Например, если бы мы передавали на сервер список из 100 объектов, таких как фрагменты файла или видео, мы могли бы перехватывать каждый фрагмент перед отправкой и проверять правильность таких вещей, как контрольная сумма, добавление метаданных в кадр и тому подобное.

Перехватчик потока сервера

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

Пример из реальной жизни — edge locations

Здесь, в Ori, мы специализируемся на создании будущего облачных вычислений, и прямо сейчас — это edge. Допустим, гипотетически, что мы запускаем серию микросервисов в нашем облаке. Все эти сервисы позволяют клиенту, будь то местный супермаркет, склад или пользователь, у которого есть свободные вычислительные ресурсы в подвале, зарегистрироваться в Ori, используя соответствующий клиент на его оборудовании. После регистрации мы берем часть их информации и оцениваем, можем ли мы внедрить нашу инфраструктуру в их вычислительные ресурсы и разрешить всем конечным пользователям выполнять свои контейнерные рабочие нагрузки на этих узлах.

Пользователи, желающие зарегистрироваться, должны установить клиент, который позволяет пользователю зарегистрировать свое оборудование. Однако мы также хотим получить некоторые метаданные об оборудовании, которые неспециалисты могут не знать, такие как операционная система, на которой работает клиент, и IP-адрес, с которого клиент подключается.

Вот тут-то и появляются наши перехватчики! В этом случае мы собираемся захватить операционную систему клиента и получить IP-адрес на стороне сервера.

Готовы? Давайте приступим!

Предусловия

  • Go >=1.15
  • protoc

Установка

Вы можете загрузить исходный код как для клиента, так и для сервера в том виде, в каком они существуют, из этого репозитория: https://github.com/ori-edge/grpc-interceptor-demo.

Откройте терминал и просто запустите make protoc && make build, чтобы убедиться, что сгенерированные файлы обновлены, и увидеть двоичные файлы клиента и сервера, расположенные в вашем каталоге bin в репозитории.

Теперь откройте 2 терминала. Один терминал будет использоваться для запуска вашего сервера, а другой будет там, где вы возитесь со своим клиентом. Чтобы запустить сервер, перейдите к своему терминалу и перейдите в каталог репо. Запустите сервер с помощью ./bin/edge-server. Вы должны увидеть следующее в своем терминале, указывающее, что ваш сервер работает правильно:

2021/05/28 16:17:20 starting server...

В настоящее время сервер предоставляет конечному пользователю две функции:

  • Register. Это позволяет клиенту зарегистрироваться на платформе Ori, указав, что он хочет предоставлять периферийные вычисления конечным пользователям.
  • List. Перечислите количество зарегистрированных клиентов, которые являются частью сети Ori. Укажите через запятую список идентификаторов, которые вы хотите получить, с флагом --list.

Продолжение следует...

Статья в процессе перевода, если материал вам интересен, поставьте палец.

Источник: https://edgehog.blog/a-guide-to-grpc-and-interceptors-265c306d3773