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. Их грамотное проектирование помогает избежать проблем с совместимостью и упрощает разработку распределенных систем.