proto файлы: терминология, описание, использование
.proto файлы используются в Protocol Buffers (Protobuf) для определения структуры данных и сервисов в платформо-независимом формате. Они содержат контракт взаимодействия между системами и позволяют автоматически генерировать код для сериализации/десериализации данных, а также для работы с RPC-сервисами.
Вот обзор терминологии, базовых понятий и правил написания .proto файлов.
Основные элементы и терминология
syntax
Указывает версию языка.proto(обычноproto3):
12syntax = "proto3";proto3— текущая версия, с более строгими правилами и упрощениями по сравнению сproto2.- Обязательный элемент в начале файла.
package
Определяет пространство имен для сообщений и сервисов в данном файле:
Используется для организации структуры и предотвращения конфликтов имен.12package example;option
Устанавливает дополнительные настройки, такие как язык программирования или параметры генерации кода:
Важен для правильной работы сгенерированного кода.12option go_package = "internal/proto";- Сообщения (
message)
Описывают структуру данных, которая будет сериализоваться/десериализоваться:
12345message Person {string name = 1;int32 age = 2;}- Каждое поле имеет уникальный номер (field number), который используется при сериализации.
- Типы данных (например,
string,int32,bool) строго определены.
- RPC-сервисы (
service)
Определяют удаленные вызовы процедур (RPC):
Описывает методы, которые клиент может вызывать на сервере.1234service Greeter {rpc SayHello (HelloRequest) returns (HelloReply);} - Поле (
field)- Каждое поле внутри
messageимеет:- Тип (например,
int32,string). - Имя (например,
name,age). - Номер (например,
1,2).
- Тип (например,
- Каждое поле внутри
- Импорт (
import)
Позволяет использовать определения из других.protoфайлов:
Поддерживает реюз данных между сервисами.12import "common.proto";
Типы данных
- Простые типы:
int32,int64— целые числа.float,double— числа с плавающей запятой.string— строки UTF-8.bool— булев тип (true/false).
- Комплексные типы:
message— для сложных структур данных.enum— для перечислений:
123456enum Gender {UNKNOWN = 0;MALE = 1;FEMALE = 2;}
- Повторяемые поля:
- Используются для массивов:
12repeated string hobbies = 3;
- Используются для массивов:
Пример .proto файла
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
syntax = "proto3"; package example; // Указываем пакет Go для сгенерированного кода option go_package = "internal/proto"; // Сообщение (структура данных) message HelloRequest { string name = 1; // Поле 1 } message HelloReply { string message = 1; // Поле 1 } // Сервис для RPC service Greeter { rpc SayHello (HelloRequest) returns (HelloReply); } |
Правила и рекомендации
- Имена и номера полей:
- Номера полей должны быть уникальны в пределах одного сообщения.
- Номера от
1до15занимают меньше места при сериализации. - Не используйте зарезервированные номера
19000–19999.
- Типы данных:
- Выбирайте подходящие типы, чтобы минимизировать размер данных и повысить читаемость.
- Используйте
repeatedдля списков, но избегайте избыточных данных.
- Расширяемость:
- Никогда не изменяйте или удаляйте номера полей.
- Для добавления новых данных просто добавьте новые поля с уникальными номерами.
- Импорты:
- Реюзайте сообщения, чтобы избегать дублирования.
- Go-специфичные настройки: Указывайте
option go_packageдля интеграции с Go проектами.
Как писать и использовать
- Создание файла
.proto: Напишите файл с учетом описанных правил и требований. - Генерация кода: Используйте
protocдля генерации кода на нужном языке:
12protoc --go_out=. --go-grpc_out=. internal/proto/example.proto - Использование сгенерированного кода:
- Импортируйте сгенерированный пакет в коде.
- Реализуйте сервер или клиент.
- Тестирование: Проверьте совместимость между клиентом и сервером.
Часто задаваемые вопросы
Что произойдет, если изменить номер поля?
Старые версии системы не смогут правильно обработать измененные данные. Номера полей — это часть «публичного контракта».
Почему номера начинаются с 1?
Ноль зарезервирован как «значение по умолчанию», если поле не задано.
Чем отличаются proto2 и proto3?
- В
proto3значения по умолчанию задаются автоматически. proto2поддерживает обязательные (required) и опциональные (optional) поля, которые вproto3заменены на всегда опциональные.
.proto файлы — это сердце Protobuf. Их грамотное проектирование помогает избежать проблем с совместимостью и упрощает разработку распределенных систем.
Recommended Posts
Golang map и Swiss Table
16.03.2025
