Привязки протобуфа gRPC: вносят ли изменения в fileDescriptor изменения?

В настоящее время я занимаюсь разработкой службы gRPC в Go с использованием шлюза gRPC в качестве HTTP-прокси. Я генерирую .pb.go привязки из моего .proto файлы, но я заметил, что есть небольшие изменения в моих привязках в двух отдельных, но связанных ситуациях, когда я этого не ожидал. Каждый файл привязки имеет загадочное поле var fileDescriptorX = byte[]{.....} где X на самом деле число. Оба неожиданных изменения происходят с этим полем и только с этим полем.

Мой большой вопрос: совместимы ли эти привязки друг с другом, или изменения в этой области считаются критическими изменениями, делая разные версии привязок несовместимыми?

Во-первых, если я добавлю еще один файл прото в ту же папку и он будет в алфавитном порядке перед существующими протосами, поле fileDescriptor будет переименовано, когда я заново сгенерирую привязки Go. Число X в конце названия поля fileDescriptorX соответствует его порядку по сравнению с другими файлами в папке. Чтобы было понятно, если у меня есть папка с b.proto а также b.pb.goпотом добавляю a.proto а затем повторно запустить мой компилятор, чтобы создать a.pb.go, b.pb.goдескриптор файла будет увеличен с 0 до 1, и a.pb.go получит новый filedescriptor0,

Во-вторых, поскольку я использую шлюз gRPC, я хотел изменить пути в параметрах HTTP. Допустим, у меня есть RPC в a.proto:

rpc GetFoo(GetFooRequest) returns (Foo) {
    option (google.api.http) = {
        get: "/v1alpha1/foo"
    };
}

Когда я меняю путь выше на "/api/foo/v1alpha1/foo", a.pb.gw.go меняется понятно, но байты в a.pb.go"s fileDescriptor0 изменение поля также.

Кажется, что нет никакой документации, обсуждающей, как эти поля используются, и если изменения в них несовместимы, разрывая изменения с другими привязками. Любая помощь приветствуется. Спасибо!

1 ответ

Решение

Эти "файловые дескрипторы" на самом деле являются двоичными кодировками всего в вашем .proto файл. Формат определяется с помощью descirptor.proto в исходном коде Protobuf. Любое изменение, которое вы вносите в свой .proto Файлы, как ожидается, приведут к изменению дескрипторов файлов.

Это не задокументировано, потому что это внутренняя деталь реализации сгенерированного кода. Вам не нужно беспокоиться о том, что меняется в сгенерированном коде. Пока ваш .proto изменения следуют задокументированным правилам обратной совместимости, ваш протокол будет совместимым.

Другие вопросы по тегам