Protobuf: структурированный код с протокольными буферами

Структурирование данных играет важную роль в разработке программ и веб-сайтов. Если, например, данные проекта хорошо структурированы, они могут быть легко и точно прочитаны другим программным обеспечением. В Интернете это особенно важно для текстовых поисковых систем, таких как Google, Bing или Yahoo, которые могут воспринимать содержание веб-сайта благодаря соответствующим структурированным различиям.

Использование структурированных данных при разработке программного обеспечения в целом целесообразно — как для Интернета, так и для настольных приложений — везде, где программы или сервисы должны обмениваться данными через интерфейсы и желательна высокая скорость обработки данных. В этой статье вы узнаете, какую роль может играть формат сериализации Protocol Buffers (Protobuf) и чем этот метод структурирования отличается от известной альтернативы JSONP.

Что такое Protobuf (Protocol Buffers)?

Protocol Buffers, или сокращенно Protobuf, формат обмена данными, изначально разработанный для внутреннего использования, с 2008 года предлагается Google широкой публике как проект с открытым исходным кодом (частично лицензия Apache 2.0). Бинарный формат позволяет приложениям хранить, а также обмениваться структурированными данными простым способом, причем эти программы могут быть написаны даже на разных языках программирования. Поддерживаются следующие языки, включая другие:

  • C#
  • C++
  • Go
  • Objective-C
  • Java
  • Python
  • Ruby

Protobuf используется в сочетании с HTTP и RPC (Remote Procedure Calls) для локального и удаленного взаимодействия клиент-сервер — для описания необходимых здесь интерфейсов. Композиция протоколов также называется gRPC.

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

В чем преимущества протокольных буферов Google?

При разработке Protobuf компания Google сделала акцент на двух факторах: Простота и производительность. На момент разработки формат — как уже упоминалось, первоначально использовавшийся внутри Google — должен был заменить аналогичный формат XML. Сегодня он также конкурирует с другими решениями, такими как JSON(P) или FlatBuffers. Поскольку Protocol Buffers все еще остается лучшим выбором для многих проектов, анализ позволяет понять характеристики и сильные стороны этого метода структурирования:

Понятные, кросс-прикладные схемы

Основой каждого успешного приложения является хорошо организованная система баз данных. Большое внимание уделяется организации этой системы — включая содержащиеся в ней данные — но лежащие в ее основе структуры теряются в самый последний момент, когда данные передаются стороннему сервису. Уникальное кодирование данных в схеме Protocol Buffers гарантирует, что ваш проект пересылает структурированные данные в желаемом виде, без разрушения этих структур.

Обратная и прямая совместимость

Реализация Protobuf избавляет от надоедливого выполнения проверки версий, которая обычно ассоциируется с «уродливым» кодом. Для поддержания обратной совместимости со старыми версиями или прямой совместимости с новыми версиями Protocol Buffers использует пронумерованные поля, которые служат точками отсчета для доступа к сервисам. Это означает, что вам не всегда придется адаптировать весь код для публикации новых возможностей и функций.

Гибкость и удобство

При кодировании с помощью Protobuf автоматически используются модификаторы (необязательные: требуемые, дополнительные или повторяющиеся), которые значительно упрощают работу программиста. Таким образом, метод структурирования позволяет определить структуру данных на уровне схемы, после чего детали реализации классов, используемых для различных языков программирования, регулируются автоматически. Кроме того, в любой момент можно изменить статус, например, с «обязательного» на «необязательный». Передача структур данных также может регулироваться с помощью буферов протокола: Благодаря кодированию общих структур запросов и ответов, обеспечивается гибкая и безопасная передача данных между несколькими сервисами простым способом.

Меньше шаблонного кода

Бойлерный код (или просто бойлерный код) играет решающую роль в программировании, в зависимости от типа и сложности проекта. Проще говоря, это многократно используемые блоки кода, которые нужны во многих местах программного обеспечения и обычно лишь слегка настраиваются. Такой код часто используется, например, для подготовки использования функций из библиотек. Boilerplates распространены, в частности, в веб-языках JavaScript, PHP, HTML и CSS, хотя это не является оптимальным для производительности веб-приложения. Подходящая схема Protocol Buffers помогает сократить количество «кодовых шаблонов» и тем самым повысить производительность в долгосрочной перспективе.

Простая совместимость языков

Это часть сегодняшнего стандарта, что приложения больше не просто пишутся на одном языке, а что части программы или модули сочетают в себе различные типы языков. Protobuf значительно упрощает взаимодействие между отдельными компонентами кода. Если добавляются новые компоненты, язык которых отличается от текущего языка проекта, вы можете просто перевести схему Protocol Buffers на соответствующий целевой язык с помощью соответствующего генератора кода, при этом ваши собственные усилия сводятся к минимуму. Разумеется, необходимым условием является то, что используемые языки поддерживаются Protobuf по умолчанию, например, уже перечисленные языки или с помощью сторонних дополнений.

Protobuf против JSON: сравнение двух форматов

Прежде всего, Google разработал Protocol Buffers как альтернативу XML (Extensible Markup Language) и во многом превзошел этот язык разметки. Поэтому структурирование данных с помощью Protobuf не только проще, но и, по словам гиганта поисковых систем, обеспечивает структуру данных, которая от трех до десяти раз меньше и в 20-100 раз быстрее, чем сопоставимая структура XML.

Кроме того, с языком разметки JavaScript JSON (JavaScript Object Notation) Protocol Buffers часто проводят прямое сравнение, при этом следует отметить, что обе технологии были разработаны с разными целями: JSON — это формат сообщений, возникший на основе JavaScript, который обменивается сообщениями в текстовом формате и поддерживается практически всеми распространенными языками программирования. Функциональность Protobuf включает в себя более одного формата сообщений, поскольку технология Google также предлагает различные правила и инструменты для определения и обмена сообщениями. Protobuf также в целом превосходит JSON, если рассматривать отправку сообщений в целом, но следующий табличный список «Protobuf vs. JSON» показывает, что оба метода структурирования имеют свои преимущества и недостатки:

  Protobuf JSON
Разработчик Google Дуглас Крокфорд
Функция Формат разметки для структурированных данных (хранение и передача) и библиотека Формат разметки для структурированных данных (хранение и передача)
Бинарный формат Да Нет
Стандартизация Нет Да
Человекочитаемый формат Частично Да
Сообщество/документация Небольшое сообщество, расширяемые онлайн-руководства Огромное сообщество, хорошая официальная документация, а также различные онлайн-учебники и т.д.

Итак, если вам нужен хорошо документированный формат сериализации, который хранит и передает структурированные данные в человекочитаемой форме, вам следует использовать JSON вместо Protocol Buffers. Это особенно актуально, если серверная часть приложения написана на JavaScript и если большая часть данных по умолчанию обрабатывается непосредственно браузерами. С другой стороны, если гибкость и производительность структуры данных играют решающую роль, Protocol Buffers, как правило, является более эффективным и лучшим решением.

Учебное пособие: Практическое введение в Protobuf на примере Java

Protocol Buffers могут сыграть решающую роль во многих программных проектах, но, как это часто бывает, сначала нужно ознакомиться с особенностями и синтаксическими хитростями технологии сериализации и понять, как их применять. Чтобы дать вам первое представление о синтаксисе Protobuf и обмене сообщениями, в следующем учебном пособии объясняются основные шаги работы с Protobuf — от определения собственного формата в файле .proto до компиляции структур буферов протокола. В качестве основы кода будет использован простой пример приложения адресной книги на Java, которое может считывать контактную информацию из файла и записывать в файл. Каждой записи адресной книги присваиваются параметры «Имя», «ID», «Адрес электронной почты» и «Номер телефона».

Определите свой собственный формат данных в файле .proto

Сначала вы описываете любую структуру данных, которую хотите реализовать с помощью Protocol Buffers, в файле .proto, стандартном файле конфигурации формата сериализации. Для каждой структуры, которую вы хотите сериализовать в этом файле — то есть последовательно отобразить — просто добавьте сообщение. Затем вы указываете имена и типы для каждого поля этого сообщения и добавляете нужный модификатор(ы). Для каждого поля требуется один модификатор.

Одно из возможных отображений структур данных в файле .proto выглядит следующим образом для адресной книги Java:

syntax = "proto3";

package tutorial;

option java_package = "com.example.tutorial";
option java_outer_classname = "AddressBookProtos";

message Person {
  required string name = 1;
  required int32 id = 2;
  optional string email = 3;

  enum PhoneType {
    MOBILE = 0;
    HOME = 1;
    WORK = 2;
  }

  message PhoneNumber {
    required string number = 1;
    optional PhoneType type = 2 [default = HOME];
  }

  repeated PhoneNumber phones = 4;
}

message AddressBook {
  repeated Person people = 1;
}

Синтаксис Protocol Buffers, таким образом, сильно напоминает C++ или Java. Версия Protobuf всегда объявляется первой (здесь proto3), затем следует описание программного пакета, данные которого вы хотите структурировать. Это включает уникальное имя («tutorial») и, в данном примере кода, две специфические для Java опции «java_package» (Java-пакет, в котором сохраняются сгенерированные классы) и «java_outer_classname» (определяет имя класса, под которым суммируются классы).

Затем следуют сообщения Protobuf, которые могут состоять из любого количества полей, при этом доступны такие типичные типы данных, как «bool», «int32», «float», «double» или «string». Некоторые из них также используются в примере. Как уже упоминалось, каждому полю сообщения должен быть присвоен хотя бы один модификатор — т.е. либо…

  • required: значение для поля является обязательным. Если это значение отсутствует, сообщение остается «uninitialized», т.е. не инициализированным или неотправленным.
  • optional: значение может быть указано в необязательном поле, но не обязательно. Если это не так, используется значение, определенное стандартом. В приведенном выше коде, например, для типа телефонного номера вводится значение по умолчанию «HOME» (стационарный домашний номер).
  • повторяется: поля с модификатором «повторяется» могут повторяться любое количество раз (включая нулевое).

Подробные инструкции по определению собственного формата данных с помощью Protocol Buffers можно найти на Форуме разработчиков Google.

Составление собственной схемы Protocol Buffers

Если ваши собственные структуры данных определены в файле .proto как нужно, сгенерируйте классы, необходимые для чтения и записи сообщений Protobuf. Для этого используйте компилятор Protocol Buffers Compiler (protoc) в конфигурационном файле. Если вы еще не установили его, просто скачайте текущую версию с официального GitHub-репозитория. Распакуйте ZIP-файл в нужное место, а затем запустите компилятор двойным щелчком мыши (находится в папке «bin»).

Примечание

Убедитесь, что у вас установлена соответствующая редакция компилятора Protobuf: Protoc для 32- или 64-битной архитектуры (Windows, Linux или macOS), по желанию.

Наконец, укажите:

  • исходную директорию, в которой находится код вашей программы (здесь заполнитель «SRC_DIR»),
  • каталог назначения, в котором будет храниться сгенерированный код (здесь «DST_DIR»)
  • и путь к файлу .proto.

Поскольку вы хотите генерировать классы Java, вы также используете опцию —java_out (аналогичные опции доступны и для других поддерживаемых языков). Полная команда компиляции выглядит следующим образом:

protoc -I=$SRC_DIR --java_out=$DST_DIR $SRC_DIR/addressbook.proto
Совет

Более подробное руководство по Protobuf Java, в котором, среди прочего, объясняется передача сообщений через буферы протокола (чтение/запись), предлагается Google в разделе «Разработчики», внутреннем разделе проекта поискового гиганта для разработчиков. Кроме того, там же можно найти инструкции для других поддерживаемых языков, таких как C++, Go или Python.

Оцените статью
cdelat.ru
Добавить комментарий