Использование ProtoBuf-net с gRPC
Я пытаюсь создать PoC на работе, которая использует gRPC. Документ Google здесь проводит нас через пример приложения. Мне было интересно, могла ли protobuf-net, и, в частности, protogen, понимать определения сервисов и классы, необходимые для выполнения вызовов gRPC? Или над этим что-то работает? Будет ли это работать, если я использую протокол Google для создания клиентского и серверного кода (который включает определения служб и вызовы RPC) и protobuf-net для моих бизнес-объектов.
1 ответ
Это то, что я бы хотел обойти, но на сегодняшний день нет: мне не нужно было разбираться в этом, и это не достигло вершины моего отставания. Я стараюсь следить за тем, что хотят люди, так что приятно знать, что вы за ним, но сегодня: нет. По большей части это время - Protobuf-net прогрессирует из моего свободного / свободного времени, если только у меня нет истинного основания тратить на это "рабочее время".
Обновление: Я активно общаюсь с людьми из Microsoft, которые работают над gRPC для.NET, и, похоже, мы попытаемся здесь работать вместе, чтобы это стало возможным с помощью gRPC в.NET Core 3.0. временная шкала - значение: мы бы поделились реализацией кода вызова службы, но позволили бы ему работать с несколькими API-интерфейсами сериализатора.
protobuf-net.Grpc is now a thing... albeit in preview. When.NET Core 3 comes out, we should be able to make this available.
It is inspired by the WCF approach, so your service interfaces are defined via:
namespace Whatever {
[ServiceContract]
public interface IMyAmazingService {
ValueTask<SearchResponse> SearchAsync(SearchRequest request);
// ... etc
}
}
Servers just implement the interface:
public class MyServer : IMyAmazingService {
// ...
}
(how you host them depends on whether you're using ASP.NET Core, or the native/unmanaged gRPC libraries; both work)
and clients just request the interface:
var client = http.CreateGrpcService<IMyAmazingService>();
var result = await client.SearchAsync(query);
In the above case, this would be inferred to be the Whatever.MyAmazingService
/ Search
service in gRPC terms, i.e.
package Whatever;
// ...
service MyAmazingService {
rpc Search (SearchRequest) returns (SearchResponse) {}
}
but the service/method names can be configured more explicitly if you prefer. The above is a unary example; for unary operations, the result can be any of T
, Task<T>
, ValueTask<T>
- or void
/ Task
/ ValueTask
(which all map to .google.protobuf.Empty
, as does a method without a suitable input parameter).
The streaming/duplex operations are inferred automatically if you use IAsyncEnumerable<T>
(for some T
) for the input parameter (client-streaming), the return type (server-streaming), or both (duplex).