ОТДЫХ Уйди!

Аудитория

Эта статья предназначена для разработчиков, которые имеют разумное представление о требованиях к взаимодействию клиент-сервер. Это поможет получить представление о Java, но это не обязательно.

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

Аргумент

Что такое РПЦ?

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

Для пояснения предположим, что у нас есть программа A на языке A на сервере A. Программа A может вызывать функции программы B на языке B на сервере B, как если бы они были функциями программы A на языке A на сервере A. Легко!

Одна из вещей, которая делает это более сложным, заключается в том, что языки A и B могут быть разными. Здесь мы вводим язык определения интерфейса (IDL).Мы пишем наши взаимодействия клиент/сервер (все функции, которые мы можем вызывать по сети, а также данные, которые они передают ) в нашем IDL. Это может их компилировать в отдельные языки.

Мы продемонстрируем это в следующем разделе, посвященном IDL gRPC: протокольные буферы.

Откуда же наш клиент (программа А) знает, что может делать наш сервер (программа Б)? Это роль заглушек. Наш сервер выдает клиенту заглушку, которую клиент может использовать как локальную функцию, но тайно вызывает сервер.

Изобразим все это на схеме.

Добавьте gRPC!

Теперь, когда у нас есть основы RPC, давайте добавим gRPC, реализацию Google. Каркас gRPC работает точно так, как описано выше, и использует Protocol Buffers в качестве своего IDL.

Он позволяет определить четыре вида метода обслуживания:

  1. Унарные RPC: клиент отправляет один запрос и получает один ответ.
  2. Серверная потоковая передача RPC: клиент отправляет один запрос и получает в ответ поток ответов.
  3. Клиентская потоковая передача RPC: клиент отправляет поток запросов и получает в ответ один ответ.
  4. Двунаправленные потоковые RPC: клиент отправляет поток запросов и получает обратно поток ответов.

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

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

Первое, что мы сделаем, это определим наш сервис в нашем IDL.

Достаточно просто! Теперь мы подошли к немного более сложной части. Мы хотели бы скомпилировать это во что-то, что можно использовать в нашей программе Java. Для этого мы используем protoc-jar-maven-plugin. С помощью команды mvn generate-sources мы можем скомпилировать вышеуказанный файл .proto во что-то, что мы можем использовать в приложении.

Вышеизложенное даст нам несколько выходных данных, включая классы Prefix, Name и NameUtilitiesGrpc (которые мы будем использовать позже).

Следующее, что мы сделаем, это определим в коде наш фактический сервер gRPC.

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

Здесь мы расширяем один из классов, сгенерированных файлами proto. Именно эта связь позволяет нам зарегистрировать NameUtilitiesServer на сервере и выполнить требуемую работу.

Я не буду показывать, как работает функция получения имени по префиксу. Если вам интересно, код находится в репозитории — просто знайте, что это фиктивный сервис для поиска имен, начинающихся с заданной строки.

Пока наш сервер работает с нашей зарегистрированной службой. Теперь нам нужно позвонить! Мы определяем приведенный ниже клиентский класс.

Запуск основного метода в нашей клиентской службе вызывает наш сервер с помощью заглушки!

Надеюсь, все это дает приблизительное представление о ценности gRPC и о том, как это сочетается друг с другом!

Заключение

В заключение мы ввели понятие RPC, продемонстрировали его ценность и показали пример на Java с использованием gRPC.