gRPC для Kotlin: библиотеки и примеры использования

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

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 поддержи

Рекомендаций