Как сохранить Proto файлы? - PullRequest
2 голосов
/ 29 февраля 2020

Я создал 3 прото-файла и хотел бы сохранить его в репозитории git:

enter image description here

отдельно от всех остальных файлов. Хранилище содержит только .proto файлов . У меня есть 3 микросервиса, и у каждого из них есть свой собственный репозиторий, который использует эти прото-файлы для связи друг с другом:

enter image description here

Вы можете увидеть на На рисунке выше видно, что прототипные файлы используют разные микросервисы.

Предположим, я собираюсь изменить Protofile2 и pu sh изменения в репозитории proto, запомните репозиторий прототипов отделены от хранилища микросервисов:

enter image description here

Когда я запускаю go test на service1 или service2 , он должен сказать мне, что Protofile2 изменился или не имеет такой же ha sh как и прото-файл в папке service2:
enter image description here

Что мне нужно снова сгенерировать код.

Существуют ли какие-либо инструменты для решения проблемы? Или как мне это решить?

Ответы [ 2 ]

2 голосов
/ 29 февраля 2020

Вот что я предлагаю:

  • Храните ваши протос (и их go генерирующие make-файлы) в одном git репо. Каждое определение должно быть в своем собственном каталоге для простоты импорта.
  • пометьте репо версией - особенно при потенциально несостоятельных изменениях
  • импортируйте определенные прото-определения из ваших микро-сервисов, например import "github.com/me/myproto/protodef2"
  • использование go модулей (введено с go v1.11 в 2019 году), чтобы гарантировать, что микросервис X получит совместимую версию protobuf Y

К точке 2 - и, как упоминал @PaulHankin, - старайтесь не нарушать обратную совместимость. Поля Protobuf можно удалить, но до тех пор, пока оставшиеся индексы полей не изменятся, старые клиентские вызовы будут по-прежнему совместимы с более новыми прото-определениями.

1 голос
/ 29 февраля 2020

Обычно стараются сделать буферы протокола обратно совместимыми, так что при изменении файла протока не обязательно менять службы, зависящие от прото-файла. См. https://developers.google.com/protocol-buffers/docs/proto3#updating

Однако, если вы хотите проверить, вы можете написать тест, используя proto.GetProperties(msgType). Поместите ожидаемые свойства структуры в литерал и используйте reflect.DeepEqual, чтобы сравнить его со свойствами структуры struct Dynamic c, которые вы получаете, вызывая proto.GetProperties для типа protoi c вашего прото. Примерно так:

func TestMyProtoStructVersion(t *testing.T) {
    gotProps := proto.GetProperties(reflect.TypeOf(&mypb.MyProtoStruct{}))
    if !reflect.DeepEqual(gotProps, wantMyProtoStructProps) {
        t.Errorf("MyProtoStruct proto has changed")
    }
}

Вы можете использовать go generate для автоматизации процесса создания файла, содержащего ожидаемые свойства структуры (wantMyProtoStructProps) буфера протокола, который вы можете включить в тест.

...