gRPC 用于 Kotlin:库、服务器和客户端 — 代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

gRPC 用于 Kotlin:库和示例



gRPC 是一个高性能的远程过程调用 (RPC) 框架,由 Google 开发。它使用 Protocol Buffers (protobuf) 进行数据序列化,并使用 HTTP/2 进行传输。在 Kotlin 生态系统中,gRPC 与协程完美集成,使其成为构建异步微服务的理想选择。



在本文中,我们将介绍如何使用官方库 gRPC-Kotlin (grpc-kotlin) 在 Kotlin 中设置 gRPC 服务器和客户端。您将看到完整的流程:从描述 proto 文件到启动和测试。



1. 主要库



在 Kotlin 中使用 gRPC 需要以下关键组件:



  • protobuf-gradle-plugin — 用于将 .proto 文件编译为 Kotlin/Java 类的插件。
  • grpc-kotlin-stub — 生成 Kotlin 协程存根(suspend 函数)的库。
  • grpc-netty-shaded — 基于 Netty 的传输层(内置 HTTP/2)。
  • grpc-protobuf-lite — 适用于 Android/客户端的轻量级 protobuf 版本。


2. 项目结构



我们将使用 Gradle (Kotlin DSL)。创建一个具有以下结构的项目:



my-grpc-app/├── build.gradle.kts├── settings.gradle.kts└── src/    ├── main/    │   ├── proto/    │   │   └── hello.proto    │   └── kotlin/    │       ├── server/    │       │   └── HelloServer.kt    │       └── client/    │           └── HelloClient.kt


3. 描述 proto 文件



在 src/main/proto/ 中创建 hello.proto:



syntax = "proto3";

package com.example.grpc;

service Greeter { rpc SayHello (HelloRequest) returns (HelloReply);}

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


4. 配置 Gradle (build.gradle.kts)



添加必要的插件和依赖项:



plugins {    id("org.jetbrains.kotlin.jvm") version "1.9.22"    id("com.google.protobuf") version "0.9.4"}

repositories { mavenCentral()}

dependencies { implementation("io.grpc:grpc-kotlin-stub:1.4.1") implementation("io.grpc:grpc-netty-shaded:1.60.0") implementation("io.grpc:grpc-protobuf-lite:1.60.0")}

protobuf { protoc { artifact = "com.google.protobuf:protoc:3.25.1" } plugins { create("grpc") { artifact = "io.grpc:protoc-gen-grpc-java:1.60.0" } create("grpckt") { artifact = "io.grpc:protoc-gen-grpc-kotlin:1.4.1:jdk8@jar" } } generateProtoTasks { all().forEach { task -> task.plugins { create("grpc") { } create("grpckt") { } } } }}


5. 实现 gRPC 服务器



创建文件 HelloServer.kt:



package com.example.server

import com.example.grpc.GreeterGrpcKtimport com.example.grpc.HelloReplyimport com.example.grpc.HelloRequestimport io.grpc.ServerBuilder

class GreeterService : GreeterGrpcKt.GreeterCoroutineImplBase() { override suspend fun sayHello(request: HelloRequest): HelloReply { println("收到来自: ${request.name} 的请求") return HelloReply.newBuilder() .setMessage("你好, ${request.name}!") .build() }}

fun main() { val port = 50051 val server = ServerBuilder.forPort(port) .addService(GreeterService()) .build() .start()

println("gRPC 服务器已在端口 $port 上启动") server.awaitTermination()}


6. 实现 gRPC 客户端



创建文件 HelloClient.kt:



package com.example.client

import com

推荐