Могу ли я переопределить префикс конечной точки, установленный в клиентском вызове Go GRPC? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть один protobuf, который генерирует код C # и Go.

Protobuf содержит:

syntax = "proto3";
package myprotobuf;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git";

Я использую go-micro и protoc-gen-micro для моего Go GRPC.Я использую модули Go для своих пакетов Go.Я помещаю сгенерированный код Go в мой репозиторий protobuf по нескольким причинам: (a) подмодулям Git может быть трудно работать с (b) protobuf, ссылающийся на тип во внешнем пакете, требует, чтобы внешний пакет имел определенный абсолютный URL-адрес пакетаи (c) это то, как Google это делает (см., например, structpb ), поэтому кажется, что это «стандарт».

Сервер / клиент C #, сгенерированный из этого прото-обслуживания / достиг конечной точкив "/myprotobuf.Service/Method" и работает нормально.

GRPC_TRACE для C # дает:

Decode: ':path: /myprotobuf.Service/Method', elem_interned=1 [1], k_interned=1, v_interned=1 (edited) 

Клиент Go / go-micro, вызывающий сервер C #, дает:

Decode: ':path: /myprotobuf.git.Service/Method', elem_interned=0 [2], k_interned=1, v_interned=0

с последующей ошибкой.Обратите внимание, что путь отличается.Точки останова и Console.WriteLine в обработчике C # GRPC никогда не попадают, что имеет смысл, поскольку мы не достигаем известной конечной точки.

Какое решение для этого?

  • go get похоже, что в конце URL-адреса пакета требуется .git.
  • модулям go требуются определения "module" и "package" для соответствия URL.
  • C # не понравится""в пространстве имен.

Таким образом, кажется, что Go и C # всегда собираются ставить перед конечной точкой префикс того, что представляет собой пакет / пространство имен, и они никогда не собираются договариваться о том, что пакет/ namespace должно быть.

Есть ли способ переопределить пространство имен с префиксом конечной точки GRPC?

1 Ответ

0 голосов
/ 25 марта 2019

Один из найденных мной обходных путей - поместить пакет на один уровень под protos в каталог «mypb»:

package mypb;
option go_package = "gitlab.example.com/mycompany/myprotobuf.git/mypb";
option csharp_namespace = "MyCompany.Protobuf.MyPB";

Это что-то вроде хака, но я тоже не противмного, особенно потому, что он скрывает сгенерированный код от исходного кода, который меня действительно волнует.Таким образом, сгенерированные C # и Go договариваются о пространстве имен / пакете, к которому они добавляют конечные точки.К счастью, верблюжий регистр MyPB против строчного mypb, похоже, не имеет значения.

...