{"id":419,"date":"2024-05-31T21:58:12","date_gmt":"2024-05-31T20:58:12","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=419"},"modified":"2024-06-26T21:58:33","modified_gmt":"2024-06-26T20:58:33","slug":"grundlagen-von-grpc","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=419","title":{"rendered":"Grundlagen von gRPC"},"content":{"rendered":"\n<h3 class=\"wp-block-heading\">Einf\u00fchrung<\/h3>\n\n\n\n<p>gRPC (gRPC Remote Procedure Call) ist ein modernes Open-Source-Remote-Prozeduraufrufs (RPC) -Framework, das von Google entwickelt wurde. Es erm\u00f6glicht die einfache Erstellung von verteilten Anwendungen und Diensten, indem es die Kommunikation zwischen ihnen vereinfacht und optimiert. gRPC basiert auf dem Protokoll Buffers (protobuf), einem effizienten bin\u00e4ren Serialisierungsformat, das von Google ebenfalls entwickelt wurde.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Warum gRPC?<\/h3>\n\n\n\n<p>Die Hauptgr\u00fcnde f\u00fcr die Verwendung von gRPC sind:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Leistung<\/strong>: Durch die Verwendung von Protokoll Buffers ist gRPC \u00e4u\u00dferst performant und ressourcenschonend.<\/li>\n\n\n\n<li><strong>Sprachenunabh\u00e4ngigkeit<\/strong>: gRPC unterst\u00fctzt eine Vielzahl von Programmiersprachen, darunter Java, C++, Python, Go, Ruby, und viele mehr.<\/li>\n\n\n\n<li><strong>Plattform\u00fcbergreifend<\/strong>: gRPC kann auf verschiedenen Plattformen eingesetzt werden, von mobilen Ger\u00e4ten bis zu Servern.<\/li>\n\n\n\n<li><strong>Stream-Unterst\u00fctzung<\/strong>: Neben einfachen RPCs unterst\u00fctzt gRPC auch Client-Streaming, Server-Streaming und bidirektionales Streaming.<\/li>\n\n\n\n<li><strong>Automatische Code-Generierung<\/strong>: Durch die Definition von Diensten in einer Protobuf-Datei kann gRPC automatisch Client- und Server-Code generieren.<\/li>\n<\/ol>\n\n\n\n<h3 class=\"wp-block-heading\">Grundlagen der Protokoll Buffers (protobuf)<\/h3>\n\n\n\n<p>Bevor wir tiefer in gRPC einsteigen, ist es wichtig, die Grundlagen der Protokoll Buffers zu verstehen. Protobuf ist ein Interface Definition Language (IDL), das zur Beschreibung der Struktur von Daten und der RPC-Dienste verwendet wird.<\/p>\n\n\n\n<p>Eine Protobuf-Datei hat die Endung <code>.proto<\/code> und definiert Nachrichten und Dienste. Hier ist ein einfaches Beispiel:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">syntax = <span class=\"hljs-string\">\"proto3\"<\/span>;\n\npackage example;\n\nmessage HelloRequest {\n    string name = <span class=\"hljs-number\">1<\/span>;\n}\n\nmessage HelloReply {\n    string message = <span class=\"hljs-number\">1<\/span>;\n}\n\nservice Greeter {\n    rpc SayHello (HelloRequest) returns (HelloReply);\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel definieren wir einen Dienst <code>Greeter<\/code> mit einer Methode <code>SayHello<\/code>, die eine <code>HelloRequest<\/code> empf\u00e4ngt und eine <code>HelloReply<\/code> zur\u00fcckgibt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erstellen eines gRPC-Dienstes in Java<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Voraussetzungen<\/h4>\n\n\n\n<p>Um gRPC in Java zu verwenden, ben\u00f6tigen Sie die folgenden Abh\u00e4ngigkeiten in Ihrem <code>build.gradle<\/code> (f\u00fcr Gradle) oder <code>pom.xml<\/code> (f\u00fcr Maven):<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">plugins {\n    id <span class=\"hljs-string\">'java'<\/span>\n    id <span class=\"hljs-string\">'com.google.protobuf'<\/span> version <span class=\"hljs-string\">'0.8.16'<\/span>\n}\n\ndependencies {\n    implementation <span class=\"hljs-string\">'io.grpc:grpc-netty-shaded:1.40.1'<\/span>\n    implementation <span class=\"hljs-string\">'io.grpc:grpc-protobuf:1.40.1'<\/span>\n    implementation <span class=\"hljs-string\">'io.grpc:grpc-stub:1.40.1'<\/span>\n    compileOnly <span class=\"hljs-string\">'org.apache.tomcat:annotations-api:6.0.53'<\/span>\n}\n\nprotobuf {\n    protoc {\n        artifact = <span class=\"hljs-string\">'com.google.protobuf:protoc:3.17.3'<\/span>\n    }\n    plugins {\n        grpc {\n            artifact = <span class=\"hljs-string\">'io.grpc:protoc-gen-grpc-java:1.40.1'<\/span>\n        }\n    }\n    generateProtoTasks {\n        all().each { task -&gt;\n            task.plugins {\n                grpc {}\n            }\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Protobuf-Kompilierung<\/h4>\n\n\n\n<p>Speichern Sie die oben angegebene Protobuf-Datei <code>example.proto<\/code> im Verzeichnis <code>src\/main\/proto<\/code>. F\u00fchren Sie dann den folgenden Befehl aus, um die Java-Klassen zu generieren:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">.\/gradlew build<\/code><\/span><\/pre>\n\n\n<h4 class=\"wp-block-heading\">Implementierung des gRPC-Servers<\/h4>\n\n\n\n<p>Erstellen Sie nun die Implementierung des gRPC-Dienstes:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">package example;\n\n<span class=\"hljs-keyword\">import<\/span> io.grpc.Server;\n<span class=\"hljs-keyword\">import<\/span> io.grpc.ServerBuilder;\n<span class=\"hljs-keyword\">import<\/span> io.grpc.stub.StreamObserver;\n\n<span class=\"hljs-keyword\">import<\/span> java.io.IOException;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreeterServer<\/span> <\/span>{\n\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) throws IOException, InterruptedException {\n        Server server = ServerBuilder.forPort(<span class=\"hljs-number\">50051<\/span>)\n                .addService(<span class=\"hljs-keyword\">new<\/span> GreeterImpl())\n                .build()\n                .start();\n\n        System.out.println(<span class=\"hljs-string\">\"Server started, listening on \"<\/span> + server.getPort());\n        server.awaitTermination();\n    }\n\n    <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreeterImpl<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">GreeterGrpc<\/span>.<span class=\"hljs-title\">GreeterImplBase<\/span> <\/span>{\n\n        @Override\n        public <span class=\"hljs-keyword\">void<\/span> sayHello(HelloRequest request, StreamObserver&lt;HelloReply&gt; responseObserver) {\n            <span class=\"hljs-built_in\">String<\/span> greeting = <span class=\"hljs-string\">\"Hello, \"<\/span> + request.getName();\n            HelloReply reply = HelloReply.newBuilder().setMessage(greeting).build();\n            responseObserver.onNext(reply);\n            responseObserver.onCompleted();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel implementieren wir den Greeter-Dienst, der die Methode <code>sayHello<\/code> \u00fcberschreibt. Der Server wird auf Port 50051 gestartet und wartet auf Anfragen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Implementierung des gRPC-Clients<\/h4>\n\n\n\n<p>Nun erstellen wir einen einfachen gRPC-Client, um den Dienst zu nutzen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">package example;\n\n<span class=\"hljs-keyword\">import<\/span> io.grpc.ManagedChannel;\n<span class=\"hljs-keyword\">import<\/span> io.grpc.ManagedChannelBuilder;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreeterClient<\/span> <\/span>{\n\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) throws InterruptedException {\n        ManagedChannel channel = ManagedChannelBuilder.forAddress(<span class=\"hljs-string\">\"localhost\"<\/span>, <span class=\"hljs-number\">50051<\/span>)\n                .usePlaintext()\n                .build();\n\n        GreeterGrpc.GreeterBlockingStub stub = GreeterGrpc.newBlockingStub(channel);\n\n        HelloRequest request = HelloRequest.newBuilder().setName(<span class=\"hljs-string\">\"World\"<\/span>).build();\n        HelloReply response = stub.sayHello(request);\n\n        System.out.println(response.getMessage());\n\n        channel.shutdown();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Der Client stellt eine Verbindung zum Server her und sendet eine <code>HelloRequest<\/code> mit dem Namen &#8222;World&#8220;. Der Server antwortet mit einer <code>HelloReply<\/code>, die die Nachricht &#8222;Hello, World&#8220; enth\u00e4lt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Erweiterte Funktionen von gRPC<\/h3>\n\n\n\n<p>gRPC bietet neben einfachen RPCs auch erweiterte Funktionen wie Streaming und Authentifizierung.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Streaming<\/h4>\n\n\n\n<p>Es gibt vier Arten von gRPC-Methoden:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Unary RPC<\/strong>: Eine einzelne Anfrage f\u00fchrt zu einer einzelnen Antwort (wie im obigen Beispiel).<\/li>\n\n\n\n<li><strong>Server-Streaming RPC<\/strong>: Eine einzelne Anfrage f\u00fchrt zu einer Folge von Antworten.<\/li>\n\n\n\n<li><strong>Client-Streaming RPC<\/strong>: Eine Folge von Anfragen f\u00fchrt zu einer einzelnen Antwort.<\/li>\n\n\n\n<li><strong>Bidirektionales Streaming RPC<\/strong>: Eine Folge von Anfragen f\u00fchrt zu einer Folge von Antworten.<\/li>\n<\/ol>\n\n\n\n<p>Hier ist ein Beispiel f\u00fcr einen serverseitigen Streaming-Dienst:<\/p>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">service Greeter {\n    rpc SayHello (HelloRequest) returns (HelloReply);\n    rpc StreamHello (HelloRequest) returns (stream HelloReply);\n}<\/code><\/span><\/pre>\n\n\n<p>Implementierung des serverseitigen Streamings:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">GreeterImpl<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">GreeterGrpc<\/span>.<span class=\"hljs-title\">GreeterImplBase<\/span> <\/span>{\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> sayHello(HelloRequest request, StreamObserver&lt;HelloReply&gt; responseObserver) {\n        <span class=\"hljs-built_in\">String<\/span> greeting = <span class=\"hljs-string\">\"Hello, \"<\/span> + request.getName();\n        HelloReply reply = HelloReply.newBuilder().setMessage(greeting).build();\n        responseObserver.onNext(reply);\n        responseObserver.onCompleted();\n    }\n\n    @Override\n    public <span class=\"hljs-keyword\">void<\/span> streamHello(HelloRequest request, StreamObserver&lt;HelloReply&gt; responseObserver) {\n        <span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">5<\/span>; i++) {\n            <span class=\"hljs-built_in\">String<\/span> greeting = <span class=\"hljs-string\">\"Hello, \"<\/span> + request.getName() + <span class=\"hljs-string\">\" - \"<\/span> + i;\n            HelloReply reply = HelloReply.newBuilder().setMessage(greeting).build();\n            responseObserver.onNext(reply);\n            <span class=\"hljs-keyword\">try<\/span> {\n                Thread.sleep(<span class=\"hljs-number\">1000<\/span>); <span class=\"hljs-comment\">\/\/ Simuliert eine Verz\u00f6gerung<\/span>\n            } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n                e.printStackTrace();\n            }\n        }\n        responseObserver.onCompleted();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Im obigen Beispiel sendet die Methode <code>streamHello<\/code> f\u00fcnf Nachrichten mit einer Sekunde Verz\u00f6gerung an den Client.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Authentifizierung<\/h4>\n\n\n\n<p>gRPC unterst\u00fctzt verschiedene Authentifizierungsmethoden, einschlie\u00dflich TLS und Token-basierter Authentifizierung. Hier ist ein Beispiel f\u00fcr die Einrichtung eines Servers mit TLS:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">Server server = ServerBuilder.forPort(<span class=\"hljs-number\">50051<\/span>)\n        .useTransportSecurity(<span class=\"hljs-keyword\">new<\/span> File(<span class=\"hljs-string\">\"server.crt\"<\/span>), <span class=\"hljs-keyword\">new<\/span> File(<span class=\"hljs-string\">\"server.pem\"<\/span>))\n        .addService(<span class=\"hljs-keyword\">new<\/span> GreeterImpl())\n        .build()\n        .start();<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Hierbei m\u00fcssen Sie die entsprechenden Zertifikatsdateien (<code>server.crt<\/code> und <code>server.pem<\/code>) angeben.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Fazit<\/h3>\n\n\n\n<p>gRPC ist ein leistungsstarkes und flexibles Framework f\u00fcr die Entwicklung verteilter Systeme. Durch seine effiziente Nutzung von Protokoll Buffers, die Unterst\u00fctzung mehrerer Programmiersprachen und die vielf\u00e4ltigen Kommunikationsmethoden (einschlie\u00dflich Streaming) bietet gRPC eine moderne L\u00f6sung f\u00fcr die Herausforderungen moderner vernetzter Anwendungen. Mit den hier vorgestellten Grundlagen und Beispielen k\u00f6nnen Sie beginnen, eigene gRPC-Dienste und -Clients in Java zu erstellen und die Vorteile dieser Technologie in Ihren Projekten zu nutzen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Einf\u00fchrung gRPC (gRPC Remote Procedure Call) ist ein modernes Open-Source-Remote-Prozeduraufrufs (RPC) -Framework, das von Google entwickelt wurde. Es erm\u00f6glicht die einfache Erstellung von verteilten Anwendungen und Diensten, indem es die Kommunikation zwischen ihnen vereinfacht und optimiert. gRPC basiert auf dem Protokoll Buffers (protobuf), einem effizienten bin\u00e4ren Serialisierungsformat, das von Google ebenfalls entwickelt wurde. Warum gRPC? [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-419","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/419","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=419"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/419\/revisions"}],"predecessor-version":[{"id":420,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/419\/revisions\/420"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=419"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=419"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=419"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}