protobuf против gRPC
Я пытаюсь понять protobuf и gRPC и как я могу использовать оба. Не могли бы вы помочь мне понять следующее:
- учитывая модель OSI, что было, например, Протобуф на уровне 4?
- мышление через передачу сообщений как "поток" что gRPC делает, что protobuf пропускает?
- если отправитель использует protobuf, может ли сервер использовать gRPC или gRPC добавляет что-то, что может доставить только клиент gRPC?
- Если gRPC может сделать синхрон и асинхронная связь возможны, Протобуф предназначен только для маршалинга и поэтому не имеет ничего общего с состоянием - истинным или ложным?
- могу ли я использовать gRPC в интерфейсном приложении вместо REST или GraphQL?
Я уже знаю - или предполагаю, что знаю-это:
- двоичный протокол для обмена данными
- разработанный Google
- использует созданные "Struct" как описание на клиенте и сервере к сообщению un-/-marshall
- использует protobuf (v3)
- снова из Google
- рамки для вызовов RPC
- использует HTTP / 2, а также
- синхронизация и асинхронная связь возможна
Я снова предполагаю, что это простой вопрос для кого-то, кто уже использует технологию. Я все равно буду благодарен, если вы будете терпеливы со мной. и помоги мне. Я также был бы очень благодарен за любое сетевое глубокое погружение технологий.
2 ответов
протокол буферы является (являются?) язык определения интерфейса и библиотека сериализации:
- вы определяете свои структуры данных в своем IDL, т. е. описываете объекты данных, которые вы хотите использовать
- Он предоставляет процедуры для перевода ваших объектов данных в двоичный файл и из него, например, для записи/чтения данных с диска
gRPC использует тот же IDL, но добавляет синтаксис "rpc", который позволяет определить метод удаленного вызова процедур подписи, использующие структуры данных Protobuf в качестве типов данных:
- вы определяете свои структуры данных
- вы добавляете определения методов rpc
- он предоставляет код для обслуживания и вызова сигнатур метода по сети
- вы все еще можете сериализовать объекты данных вручную с помощью Protobuf, если вам нужно
в ответ на вопросы:
- gRPC работает на слоях 5, 6 и 7. Protobuf работает на уровне 6.
- когда вы говорите "передача сообщения", Протобуф не имеет отношения к самой передаче. Он работает только на любом конце любой передачи данных, превращая байты в объекты
- использование gRPC по определению означает вы используете Protobuf. Вы можете написать свой собственный клиент, который использует Protobuf, но не gRPC для взаимодействия с gRPC - но использование gRPC было бы проще
- правда
- Да, вы можете
на самом деле, gRPC и Protobuf-это 2 совершенно разные вещи. Позвольте мне упростить:
- gRPC управляет тем, как клиент и сервер могут взаимодействовать (так же, как веб-клиент/сервер с REST API)
- protobuf - это просто инструмент сериализации / десериализации (как и JSON)
gRPC имеет 2 стороны: серверную сторону и клиентскую сторону, которая может набрать сервер. Сервер предоставляет RPCs (т. е. функции, которые вы можете вызвать удаленно). А у вас там много вариантов: вы можете защитить связь (используя TLS), добавить уровень аутентификации (используя перехватчики), ...
вы можете использовать protobuf внутри любой программы, которая не должна быть клиентом / сервером. Если вам нужно обмениваться данными и вы хотите, чтобы они были строго типизированы, protobuf-хороший вариант (быстрый и надежный).
Это, как говорится, вы можете объединить оба, чтобы построить хороший клиент / сервер sytem: gRPC будет вашим кодом клиента / сервера, и protobuf ваши данные протокол.
PS: я написал это статьи чтобы показать, как можно построить клиент/сервер с gRPC и protobuf с помощью Go, шаг за шагом.