Перейти к содержимому

Шаблон gRPC

Шаблон описания gRPC-сервиса и метода.

Шаблон gRPC

gRPC-контракт описывает сервис, методы, сообщения request/response, тип вызова, ошибки, deadlines, metadata и правила совместимости .proto.

Паспорт метода

ПолеЗначение
Сервис<Package.ServiceName>
Метод<MethodName>
Тип вызоваUnary / Server streaming / Client streaming / Bidirectional streaming
Proto-файл<path/to/service.proto>
Версияv1
СтатусDraft / Review / Approved / Deprecated

Назначение

Опишите бизнес-операцию, которую выполняет метод.

Участники

УчастникРоль
<client-service>gRPC-клиент
<server-service>gRPC-сервер
<external-system>Внешняя зависимость

Metadata

KeyТипОбяз.Описание
authorizationstringДа / НетТокен доступа
x-correlation-idstringДаСквозная трассировка
x-request-idstringНетID запроса
idempotency-keystringДа / НетКлюч идемпотентности

Proto-контракт

syntax = "proto3";

package example.v1;

service ExampleService {
  rpc CreateExample(CreateExampleRequest) returns (CreateExampleResponse);
}

message CreateExampleRequest {
  string external_id = 1;
  string name = 2;
  string comment = 3;
}

message CreateExampleResponse {
  string id = 1;
  string status = 2;
}

Request message

ПолеProto typeОбяз.ПравилоОписание
external_idstringДаНе пустоеВнешний ID
namestringДаДо <N> символовНазвание
commentstringНетДо <N> символовКомментарий

Response message

ПолеProto typeОбяз.Описание
idstringДаИдентификатор сущности
statusstringДаСтатус обработки

Бизнес-логика

  1. Принять gRPC-запрос.
  2. Проверить metadata.
  3. Проверить обязательные поля.
  4. Выполнить бизнес-валидации.
  5. Выполнить операцию.
  6. Вернуть response.

Ошибки

gRPC statusУсловие
INVALID_ARGUMENTНекорректные входные данные
UNAUTHENTICATEDНе передан или невалиден токен
PERMISSION_DENIEDНет прав
NOT_FOUNDОбъект не найден
ALREADY_EXISTSОбъект уже существует
FAILED_PRECONDITIONНарушено бизнес-условие
DEADLINE_EXCEEDEDПревышен deadline
UNAVAILABLEСервис временно недоступен
INTERNALВнутренняя ошибка

Deadlines и retry

ПараметрЗначение
Deadline клиента<N> мс
Timeout внешнего вызова<N> мс
RetryДа / Нет
Условия retryUNAVAILABLE, DEADLINE_EXCEEDED
Максимум попыток<N>

Совместимость proto

ПравилоТребование
Не переиспользовать номера полейУдаленные номера помечать как reserved
Не менять тип существующего поляТребует новой версии контракта
Новые поля добавлять с новыми номерамиСтарые клиенты продолжают работать
enum расширять осторожноСтарые клиенты могут не знать новое значение

Пример reserved

message CreateExampleRequest {
  reserved 4, 5;
  reserved "old_field";
}

Sequence diagram

@startuml
participant "Client Service" as Client
participant "gRPC Service" as Server
participant "Database" as DB
Client -> Server: CreateExample(request, metadata)
Server -> Server: Validate request
Server -> DB: Save entity
DB --> Server: Saved
Server --> Client: CreateExampleResponse
@enduml

Открытые вопросы

IDВопросКому адресованСтатус
Q-001<вопрос><роль / ФИО>Открыт

Критерии приемки документа

IDКритерий
AC-DOC-001Документ согласован с владельцем продукта / архитектором / разработкой, если применимо.
AC-DOC-002Все спорные места вынесены в открытые вопросы или зафиксированы как ограничения.
AC-DOC-003В документе нет неоднозначных формулировок вроде “быстро”, “удобно”, “корректно” без измеримого критерия.