Использование 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).

Другие вопросы по тегам