Привязки протобуфа 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
изменения следуют задокументированным правилам обратной совместимости, ваш протокол будет совместимым.