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

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

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

Начать курс

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                    

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