none
Grpc ASP.NET Core - REST - .NET Client RRS feed

  • Allgemeine Diskussion

  • 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



    Montag, 24. Februar 2020 18:29

Alle Antworten