Miroslav Holec
Premium

Návrh gRPC služeb

Miroslav Holec   17. ledna 2022

Kromě formátu Protobuf je možné navrhovat gRPC služby výhradně s využitím jazyka C# a .NET frameworku. Tento přístup vyhovuje zejména týmům přecházejícím z WCF frameworku a firmám, které svá API používají pro vnitrofiremní komunikaci v rámci .NET platformy. Vývoj a komunikace s gRPC službami se tak výrazně zjednodušuje, protože veškeré kontrakty lze sdílet mezi projekty ve formě NuGet balíčků.

Princip návrhu gRPC služeb

Samotný návrh gRPC služeb se skládá z návrhu tzv. services a jednotlivých procedur. Každá procedura pak obsahuje vstupní a výstupní zprávu. Ve svém základu je tedy struktura následující:

service1
    procedure1 (requestMessage + responseMessage)
    procedure2 (requestMessage + responseMessage)
service2
    procedureX (requestMessage + responseMessage)

Důležité je, že konečnou podobou je vygenerovaný C# kód, který se skládá z tříd (services), metod (procedures) a tříd pro zprávy (messages). Návrh gRPC služeb přes svou contract-first formu probíhá nejčastěji přímo v kódu, jelikož nabídka GUI nástrojů pro návrh služeb je omezená. Vývojář tedy navrhuje služby psaním proto souborů.

gRPC Code-First

Nadšence WCF služeb potěší možnost vyhnout se Protocol Buffers a definovat gRPC služby výhradně s pomocí C# interfaces a tříd. Tento code-first přístup zajišťuje specifická sada NuGet balíčků, kterou vytvořil britský vývojář Marc Gravell. Vývojáři na platformě .NET si mohou místo Protocol Buffers sdílet tradiční projekty se sadou tříd a interfaces. Pro vývojáře jiných platforem se však cesta k gRPC službě nezavírá. Do gRPC aplikace lze zapojit reflection service, kterou je možné následně použít ke zpětnému vygenerování proto souborů. Nevýhoda tkví pouze v tom, že kontrakty se stávají dostupné až s nasazením webové služby.



image-20220118092459964

Principielně se jedná o podobný přístup, jako v případě WCF služeb. C# třídy musí však obsahovat dodatečné instrukce pro serializer.

[DataContract]
public class HelloReply
{
    [DataMember(Order = 1)]
    public string Message { get; set; }
}

[DataContract]
public class HelloRequest
{
    [DataMember(Order = 1)]
    public string Name { get; set; }
}

[ServiceContract]
public interface IGreeterService
{
    [OperationContract]
    Task<HelloReply> SayHelloAsync(HelloRequest request,
        CallContext context = default);
}

Komunitní projekt protobuf-net.Grpc poskytuje kompletní tooling včetně podpory gRPC klienta nebo tzv. reflection service, která usnadňuje testování gRPC služeb.