Seriál gRPC - Návrh gRPC služeb
Tento článek byl napsán v roce 2022. Vývojářské technologie se neustále inovují a článek již nemusí popisovat aktuální stav technologie, ideální řešení a můj současný pohled na dané téma.
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.
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.