=

Cheatsheet gRPC

Abych usnadnil vývojářský život sobě i mým čtenářům, připravil jsem několik code snippetů, které souvisí s vývojem gRPC služeb. Průběžně se budu snažit tyto snippety aktualizovat podle nově vydávaných verzí služeb gRPC na platformě .NET.

Kestrel (macOS kvůli ALPN)

Toto nastavení se týká jen platformy macOS, kde není podpora ALPN. Musí se proto pro účely lokálního vývoje oželet SSL. Konfiguraci je vhodné proto doplnit podmínkou o prostředí, na kterém se má aplikovat (obvykle Development).

webBuilder.ConfigureKestrel((h,x) =>
{
   x.ListenLocalhost(5001, o => o.Protocols = HttpProtocols.Http1);
   x.ListenLocalhost(5002, o => o.Protocols = HttpProtocols.Http2);
});

Klient (macOS kvůli ALPN)

AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

Tradiční gRPC (contract-first)

Níže jsou popsána nastavení pro klasické použití gRPC služeb s využitím Protobuf souborů. Je důležité hlídat si verze NuGet balíčků, protože některé kombinace nefungují korektně. Níže uvedené jsou ověřené. Nejjistější je vždy založit čistý gRPC projekt z nové šablony a použít vložené NuGet verze.

Sestava NuGet server

<PackageReference Include="Grpc.AspNetCore" Version="2.40.0" />
<PackageReference Include="Grpc.AspNetCore.Web" Version="2.40.0"/>
<PackageReference Include="Grpc.AspNetCore.Server.Reflection" Version="2.40.0" />

Zapojení gRPC services

// 1. Configure Services
services.AddGrpc();
services.AddGrpcReflection();

// 2. Configure
endpoints.MapGrpcService<GreeterService>();
endpoints.MapGrpcReflectionService();

Sestava NuGet client

Níže se předpokládá konstrukce pomocí tzv. client factory. Vždy je doporučeno použít factory před ručním vytvářením kanálu.

<PackageReference Include="Grpc.Tools" Version="2.40.0" />
<PackageReference Include="Grpc.AspNetCore.Server.ClientFactory" Version="2.40.0" />
<PackageReference Include="Google.Protobuf" Version="3.19.1" />

Nastavení Client Factory

services.AddGrpcClient<Greeter.GreeterClient>(x =>
{
  x.Address = new Uri("http://localhost:5002");
});

gRPC Code First

Následují nastavení pro metodiku code first bez Protobuf souborů

Sestava NuGet server

Doporučuji použít balíček System.ServiceModel.Primitives, který obsahuje atributy pro popisování kontraktů.

<PackageReference Include="protobuf-net.Grpc.AspNetCore" Version="1.0.152" />
<PackageReference Include="protobuf-net.Grpc.AspNetCore.Reflection" Version="1.0.152" />
<PackageReference Include="System.ServiceModel.Primitives" Version="4.9.0" />

Zapojení gRPC services

// 1. Configure Services
services.AddCodeFirstGrpc();
services.AddCodeFirstGrpcReflection();

// 2. Configure
endpoints.MapGrpcService<ProductService>();
endpoints.MapCodeFirstGrpcReflectionService();

Sestava NuGet client

<PackageReference Include="protobuf-net.Grpc" Version="1.0.152" />
<PackageReference Include="protobuf-net.Grpc.ClientFactory" Version="1.0.152" />

Nastavení Client Factory

services.AddCodeFirstGrpcClient<ICoursesService>(options => 
{ 
   options.Address = new Uri("http://localhost:5002"); 
});

Dále je v souvislosti s Code First nutné správně popsat kontrakty. To lze pomocí atributů z balíčku protobuf-net a nebo pomocí System.ServiceModel.Primitives. Níže je kombinace obojího pro porovnání.

[ServiceContract]
public interface ICoursesService
{
    [OperationContract]
    Task<CourseReply> GetCourse(GetCourseByIdRequest request, CallContext callContext = default);
}

[ProtoContract]
public class CourseReply
{
    [DataMember(Order = 1)]
    public int Id { get; set; }

    [ProtoMember(2)]
    public string Title { get; set; }
}

Hlavní nabídka

🏚️ Úvod do gRPC
✍️ Historie a .NET
✍️ Komunikace
✍️ Protobuf
✍️ Návrh služeb
✍️ Reflection
✍️ Cheatsheet
🧑‍🎓 Školení

Miroslav Holec

Miroslav Holec

Jsem nezávislý konzultant a lektor na volné noze se zaměřením na vývojářské technologie Microsoftu. Školím ve firmách po celé České republice a na Slovensku.

kontakt zde

Dotazy, poptávky a objednávky

mirek@miroslavholec.cz
Loading