Привязки gRPC protobuf: нарушают ли изменения 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 fileDescriptor0.

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


person A. Davidson    schedule 17.08.2018    source источник


Ответы (1)


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

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

person Kenton Varda    schedule 22.08.2018