13. Springboot интегрирует Protobuf
13. Springboot интегрирует Protobuf

1. Предисловие

В сценариях применения сетевой связи и обмена данными в предыдущих проектах наиболее часто используемой технологией является json или xml. Благодаря гибким преимуществам JSON все больше и больше предприятий выбирают JSON в качестве формата обмена данными. В настоящее время JSON стал основным в отрасли. JSON достаточно прост в использовании и подходит для большинства сценариев. Но сегодня я представляю шедевр Google protobuf как формат обмена данными. Давайте посмотрим.

2. Введение в Protobuf

Githubадрес:GitHub - protocolbuffers/protobuf: Protocol Buffers - Google's data interchange format

官网адрес:Overview | Protocol Buffers Documentation

Protobuf (Protocol Buffers) — это легкий и эффективный формат обмена данными, разработанный Google. Он используется для сериализации, десериализации и передачи структурированных данных. По сравнению с текстовыми форматами, такими как XML и JSON, Protobuf имеет меньший объем данных, более высокую скорость анализа и более высокую масштабируемость. В то же время это независимый от языка, платформы и расширяемый формат сериализации. Это позволяет разработчикам определять структурированные данные в файле .proto, а затем использовать этот файл для создания исходного кода, который может записывать и читать данные из разных потоков данных.

2.1. Основные идеи

Основная идея Protobuf — использование протоколов для определения структуры и кодирования данных. Протокол — это текстовый файл, определяющий структуру сообщения. Сообщения состоят из полей, каждое из которых имеет имя, тип и необязательное значение по умолчанию. Затем используйте декодер, предоставленный Protobuf, для создания соответствующего кода для сериализации и десериализации данных. Поскольку Protobuf основан на двоичном кодировании, его можно использовать на разных языках.

Protobuf поддерживает следующие типы данных:

  • Базовые типы: такие как int32, string, bool и т. д.
  • Составные типы: такие как сообщение, перечисление и т. д.

2.2. Как работает Протобуф?

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

Файлы Protobuf сохраняются с расширением .proto. Файл .proto написан в формате IDL Protobuf и содержит всю информацию о структуре данных. Данные моделируются как «сообщения», которые представляют собой пары имя/значение. Вот пример простого сообщения Protobuf в файле .proto:

Язык кода:javascript
копировать
// обозначение Protobuf Версия есть версия 3 (последняя версия)
syntax = "proto3";

// обозначениеprotobufимя пакета,Предотвращение дублирования названий классов
package com.shamee.protobuf;

// В каком пакете хранятся сгенерированные файлы?
option java_package = "com.shamee.protos";

// Создать имя класса,если необозначение,Имя файла будет автоматически преобразовано в верблюжий регистр.
option java_outer_classname = "PersonProtos";

// Определяет класс Person
message Person {
    // Следующее из значений (=1  =2) Как сериализация после двоичного кодирования поля из уникальной метки
    // поэтому соотношение 1-15 16 Это будет на один байт меньше, поэтому попробуйте использовать 1-15 Перейдите к изображению общих полей.
    int32 id = 1;
    string name = 2;
    string email = 3;
    string address = 4;
}

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

Файл .proto можно скомпилировать в различные языки программирования с помощью Protoc, компилятора Protobuf. Компилятор генерирует исходный код на языке программирования, указанном разработчиком. Исходный код включает классы и методы для записи, чтения и управления типами сообщений, определенными в файле .proto.

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

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

2.3. Как использовать Protoc для генерации кода?

Определенный выше .proto можно скомпилировать на разные языки с помощью компилятора Protobbuf (Protoc).

скачатькомпилироватьустройство:Release Protocol Buffers v25.3 · protocolbuffers/protobuf · GitHub

Команда компиляции выглядит следующим образом: скомпилируйте файл .proto в JavaScript:

Язык кода:javascript
копировать
protoc --js_out=import_style=commonjs,binary: .customers.proto

Скомпилировано на языке Java:

Язык кода:javascript
копировать
protoc --java_out=./my_dist  .customers.proto

3. Интеграция Springboot

Вышеуказанное знакомит с основным содержанием protobuf, а также с написанием и компиляцией простого синтаксиса. Далее мы воспользуемся им и интегрируем в наш Springboot.

3.1. Введение зависимостей.

Язык кода:javascript
копировать
<dependency>
    <groupId>com.google.protobuf</groupId>
    <artifactId>protobuf-java</artifactId>
    <version>3.6.1</version>
</dependency>
<!-- В то же время добавьте плагин maven для компиляции protobuf для генерации java-файлов. -->
<build>
    <extensions>
        <extension>
            <groupId>kr.motd.maven</groupId>
            <artifactId>os-maven-plugin</artifactId>
            <version>1.5.0.Final</version>
        </extension>
    </extensions>
    <plugins>
        <plugin>
            <groupId>org.xolstice.maven.plugins</groupId>
            <artifactId>protobuf-maven-plugin</artifactId>
            <version>0.5.0</version>
            <configuration>
                <protocArtifact>
                    com.google.protobuf:protoc:3.1.0:exe:${os.detected.classifier}
                </protocArtifact>
                <!--значение по умолчанию,protoПуть к исходному файлу-->
                <protoSourceRoot>${project.basedir}/src/main/resources/proto</protoSourceRoot>
                <pluginId>grpc-java</pluginId>
                <!--да Очистить ли указанный выше каталог конфигурацииoutputDirectory-->
                <clearOutputDirectory>false</clearOutputDirectory>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>compile</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.3.0</version>
            <configuration>
                <excludes>
                    <exclude>**/*.proto</exclude>
                </excludes>
            </configuration>
        </plugin>
    </plugins>
</build>

3.2. Определить файл прототипа.

Определите два файла прототипов: один для получения данных запроса интерфейса Person.proto и один для ответа на Response.proto.

Person.proto:

Язык кода:javascript
копировать
syntax = "proto3";
package proto.shamee;

// В каком пакете хранятся сгенерированные файлы?
option java_package = "proto.shamee";

// Создать имя класса,если необозначение,Имя файла будет автоматически преобразовано в верблюжий регистр.
option java_outer_classname = "PersonProto";

// Определяет класс Person
message Person {
    // Следующее из значений (=1  =2) Как сериализация после двоичного кодирования поля из уникальной метки
    // поэтому соотношение 1-15 16 Это будет на один байт меньше, поэтому попробуйте использовать 1-15 Перейдите к изображению общих полей.
    int32 id = 1;
    string name = 2;
    string email = 3;
    string address = 4;
}

Response.proto:

Язык кода:javascript
копировать
syntax = "proto3";
package proto.shamee;
option java_package = "proto.shamee";
option java_outer_classname = "ResponseProto";

message Response {
    int32 code = 1;
    string message = 2;
    string data = 3;
}

3.3. Protobuf генерирует Java-код.

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

3.4. Настройте сериализацию и десериализацию Protobuf.

Язык кода:javascript
копировать
@Configuration
public class ProtobufConfig {

    /**
     * protobuf сериализация
     */
    @Bean
    ProtobufHttpMessageConverter protobufHttpMessageConverter() {
        return new ProtobufHttpMessageConverter();
    }

    /**
     * protobuf противоположныйсериализация     */
    @Bean
    RestTemplate restTemplate(ProtobufHttpMessageConverter protobufHttpMessageConverter) {
        return new RestTemplate(Collections.singletonList(protobufHttpMessageConverter));
    }

}

3.5. Определить интерфейс контроллера.

Поскольку protobuf передает данные на основе двоичных потоков, здесь необходимо указать протокол x-protobuf.

Язык кода:javascript
копировать
@RestController
@RequestMapping("/test")
public class TestController {

    @PostMapping(value = "/index", produces = "application/x-protobuf")
    public ResponseProto.Response index(@RequestBody PersonProto.Person person){

        return ResponseProto.Response.newBuilder()
                .setCode(200)
                .setMessage("OK")
                .setData("hello:" + person.getName()).build();
    }

}

Затем вы можете запустить проект Springboot.

3.6. Доступ

При доступе сюда вам необходимо определить тип содержимого заголовка, а параметры передаются и доступны как двоичные данные. Данные нашего запроса:

Доступ к конфигурации заголовка:

возвращаться:

На данный момент мы просто выучили protobuf и можем спокойно перекусывать в полночь.

4. Резюме

protobuf по-прежнему имеет некоторые проблемы во всей интеграции. Например, если номера версий ptobuf слишком сильно различаются, компиляция не пройдет. Конечно, у protobuf есть и недостатки:

  • Простая функция: Protobuf имеет простую функцию и не может использоваться для представления сложных концепций. Например, он не может представлять в XML сложные структуры, такие как DTD или XSD.
  • Плохая универсальность: Protobuf — это инструмент, используемый внутри Google, и он обладает плохой универсальностью. XML и JSON стали стандартными инструментами письма во многих отраслях, в то время как Protobuf по-прежнему сильно отстает в универсальности.
  • Плохое самообъяснение: Protobuf данные хранятся в двоичной форме, которую нелегко читать и редактировать. XML Он не требует пояснений, его можно открывать и редактировать непосредственно в текстовом редакторе.

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

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose