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"
Модуль:
Зависимость 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")
Модуль:
Плагин¶
Код для 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)!
}
}
}
}
- URL сервера куда делать запросы (обязательный)
- Максимальное время запроса (по умолчанию отсутвует)
- Включает логгирование модуля (по умолчанию
false
) - Включает метрики модуля (по умолчанию
true
) - Настройка SLO для DistributionSummary метрики
- Включает трассировку модуля (по умолчанию
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)!
- URL сервера куда делать запросы (обязательный)
- Максимальное время запроса (по умолчанию отсутвует)
- Включает логгирование модуля (по умолчанию
false
) - Включает метрики модуля (по умолчанию
true
) - Настройка SLO для DistributionSummary метрики
- Включает трассировку модуля (по умолчанию
true
)
Можно также настроить Netty транспорт.
Сервис¶
Созданные gRPC сервисы можно внедрять как зависимости:
Перехватчики¶
Перехватчики позволяют перехватывать запросы перед тем, как они будут переданы сервисам.
Стандартные¶
При запуске клиента по-умолчанию используются следующие перехватчики:
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);
}
}
Либо можно модифицировать сервис посредствам GraphInterceptor.