gRPC für Kotlin: Bibliotheken und Anwendungsbeispiele

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

gRPC für Kotlin: Bibliotheken und Anwendungsbeispiele

\n\n

gRPC ist ein von Google entwickeltes Hochleistungs-Framework für entfernte Prozeduraufrufe (RPC). Es verwendet Protocol Buffers (protobuf) zur Datenserialisierung und HTTP/2 für den Transport. Im Kotlin-Ökosystem lässt sich gRPC dank Bibliotheken, die Coroutinen und strenge Typisierung unterstützen, besonders reibungslos integrieren. In diesem Artikel betrachten wir die wichtigsten Werkzeuge für die Arbeit mit gRPC in Kotlin und zeigen funktionierende Beispiele für Server und Client.

\n\n

Wichtige Bibliotheken

\n\n

Für die Arbeit mit gRPC in Kotlin wird folgender Stack benötigt:

\n\n
    \n
  • grpc-kotlin – offizielle Bibliothek von Google, die Kotlin-spezifische APIs bereitstellt, einschließlich Unterstützung für Coroutinen (suspend-Funktionen, Flow).
  • \n
  • protobuf-java und protobuf-gradle-plugin – zur Generierung von Klassen aus .proto-Dateien.
  • \n
  • grpc-netty oder grpc-okhttp – Transportschicht (Netty für Server, OkHttp für Android/Client).
  • \n
  • javax.annotation-api – wird oft für die korrekte Kompilierung des generierten Codes benötigt.
  • \n
\n\n

Für die Abhängigkeitsverwaltung verwenden Sie Gradle (Kotlin DSL). Beispiel für den dependencies-Block:

\n\n
dependencies {\n    implementation("io.grpc:grpc-netty-shaded:1.58.0")\n    implementation("io.grpc:grpc-protobuf:1.58.0")\n    implementation("io.grpc:grpc-stub:1.58.0")\n    implementation("io.grpc:grpc-kotlin-stub:1.4.0")\n    implementation("com.google.protobuf:protobuf-java:3.24.3")\n    implementation("javax.annotation:javax.annotation-api:1.3.2")\n}
\n\n

Binden Sie außerdem unbedingt das protobuf-Plugin zur Codegenerierung ein:

\n\n
plugins {\n    id("com.google.protobuf") version "0.9.4"\n}\n\nprotobuf {\n    protoc {\n        artifact = "com.google.protobuf:protoc:3.24.3"\n    }\n    plugins {\n        create("grpc") {\n            artifact = "io.grpc:protoc-gen-grpc-java:1.58.0"\n        }\n        create("grpckt") {\n            artifact = "io.grpc:protoc-gen-grpc-kotlin:1.4.0:jdk8@jar"\n        }\n    }\n    generateProtoTasks {\n        all().forEach {\n            it.plugins {\n                create("grpc")\n                create("grpckt")\n            }\n        }\n    }\n}
\n\n

Definition des Dienstes über eine .proto-Datei

\n\n

Erstellen Sie die Datei src/main/proto/hello.proto:

\n\n
syntax = "proto3";\n\npackage com.example.grpc;\n\nservice Greeter {\n  rpc SayHello (HelloRequest) returns (HelloReply);\n}\n\nmessage HelloRequest {\n  string name = 1;\n}\n\nmessage HelloReply {\n  string message = 1;\n}
\n\n

Nach dem Ausführen des Gradle-Builds werden die Klassen generiert: HelloRequest, HelloReply, GreeterGrpc und GreeterGrpcKt (Kotlin-Version mit Coroutinen).

\n\n

Implementierung eines gRPC-Servers in Kotlin

\n\n

Der Server verwendet die generierte Klasse GreeterGrpcKt.GreeterCoroutineImplBase:

\n\n
import com.example.grpc.GreeterGrpcKt\nimport com.example.grpc.HelloReply\nimport com.example.grpc.HelloRequest\nimport io.grpc.ServerBuilder\nimport kotlinx.coroutines.runBlocking\n\nclass GreeterService : GreeterGrpcKt.GreeterCoroutineImplBase() {\n    override suspend fun sayHello(request: HelloRequest): HelloReply {\n        val message = "Hallo, ${request.name}!"\n        println("Anfrage erhalten: ${request.name}")\n        return HelloReply.newBuilder().setMessage(message).build()\n    }\n}\n\nfun main() {\n    val port = 50051\n    val server = ServerBuilder.forPort(port)\n        .addService(GreeterService())\n        .build()\n\n    server.start()\n    println("Server gestartet auf Port $port")\n    server.awaitTermination()\n}
\n\n

Implementierung eines gRPC-Clients in Kotlin

\n\n

Der Client verwendet einen Kanal und einen Stub mit Coroutinen-Unterstützung:

\n\n
import com.example.grpc.GreeterGrpcKt\ni                    

Empfehlungen