Hallo,
ich habe schon viel über gRPC gelesen, wie z.B. diesen Artikel im
ASP.NET Blog. Da ich grade ein neues Projekt anfange, bietet sich die Gelegenheit an das ganze mal auszuprobieren. Ich habe also ein neues ASP.NET Core Projekt nach diesem
Beispiel
von MS erstellt. Zusätzlich eine REST Api die so aussieht
[Route("api/[controller]")]
[ApiController]
public class HelloController : ControllerBase
{
public IActionResult Get(string msg)
{
return Ok(msg);
}
}
Da gRPC mit einem Buffer arbeitet bin ich mal davon ausgegangen das die Kommunikation zwischen Client und Server schneller ist als mit REST. Dies wollte ich dann mit einer einfachen .NET Core App testen
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
TestGrpcSpeed();
Console.ReadLine();
}
static async void TestGrpcSpeed()
{
HttpClient hc = new HttpClient();
var opt = new Grpc.Net.Client.GrpcChannelOptions() { HttpClient = hc };
var chan = Grpc.Net.Client.GrpcChannel.ForAddress("https://localhost:5001", opt);
var client = new HelloService.HelloServiceClient(chan);
var sp = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
{
var res = await client.HelloAsync(new HelloRequest() { Msg = "Hello" });
var msg = res.Msg;
}
sp.Stop();
Console.WriteLine(sp.Elapsed.TotalMilliseconds);
sp.Restart();
for (int i = 0; i < 1000; i++)
{
var res = await hc.GetAsync("https://localhost:5001/api/hello?msg=hello");
if (res.StatusCode == System.Net.HttpStatusCode.OK)
{
var msg = await res.Content.ReadAsStringAsync();
}
}
sp.Stop();
Console.WriteLine(sp.Elapsed.TotalMilliseconds);
}
}
Der aufruf mit gRPC dauert bei mir 3434,3633ms mit REST 1224,961. Schneller ist gRPC bei mir nicht, was irgendiw enttäuschend ist. Mache ich etwas falsch?
Cool ist natürlich das man sich die Schnittstellendokumentation sparen oder auf ein minimum reduzieren kann. Durch das automatische generieren der Schnittstelle über die *.proto Datei auf dem Client entfällt auch das Anlegen und parsen irgendwelch JSON Strukturen.
Die geringere Nachrichtenlänge ist sicherlich sehr interessant aber wohl ehr für die Infrastruktur und große Projekte.
Interessant ist natürlich auch die bidirektionale Kommunikation die sich allein mit REST so nicht umsetzen lässt.
Für mein aktuelles Projekt werde ich dieses Framework einsetzten.
Hat jemand schon gRPC im Einsatz und kann/will seine Erfahrungen teilen?
Gruß Thomas
13 Millionen Schweine landen jährlich im Müll
Dev Apps von mir: UWP Segoe MDL2 Assets,
UI Strings