Правила proto-контракта
Last updated
Last updated
Контракт — это набор методов, объединенных в сервисы. Описание метода состоит из названия, сообщения запроса и сообщения ответа. В запросе и ответе можно как указать стандартные типы данных, так и составить свой объект с необходимым наполнением. Во втором случае потребуется придумать ему название и описать с ключевым словом message.
Метод должен принимать что-то на вход и возвращать что-то на выходе — HelloRequest и HelloResponse. Если не нужно получать или отправлять какие-то данные, их можно заменить пустым значением google.protobuf.Empty. Тогда в ответ на запрос или в запросе не будут отправляться никакие данные, но придет код ответа. Ответ 2хх, если все успешно, или 4хх/5хх, если есть проблемы. Это позволяет снизить нагрузку на систему и повысить безопасность, передавая только самое необходимое.
В методе должны быть указаны типы данных, которыми он оперирует. В примере выше это string для name и message, а также HelloRequest и HelloResponse для самого запроса. Если тип данных заранее неизвестен, можно использовать google.protobuf.Any, который заменяет любой тип данных.
У поля в сообщении должен быть неповторяющийся порядковый номер. Если какое-то поле было использовано ранее и удалено, этот номер повторно использовать нельзя. Такие поля можно резервировать ключевым словом reserved или оставляя комментарии.
Для описания контракта используются ключевые слова:
‘syntax’
— текущая версия синтаксиса. Сейчас, как правило, новые сервисы пишутся на proto3.
‘import’
— для импорта стандартных пакетов. Например, “google/protobuf/timestamp.proto” загрузит тип данных timestamp.
‘service’
— для объявления сервиса. В сервис объединяют GRPC-методы
‘rpc’
— для объявления метода: его названия и request-сообщения.
‘returns’
— для объявления ответа метода, response-сообщения.
‘message’
— для объявления объекта.
‘enum’
— для объявления перечисления.
‘repeated’
— для объявления повторяющегося поля.
‘reserved’
— для резервирования поля.
‘optional’
или ‘required’
— для объявления необязательного или обязательного поля. В proto3 этот функционал убран.
‘oneof’
— для объявления сложного поля, в котором можно получить одно из нескольких значений. Это довольно нагруженная и сложно обрабатываемая конструкция, которая может много весить и тратить кучу ресурсов, поэтому ее лучше не использовать, а заменить на что-нибудь другое. Например, на строку, в которой придет на самом деле json.
Целый набор стандартных типов данных вроде bool, string, int64 и других.
Источник: https://habr.com/ru/companies/tinkoff/articles/780024/