Правила proto-контракта

Контракт — это набор методов, объединенных в сервисы. Описание метода состоит из названия, сообщения запроса и сообщения ответа. В запросе и ответе можно как указать стандартные типы данных, так и составить свой объект с необходимым наполнением. Во втором случае потребуется придумать ему название и описать с ключевым словом 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 и других.

Пример proto-контракта

Источник: https://habr.com/ru/companies/tinkoff/articles/780024/

Last updated

Was this helpful?