Kora фреймворк для написания Java / Kotlin приложений с упором на производительность, эффективность, прозрачность сделанный разработчиками Т-Банк / Тинькофф

Kora is a framework for writing Java / Kotlin applications with a focus on performance, efficiency, transparency made by T-Bank / Tinkoff developers

Перейти к содержанию

gRPC клиент

Модуль для подключения gRPC клиентов на основе функционала grpc.io

Подключение

Зависимость build.gradle:

implementation "ru.tinkoff.kora:grpc-client"
implementation "io.grpc:grpc-protobuf:1.62.2"
implementation "javax.annotation:javax.annotation-api:1.3.2"

Модуль:

@KoraApp
public interface Application extends GrpcClientModule { }

Зависимость build.gradle.kts:

implementation("ru.tinkoff.kora:grpc-client")
implementation("io.grpc:grpc-protobuf:1.62.2")
implementation("javax.annotation:javax.annotation-api:1.3.2")

Модуль:

@KoraApp
interface Application : GrpcClientModule

Плагин

Код для gRPC-клиента создается с помощью protobuf gradle plugin.

Плагин build.gradle:

plugins {
    id "com.google.protobuf" version "0.9.4"
}

protobuf {
    protoc { artifact = "com.google.protobuf:protoc:3.25.3" }
    plugins {
        grpc { artifact = "io.grpc:protoc-gen-grpc-java:1.62.2" }
    }
    generateProtoTasks {
        all()*.plugins { grpc {} }
    }
}

sourceSets {
    main.java {
        srcDirs "build/generated/source/proto/main/grpc"
        srcDirs "build/generated/source/proto/main/java"
    }
}

Плагин build.gradle.kts:

import com.google.protobuf.gradle.id

plugins {
    id("com.google.protobuf") version ("0.9.4")
}

protobuf {
    protoc { artifact = "com.google.protobuf:protoc:3.25.3" }
    plugins {
        id("grpc") { artifact = "io.grpc:protoc-gen-grpc-java:1.62.2" }
    }
    generateProtoTasks {
        ofSourceSet("main").forEach { it.plugins { id("grpc") { } } }
    }
}

kotlin {
    sourceSets.main {
        kotlin.srcDir("build/generated/source/proto/main/grpc")
        kotlin.srcDir("build/generated/source/proto/main/java")
    }
}

Конфигурация

Сервис gRPC с именем SimpleService будет иметь конфигурацию с путем grpcClient.SimpleService.

Пример полной конфигурации, описанной в классе GrpcClientConfig (указаны примеры значений или значения по умолчанию):

grpcClient {
    SimpleService {
        url = "grpc://localhost:8090" //(1)!
        timeout = "10s"  //(2)!
        telemetry {
            logging {
                enabled = false //(3)!
            }
            metrics {
                enabled = true //(4)!
                slo = [ 1, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000, 90000 ] //(5)!
            }
            tracing {
                enabled = true //(6)!
            }
        }
    }
}
  1. URL сервера куда делать запросы (обязательный)
  2. Максимальное время запроса (по умолчанию отсутвует)
  3. Включает логгирование модуля (по умолчанию false)
  4. Включает метрики модуля (по умолчанию true)
  5. Настройка SLO для DistributionSummary метрики
  6. Включает трассировку модуля (по умолчанию true)
grpcClient:
  SimpleService:
    url: "grpc://localhost:8090" //(1)!
    timeout: "10s" //(2)!
    telemetry:
      logging:
        enabled: false #(1)!
      metrics:
        enabled: true #(2)!
        slo: [ 1, 10, 50, 100, 200, 500, 1000, 2000, 5000, 10000, 20000, 30000, 60000, 90000 ] #(3)!
      telemetry:
        enabled: true #(4)!
  1. URL сервера куда делать запросы (обязательный)
  2. Максимальное время запроса (по умолчанию отсутвует)
  3. Включает логгирование модуля (по умолчанию false)
  4. Включает метрики модуля (по умолчанию true)
  5. Настройка SLO для DistributionSummary метрики
  6. Включает трассировку модуля (по умолчанию true)

Можно также настроить Netty транспорт.

Сервис

Созданные gRPC сервисы можно внедрять как зависимости:

@KoraApp
public interface Application extends HoconConfigModule, GrpcClientModule {

    default SomeService(SimpleServiceGrpc.SimpleServiceBlockingStub grpcService) {
        return new SomeService(grpcService);
    }
}
@KoraApp
interface Application : HoconConfigModule, GrpcClientModule {
    fun SomeService(grpcService: SimpleServiceGrpc.SimpleServiceBlockingStub?) {
        return SomeService(grpcService)
    }
}

Перехватчики

Перехватчики позволяют перехватывать запросы перед тем, как они будут переданы сервисам.

Стандартные

При запуске клиента по-умолчанию используются следующие перехватчики:

  • GrpcClientConfigInterceptor

Собственные

Для добавления собственного перехватчика требуется зарегистрировать перехватчика как компонент с тегом сервиса.

@Tag(SimpleServiceGrpc.class)
@Component
public final class MyClientInterceptor implements ClientInterceptor {
    @Override
    public <ReqT, RespT> ClientCall<ReqT, RespT> interceptCall(MethodDescriptor<ReqT, RespT> method, CallOptions callOptions, Channel next) {
        LoggerFactory.getLogger(Application.class).info("INTERCEPTED");
        return next.newCall(method, callOptions);
    }
}
@Tag(SimpleServiceGrpc::class)
@Component
class MyClientInterceptor : ClientInterceptor {
    fun <ReqT, RespT> interceptCall(
        method: MethodDescriptor<ReqT, RespT>,
        callOptions: CallOptions,
        next: Channel
    ): ClientCall<ReqT, RespT> {
        return next.newCall(method, callOptions)
    }
}

Либо можно модифицировать сервис посредствам GraphInterceptor.