gRPC для Kotlin: библиотеки и примеры
gRPC — это высокопроизводительный фреймворк для удалённого вызова процедур (RPC), разработанный Google. Он использует Protocol Buffers (protobuf) для сериализации данных и HTTP/2 для транспорта. В экосистеме Kotlin gRPC отлично интегрируется с корутинами, что делает его идеальным выбором для создания асинхронных микросервисов.
В этой статье мы разберём, как настроить gRPC-сервер и клиент на Kotlin с помощью официальной библиотеки gRPC-Kotlin (grpc-kotlin). Вы увидите полный цикл: от описания proto-файла до запуска и тестирования.
1. Основные библиотеки
Для работы с gRPC в Kotlin используются следующие ключевые компоненты:
- protobuf-gradle-plugin — плагин для компиляции
.protoфайлов в Kotlin/Java классы. - grpc-kotlin-stub — библиотека, генерирующая Kotlin-корутинные стабы (suspend-функции).
- grpc-netty-shaded — транспортный слой на основе Netty (встроенный HTTP/2).
- grpc-protobuf-lite — лёгкая версия protobuf для Android/клиентов.
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-файла
Создайте hello.proto в src/main/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.GreeterGrpcKt
import com.example.grpc.HelloReply
import com.example.grpc.HelloRequest
import 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.example.grpc.GreeterGrpcKt
import com.example.grpc.HelloRequest
import io.grpc.ManagedChannelBuilder
import kotlinx.coroutines.runBlocking
fun main() = runBlocking {
val channel = ManagedChannelBuilder.forAddress("localhost", 50051)
.usePlaintext()
.build()
val stub = GreeterGrpcKt.GreeterCoroutineStub