gRPC для Kotlin: библиотеки и примеры использования
gRPC — это высокопроизводительный фреймворк для удалённого вызова процедур (RPC), разработанный Google. Он использует Protocol Buffers (protobuf) для сериализации данных и HTTP/2 для транспорта. В экосистеме Kotlin gRPC интегрируется особенно гладко благодаря библиотекам, поддерживающим корутины и строгую типизацию. В этой статье мы рассмотрим основные инструменты, необходимые для работы с gRPC в Kotlin, и приведём рабочие примеры сервера и клиента.
Основные библиотеки
Для работы с gRPC в Kotlin потребуется следующий стек:
- grpc-kotlin — официальная библиотека от Google, предоставляющая Kotlin-специфичные API, включая поддержку корутин (suspend-функции, Flow).
- protobuf-java и protobuf-gradle-plugin — для генерации классов из .proto файлов.
- grpc-netty или grpc-okhttp — транспортный слой (Netty для сервера, OkHttp для Android/клиента).
- javax.annotation-api — часто требуется для корректной компиляции сгенерированного кода.
Для управления зависимостями используйте Gradle (Kotlin DSL). Пример блока dependencies:
dependencies {
implementation("io.grpc:grpc-netty-shaded:1.58.0")
implementation("io.grpc:grpc-protobuf:1.58.0")
implementation("io.grpc:grpc-stub:1.58.0")
implementation("io.grpc:grpc-kotlin-stub:1.4.0")
implementation("com.google.protobuf:protobuf-java:3.24.3")
implementation("javax.annotation:javax.annotation-api:1.3.2")
}
Также обязательно подключите плагин protobuf для генерации кода:
plugins {
id("com.google.protobuf") version "0.9.4"
}
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:3.24.3"
}
plugins {
create("grpc") {
artifact = "io.grpc:protoc-gen-grpc-java:1.58.0"
}
create("grpckt") {
artifact = "io.grpc:protoc-gen-grpc-kotlin:1.4.0:jdk8@jar"
}
}
generateProtoTasks {
all().forEach {
it.plugins {
create("grpc")
create("grpckt")
}
}
}
}
Определение сервиса через .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;
}
После запуска сборки Gradle будут сгенерированы классы: HelloRequest, HelloReply, GreeterGrpc и GreeterGrpcKt (Kotlin-версия с корутинами).
Реализация gRPC сервера на Kotlin
Сервер будет использовать сгенерированный класс GreeterGrpcKt.GreeterCoroutineImplBase:
import com.example.grpc.GreeterGrpcKt
import com.example.grpc.HelloReply
import com.example.grpc.HelloRequest
import io.grpc.ServerBuilder
import kotlinx.coroutines.runBlocking
class GreeterService : GreeterGrpcKt.GreeterCoroutineImplBase() {
override suspend fun sayHello(request: HelloRequest): HelloReply {
val message = "Привет, ${request.name}!"
println("Получен запрос: ${request.name}")
return HelloReply.newBuilder().setMessage(message).build()
}
}
fun main() {
val port = 50051
val server = ServerBuilder.forPort(port)
.addService(GreeterService())
.build()
server.start()
println("Сервер запущен на порту $port")
server.awaitTermination()
}
Реализация gRPC клиента на Kotlin
Клиент использует канал и stub с поддержкой корутин:
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(channel)
val request = HelloRequest.newBuilder().setName("Kotlin").build()
val response = stub.sayHello(request)
println("Ответ от сервера: ${response.message}")
channel.shutdown()
}
Поддержка стриминга
gRPC поддержи