protobuf против gRPC

Я пытаюсь понять protobuf и gRPC и как я могу использовать оба. Не могли бы вы помочь мне понять следующее:

  • учитывая модель OSI, что было, например, Протобуф на уровне 4?
  • мышление через передачу сообщений как "поток" что gRPC делает, что protobuf пропускает?
  • если отправитель использует protobuf, может ли сервер использовать gRPC или gRPC добавляет что-то, что может доставить только клиент gRPC?
  • Если gRPC может сделать синхрон и асинхронная связь возможны, Протобуф предназначен только для маршалинга и поэтому не имеет ничего общего с состоянием - истинным или ложным?
  • могу ли я использовать gRPC в интерфейсном приложении вместо REST или GraphQL?

Я уже знаю - или предполагаю, что знаю-это:

Protobuf

  • двоичный протокол для обмена данными
  • разработанный Google
  • использует созданные "Struct" как описание на клиенте и сервере к сообщению un-/-marshall

gRPC

  • использует protobuf (v3)
  • снова из Google
  • рамки для вызовов RPC
  • использует HTTP / 2, а также
  • синхронизация и асинхронная связь возможна

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

2 ответов


протокол буферы является (являются?) язык определения интерфейса и библиотека сериализации:

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

gRPC использует тот же IDL, но добавляет синтаксис "rpc", который позволяет определить метод удаленного вызова процедур подписи, использующие структуры данных Protobuf в качестве типов данных:

  • вы определяете свои структуры данных
  • вы добавляете определения методов rpc
  • он предоставляет код для обслуживания и вызова сигнатур метода по сети
  • вы все еще можете сериализовать объекты данных вручную с помощью Protobuf, если вам нужно

в ответ на вопросы:

  1. gRPC работает на слоях 5, 6 и 7. Protobuf работает на уровне 6.
  2. когда вы говорите "передача сообщения", Протобуф не имеет отношения к самой передаче. Он работает только на любом конце любой передачи данных, превращая байты в объекты
  3. использование gRPC по определению означает вы используете Protobuf. Вы можете написать свой собственный клиент, который использует Protobuf, но не gRPC для взаимодействия с gRPC - но использование gRPC было бы проще
  4. правда
  5. Да, вы можете

на самом деле, gRPC и Protobuf-это 2 совершенно разные вещи. Позвольте мне упростить:

  • gRPC управляет тем, как клиент и сервер могут взаимодействовать (так же, как веб-клиент/сервер с REST API)
  • protobuf - это просто инструмент сериализации / десериализации (как и JSON)

gRPC имеет 2 стороны: серверную сторону и клиентскую сторону, которая может набрать сервер. Сервер предоставляет RPCs (т. е. функции, которые вы можете вызвать удаленно). А у вас там много вариантов: вы можете защитить связь (используя TLS), добавить уровень аутентификации (используя перехватчики), ...

вы можете использовать protobuf внутри любой программы, которая не должна быть клиентом / сервером. Если вам нужно обмениваться данными и вы хотите, чтобы они были строго типизированы, protobuf-хороший вариант (быстрый и надежный).

Это, как говорится, вы можете объединить оба, чтобы построить хороший клиент / сервер sytem: gRPC будет вашим кодом клиента / сервера, и protobuf ваши данные протокол.

PS: я написал это статьи чтобы показать, как можно построить клиент/сервер с gRPC и protobuf с помощью Go, шаг за шагом.