Proto файлы что это
Конечный метод оптимизации производительности сети - не передача по сети, но это часто невозможно. Но мы по-прежнему можем добиться лучшей производительности, оптимизируя данные, передаваемые по сети, и производительность следует выжимать из всех возможных мест. Посмотрите здесьProtocol Buffers 。
Protocol Buffers Это гибкий, эффективный и автоматизированный механизм для сериализации структурированных данных, аналогичный XML, номеньше,Быстрее,проще, Определите способ структурированных данных один раз, а затем вы можете просто написать его, используя специально сгенерированный код, или прочитать структурированные данные из большого количества потоков данных на разных языках. Вы даже можете обновить структуру данных, не разрушая развернутыестарый Формат скомпилированной программы. Давайте посмотрим, какProtocol Buffers Используется в нашем проекте Android.
Давайте взглянемProtocol Buffers То, что проект предоставил нам, мы используемProtocol Buffers Общий процесс того, что должно быть сделано. Как показано ниже:
Вручную каждый разProtocol Buffers Компилятор, очевидно, слишком проблематичен для преобразования файлов .proto в файлы Java.Protocol Buffers Разработчики проекта, очевидно, подумали об этом, поэтому они также предоставили нам плагин Gradle для Android Studioprotobuf-gradle-plugin Для автоматического выполнения при компиляции нашего проектаProtocol Buffers Translater.
Мы можемprotobuf-gradle-plugin МестныйProtocol Buffers Путь к компилятору заставляет его использовать локальную компиляцию для выполнения компиляции, или вы можете использоватьProtocol Buffers Другой инструмент, предоставляемый проектом, динамически загружает и выполняет процесс компиляции во время компиляции.
Мы рассмотрим этот процесс подробно позже.
Мы можем быть в следующих местах:
Скачав пакетный protobuf, вы также можете напрямую клонировать код protobuf и скомпилировать компилятор вручную. Здесь мы клонируем код из GitHub и вручную скомпилируем компилятор:
После загрузки кода войдите в каталог protobuf и выполнитеautogen.sh :
Этот скрипт в основном используется для загрузки gmock-1.7.0 для тестирования и генерацииconfigure Жду документов. Вы можете использовать следующие команды, чтобы понять, какую конфигурацию мы можем сделать для компиляции protobuf и информацию о конфигурации по умолчанию:
Выполните configure для настройки компиляции:
Это сгенерирует make-файл, скомпилирует и установит:
Этот процесс компилируется и устанавливаетсяProtocol Buffers В дополнение к компилятору, он также будет скомпилирован для хоста для поддержки использования в C ++Protocol Buffers Библиотека. (Скомпилированный бинарный файл добавляется вprotobuf/src/.libs под. )
После установки выполните следующую команду, чтобы убедиться, что она установлена:
Добавляя к нему при выполнении protoc--help Параметры могут узнать больше использования этого инструмента.
Можно сослаться наИспользуйте буфер протокола в Java Узнайте больше об основах создания .proto файлов в этой статье.
Вы можете скомпилировать файл .proto с помощью следующей команды:
-I, --java_out используются для указания исходного каталога (куда помещается исходный код приложения - если не указан, используется текущий каталог), целевого каталога (где вы хотите разместить сгенерированный код; обычно такой же, как $ SRC_DIR) и, наконец, Параметр является путем к файлу .proto. ProtoC будет генерировать классы Java и структуру каталогов в соответствии со стандартным стилем Java. Для приведенного выше примера, он будет генерироватьcom/example/tutorial/ Структура каталогов иAddressBookProtos.java файл.
Мы скопируем файлы Java, сгенерированные файлом .proto, в наш проект Android:
Добавьте пару в build.gradle нашего приложенияprotobuf-java Зависимости, как полагаться на другие библиотеки Java:
Добавьте класс для доступа к классу Protocol Buffers. Здесь мы добавляем два класса, AddPerson используется для создания объекта Person:
Класс AddressBookProtobuf используется для кодирования / декодирования объектов AddressBook:
Выполнение protoc для компиляции файла .proto всегда слишком проблематично. Protobuf-gradle-plugin может автоматически компилировать файл .proto при компиляции нашего приложения, что значительно сокращает наше использование в проектах Android.Protocol Buffers Сложность.
Сначала нам нужно добавить файл .proto в наш проект, например:
Затем изменитьapp/build.gradle Сконфигурируйте подключаемый модуль protobuf gradle:
- Добавить пару для buildscript protobuf-gradle-plugin Зависимость:
- в apply plugin: 'com.android.application' Позже используйте плагин protobuf:
- Добавьте блок protobuf и настройте выполнение protobuf-gradle-plugin:
protoc Блок используется для настройки компилятора Protocol Buffers, здесь мы указываем компилятор, который мы скомпилировали ранее.
task.builtins Этот блок необходим. Этот блок используется для указания того, для какого языка программирования мы хотим сгенерировать код. Здесь мы генерируем код для C ++ и Java. Если этот блок отсутствует, во время компиляции будет сообщено о следующей ошибке:
В подсказке говорится, что путь к выходному каталогу не указан.
Это связано с тем, что параметры команды компилятора protobuf, выполняемой protobuf-gradle-plugin, находятся в protobuf-gradle-plugin/src/main/groovy/com/google/protobuf/gradle/GenerateProtoTask.groovy Построен в:
Как видите, выходной каталог создается встроенными.
Таким образом, нам не нужно каждый раз запускать protoc вручную.
Сделайте небольшую модификацию предыдущего блока protobuf, нам даже не нужно компилировать компилятор protobuf. Изменить следующим образом:
Для получения дополнительной информации о методе записи .proto файла, API буферов протокола и других, пожалуйста, обратитесь кРуководство разработчика Protobuf、Используйте буфер протокола в JavaИ другие сопутствующие официальные документы.
После долгого разговора, как работает Protobuf? Здесь мы сравниваем производительность нашего наиболее часто используемого формата JSON и Protobuf. Тест основан на fastjson, который пользуется хорошей репутацией среди разработчиков.
Структура данных, используемая для теста, - это адресная книга, которую мы видели ранее. Мы тестируем производительность Protobuf и JSON, создавая данные AddressBook, содержащие разное количество людей, и выполняя множество операций кодирования и декодирования этих данных. Тестовый код для кодирования / декодирования Protobuf - это AddressBookProtobuf, замеченный ранее. Тестовый код JSON выглядит следующим образом:
Выполните тестирование с помощью следующего фрагмента кода:
Здесь мы выполняем 3 набора тестов кодирования и 3 набора тестов декодирования. Для теста кодирования первая группа одиночных данных содержит 10 человек, вторая группа содержит 50 человек, а третья группа содержит 100 человек. Затем каждая информация кодируется 5000 раз.
Для теста декодирования отдельные данные в трех группах также содержат 10 человек, 50 и 100, и затем операция кода декодирования выполняется 5000 раз для каждого из данных.
Выполните вышеуказанный тест на платформе Android 4.4.4 CM от Galaxy Nexus и, наконец, получите следующие результаты:
Сравнение длины данных после кодирования (в байтах)
Количество персон | Protobuf | Protobuf(GZIP) | JSON | JSON(GZIP) |
---|---|---|---|---|
10 | 860 | 291 | 1703 | 344 |
50 | 4300 | 984 | 8463 | 1047 |
100 | 8600 | 1840 | 16913 | 1913 |
Для тех же данных длина данных, закодированных в Protobuf, составляет примерно половину длины данных, закодированных в JSON. Но если закодированные данные снова сжимаются, разница между ними относительно невелика.
Сравнение производительности кодирования (S)
Количество персон | Protobuf | JSON |
---|---|---|
10 | 4.687 | 6.558 |
50 | 23.728 | 41.315 |
100 | 45.604 | 81.667 |
Производительность кодирования улучшена как минимум на 28,5% и максимум на 44,2%. По сравнению с JSON производительность кодирования Protobuf была значительно улучшена.
Сравнение производительности декодирования (S)
Количество персон | Protobuf | JSON |
---|---|---|
10 | 0.226 | 8.839 |
50 | 0.291 | 43.869 |
100 | 0.220 | 85.444 |
С точки зрения производительности декодирования, Protobuf имеет потрясающее улучшение по сравнению с JSON. Время декодирования Protobuf едва ли увеличивается с увеличением длины данных, в то время как с увеличением длины данных время, необходимое для декодирования, становится все длиннее и длиннее.
Один из набирающих популярность протоколов общения между двумя гетерогенными системами - Protocol Buffers. Сегодня мы разберемся с тем, что это такое, для чего нужно и как применять.
Protocol Buffers - это бинартый протокол сериализации (передачи) структурированных данных. Google предложили его как эффективную альтернативу xml и правильно сделали. В моём окружении все не легаси проекты уже давно используют json и счастливы, а здесь следующий шаг, если быть точнее, другой взгляд на передаваемые данные. Данные хранятся в виде набора байт, но как работать с бинарнарным протоколом сериализации, где взять сериализаторы и десериализаторы, как они поймут, что именно нужно сделать?
Пожалуй, о недостатках лучше всего скажет тот, кто с ними столкнулся и здесь я посоветую вам прочитать вот эту статью на хабре, дабы развеять ненужные иллюзии безоблачного неба.
Будьте внимательны с использованием обязательных полей. Нужно понимать, что если у клиента версия .proto файла, где поле Х обязательно, а сервер решит удалить его из следующей версии API, то такое изменение будет обратно-несовместимым. Таким образом, обязательные поля могут принести больше вреда чем пользы. Рекомендуется, следуя паттерну TolerantReader, быть готовым к изменениям модели для максимально долгого сохранения обратной совместимости.
Хорошая новость. Как минимум для Intellij IDEA есть плагин для .proto файлов. В тот момент, когда вы создадите и откроете такой файл, вы увидите хинт сверху, который предложит вам установить плагин. Здесь вы увидите пример .proto файла для второй версии протобафа, хотя сейчас уже появилась третья. Возможно, о ней я буду писать позже, а любопытный читатель уже сейчас может посмотреть Language Guide (proto3).
Шаг 1. Определяем формат протокола
На первом шаге нам нужно описать .proto файл. Разберем сокращенную версию предметной области учебного заведения. Исходный .proto файл выглядит следующим образом:
Разберемся с синтаксисом файла. Прежде всего мы указываем какую версию protobuf мы используем, в нашем случае это вторая версия. Затем указываем package, который необходим здесь для разделения пространств имён. Т.к. мы знаем, что будем пользоваться java, то указываем две дополнительные настройки: java_package и java_outer_classname . Первая, очевидно, говорит в какой пакет и соответственно иерархию директорий необходимо сложить результат компиляции, а java_outer_classname определяет имя файла, который будет в себя заворачивать весь сгенерированный контент. Если это не будет сделано, то компилятор определит имя в соответствии с CamelCase по названию .proto файла. Эти настройки, как вы понимаете, java-специфичны.
Вы можете вкладывать messages друг в друга, использовать перечисления enum, в общем очень похоже на Java. Кроме того, есть возможность определить значения по умолчанию.
*Шаг 2. Компилируем файл
* опциональный, для понимания
Созданный .proto файл нужно скомпилировать и прежде всего нам нужен компилятор. Скачиваем protoc архив. В архиве к нам прилетает компилятор и некоторый набор типов, которые мы можем использовать из коробки. Когда вы нашли место для файла в вашей файловой системе добавьте его в PATH. В Windows это делается в Параметрах окружения, а в linux будет достаточно выполнить export PATH=$PATH:your_path . Теперь нам доступен компилятор из терминала, давайте скомпилируем.
Перейдем в папку с .proto файлом и выполним команду:
Флаг --java_out указывает на папку куда будет сгенерирован java код. В этой папке мы получили иерархию, которая определяет java package, который мы указали в .proto файле. Результат компиляции - .java файл, который пока не компилируется javac’ом, для этого нам необходима дополнительная библиотека для работы с protobuf из java. В целях избежения ненужных проблем, перенесем наши эксперименты в плоскость обычного проекта.
Шаг 3. Собираем проект
Прежде всего хочу сказать, что не смотря на то, что все примеры на java, работа на других платформах с protobuf аналогична.
Поигрались с терминалом и хватит, перейдем к практическому применению. Создадим gradle проект, цель которого будет перегнать через массив байт группу со студентами. Для автоматизации рутинной деятельности нам поможет инструмент автоматизации сборки gradle. Для вашего случая инструмент может отличаться, но идея должна быть понятна. Для того, чтобы добавить поддержку protocol buffers в цикле сборки нашего проекта, дополним типичный build.gradle файл следующими настройками:
Комментарии к коду исчерпывающие, а в конце статьи я оставлю ссылку на репозиторий, в котором вы найдете запускаемый код.
В папку проекта src/main/proto помещаем наш .proto файл из первого шага. Теперь при сборке проекта или при выполнении gradle команды generateProto мы получим сгенерированный код по .proto файлу внутри нашего проекта.
Шаг 4. Взаимодействуем со сгенерированным кодом
Компилятор создает весь код внутри файла AcademyProtos.java , это название мы указали в .proto файле. Весь сгенерированный код доступен в одноименном классе. Messages превратились в несколько внутренних классов, которые помогают создавать, сериализовывать и десериализовывать описанную модель. По message Student компилятор создал класс AcademyProtos.Student и AcademyProtos.Student.Builder. Это типичная реализация паттерна “Строитель”. Объекты класса Student всегда неизменяемы, т.е. после создания мы не можем изменить каких-либо значений. Все манипуляции происходят с классом Builder, для этого у него есть достаточно методов.
Разберем код. Нам небходимо создать группу, для которой определено обязательное имя и набор студентов в виде repeated поля. Создание группы выглядит следующим образом:
Для того, чтобы создать новый объект мы должны вызвать его Builder, заполнить его поля, а затем, в качестве звершающей изменения операции вызвать метод build() , который создаст группу. Repeated поля мы можем заполнять как по одному, так и добавлять целую коллецию.
Как вы уже поняли, создавать студентов мы можем аналогично:
Итак, данные мы создали, получили заполненный объект типа Group, теперь необходимо перегнать его в массив байт. Сделать это можно следующим образом:
Вот так просто! Сериализованная группа теперь - набор байт в protocol buffers формате.
Затем нам необходимо прочитать сохраненные данные. Воспользуемся статическим методом parseFrom .
Для того, чтобы проверить результат выведем его на экран (компилятор создает человекопонятные методы toString для классов, так что с отладкой нет проблем).
В результате, в консоли мы видим:
За ширмой, для полноты примера, я добавил еще одного студента к группе.
Protocol Buffers - отличный инструмент для кросс-платформенной сериализации данных. В некоторых случаях, он позволяет сохранять обратную совместимость, однако, при безрассудном подходе может и нанести вред. Сегодня мы познакомились с основами формата, разобрали .proto файл и пример Java кода, который работает с описанными структурами. Protocol Buffers - это кирпичик, который стоит в основе других технологий для интеграции гетерогенных систем, также существуют и аналоги, которые мы рассмотрим позже. Как всегда - это не серебряная пуля, но хороший инструмент интеграции.
E-commerce давно перестали быть сайтами с картинками — сегодня это огромные онлайн-платформы с множеством высоконагруженных сервисов. В Ozon порядка 60% сервисов — от инфраструктурных проектов до пользовательских — написано на Go, в IT-лаборатории компании сейчас одна из самых больших golang-команд России. Об инструментах разработки и трендах в развитии языка рассказывает Владимир Сердюков, ведущий разработчик группы «Личный кабинет» Ozon.
ведущий разработчик группы «Личный кабинет» Ozon
Как-то ко мне пришел тестировщик и показал тестовый смартфон, на котором было запущено наше приложение — но вместо текста и элементов интерфейса на нем был белый экран. Мы начали разбираться.
Понять, почему это произошло, можно будет ближе к концу статьи, но забегая вперед (спойлер) — отсутствовало одно из обязательных полей в выдаче от бэкенда.
Почему эту проблему стоит обсуждать?
Подобные проблемы сложно локализовать, и они не заметны на этапе тестирования. Как же тогда их решить? Я бы рекомендовал следующее:
- использовать один контракт для разных платформ (в одном виде для desktop, приложения и т.д.);
- хранить контракты в одном репозитории;
- генерировать код под разные платформы (не писать вручную, забыть про копипасту).
proto 2 vs proto 3
Для работы с контрактами мы в Ozon используем protobuf — механизм, придуманный Google для сериализации структур данных. Чтобы из proto-файлов сгенерировать код, мы используем proto 3 с набором плагинов, один из которых — gogoproto, призванный упростить этот процесс и частично забороть особенности proto v3.
Предыдущая версия протокола (proto 2) позволяла реализовывать обязательные поля при помощи тега optional и задавать стандартное значение. Однако это приводило к проблемам портирования возможности генерации кода на другие языки программирования.
Старт 22 ноября, 4 месяца, Онлайн, От 35 000 до 100 000 ₽
Это стало причиной появления proto 3. В новой версии протокола поменялось отношение к обязательным полям: все поля стали необязательные, а значения по умолчанию просто не отправляются. Кроме того, были исправлены enum, улучшен декодинг в json и внесены другие мелкие изменения.
Как сделать поля обязательными в proto 3
Чтобы сделать поля обязательными, можно использовать Well-known типы данных. Это может быть строка, булево значение, число, timestamp и тому подобное.
Как проверить, что новые изменения не ломают контракты?
Теперь понятно, как можно сделать поля обязательными, но что делать, если вдруг поле перестало быть обязательным или произошло что-то еще?
Для этого есть несколько инструментов для валидации proto-файлов, например buf.build и uber/prototool.
Оба инструмента работают по схожей схеме: чтобы запустить валидацию, создайте yaml-файл, в нем укажите конфигурацию, какие proto-файлы надо проверить, а какие нет. Также можно указать, какую ветку из репозитория брать. В обоих случаях работа идет только с git.
uber/protool пока не поддерживает apiv2, поэтому стоит приглядеться внимательнее к buf.build.
Что такое apiv2?
Поддержка работы с protobuf в Go впервые была анонсирована в 2010 году, первая версия Go вышла только спустя два года. С тех пор прошло много времени, изменились требования.
В итоге, несколько месяцев назад, 2 марта 2020 года, была анонсирована apiv2. Вот что изменилось по сравнению с прошлой версией:
- появилась рефлексия для proto.Message;
- канонический маппинг для json-полей;
- улучшение производительности;
- не получится использовать старые плагины и инструменты.
Давайте рассмотрим пример того, что теперь можно сделать из коробки. Есть api, возвращающее данные, которые мы не хотим показывать в логах (например, пароли пользователей, номера банковских карт и т.п.).
Для этого подключаем специальный пакет google.protobuf.FieldOptions и сразу добавляем флаг non_sensitive . Он будет отвечать за то, нужно ли маскировать данные внутри ответа. Выставим по умолчанию значение false (привет, proto2).
Подключаем новый интерфейс — ProtoReflect() и используем функцию Range() .
Таким образом проходимся по все кастомным полям и проверяем значение non_sensitive поля (конечно же, используя рефлексию). Как только находим поле, в котором нужно убрать данные, вызываем Clear() .
Программы, которые поддерживают PROTO расширение файла
В следующем списке перечислены программы, совместимые с файлами PROTO, которые разделены на категории 3 в зависимости от операционной системы, в которой они доступны. Файлы с суффиксом PROTO могут быть скопированы на любое мобильное устройство или системную платформу, но может быть невозможно открыть их должным образом в целевой системе.
Программы, обслуживающие файл PROTO
Как открыть файл PROTO?
Проблемы с доступом к PROTO могут быть вызваны разными причинами. Что важно, все распространенные проблемы, связанные с файлами с расширением PROTO, могут решать сами пользователи. Процесс быстрый и не требует участия ИТ-специалиста. Ниже приведен список рекомендаций, которые помогут вам выявить и решить проблемы, связанные с файлами.
Шаг 1. Скачайте и установите protobuf
Основная и наиболее частая причина, препятствующая открытию пользователями файлов PROTO, заключается в том, что в системе пользователя не установлена программа, которая может обрабатывать файлы PROTO. Решение простое, просто скачайте и установите protobuf. Полный список программ, сгруппированных по операционным системам, можно найти выше. Одним из наиболее безопасных способов загрузки программного обеспечения является использование ссылок официальных дистрибьюторов. Посетите сайт protobuf и загрузите установщик.
Шаг 2. Проверьте версию protobuf и обновите при необходимости
Если проблемы с открытием файлов PROTO по-прежнему возникают даже после установки protobuf, возможно, у вас устаревшая версия программного обеспечения. Проверьте веб-сайт разработчика, доступна ли более новая версия protobuf. Иногда разработчики программного обеспечения вводят новые форматы вместо уже поддерживаемых вместе с новыми версиями своих приложений. Если у вас установлена более старая версия protobuf, она может не поддерживать формат PROTO. Последняя версия protobuf должна поддерживать все форматы файлов, которые совместимы со старыми версиями программного обеспечения.
Шаг 3. Настройте приложение по умолчанию для открытия PROTO файлов на protobuf
Если у вас установлена последняя версия protobuf и проблема сохраняется, выберите ее в качестве программы по умолчанию, которая будет использоваться для управления PROTO на вашем устройстве. Процесс связывания форматов файлов с приложением по умолчанию может отличаться в деталях в зависимости от платформы, но основная процедура очень похожа.
Выбор приложения первого выбора в Windows
- Щелкните правой кнопкой мыши на файле PROTO и выберите « Открыть с помощью опцией».
- Нажмите Выбрать другое приложение и затем выберите опцию Еще приложения
- Последний шаг - выбрать опцию Найти другое приложение на этом. указать путь к папке, в которой установлен protobuf. Теперь осталось только подтвердить свой выбор, выбрав Всегда использовать это приложение для открытия PROTO файлы и нажав ОК .
Выбор приложения первого выбора в Mac OS
Шаг 4. Убедитесь, что PROTO не неисправен
Если проблема по-прежнему возникает после выполнения шагов 1-3, проверьте, является ли файл PROTO действительным. Отсутствие доступа к файлу может быть связано с различными проблемами.
1. Убедитесь, что PROTO не заражен компьютерным вирусом
Если случится так, что PROTO инфицирован вирусом, это может быть причиной, которая мешает вам получить к нему доступ. Сканируйте файл PROTO и ваш компьютер на наличие вредоносных программ или вирусов. Если сканер обнаружил, что файл PROTO небезопасен, действуйте в соответствии с инструкциями антивирусной программы для нейтрализации угрозы.
2. Проверьте, не поврежден ли файл
3. Проверьте, есть ли у вашей учетной записи административные права
Иногда для доступа к файлам пользователю необходимы права администратора. Выйдите из своей текущей учетной записи и войдите в учетную запись с достаточными правами доступа. Затем откройте файл Protocol Buffer Format.
4. Убедитесь, что ваше устройство соответствует требованиям для возможности открытия protobuf
5. Проверьте, есть ли у вас последние обновления операционной системы и драйверов
Современная система и драйверы не только делают ваш компьютер более безопасным, но также могут решить проблемы с файлом Protocol Buffer Format. Устаревшие драйверы или программное обеспечение могли привести к невозможности использования периферийного устройства, необходимого для обработки файлов PROTO.
Вы хотите помочь?
Если у Вас есть дополнительная информация о расширение файла PROTO мы будем признательны, если Вы поделитесь ею с пользователями нашего сайта. Воспользуйтесь формуляром, находящимся здесь и отправьте нам свою информацию о файле PROTO.
Читайте также: