Kotlin spring server demo - reactive/webflux server to handle i/o. (Tomcat -> Netty) + grpc client.
dependencies
build.gradle.kts - dependencies
implementation("org.jetbrains.kotlin:kotlin-reflect")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$kotlinXCoroutineVersion")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-jdk8:$kotlinXCoroutineVersion")
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-reactor:$kotlinXCoroutineVersion")
implementation("org.jetbrains.kotlinx:kotlinx-serialization-json:$kotlinXSerializationVersion")
implementation("io.projectreactor.kotlin:reactor-kotlin-extensions:1.2.2")
testImplementation("io.projectreactor:reactor-test:3.5.6")
testImplementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:$kotlinXCoroutineVersion")
dependencies
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
implementation("org.springframework:spring-context")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-webflux")
testImplementation("org.springframework.boot:spring-boot-starter-test")
Armeria - light msa framework on Netty, grpc, thrift. RestAPI/gRPC/Throft can be supported on single port.
-> maybe just webflux is okay?
dependencies
// Armeria
implementation(platform("com.linecorp.armeria:armeria-bom:1.19.0"))
implementation(platform("io.netty:netty-bom:4.1.79.Final"))
implementation("com.linecorp.armeria:armeria-kotlin")
implementation("com.linecorp.armeria:armeria-spring-boot2-webflux-starter")
testImplementation("com.ninja-squad:springmockk:3.1.1")
dependencies
//GRPC
implementation("com.linecorp.armeria:armeria-grpc-protocol")
implementation("com.linecorp.armeria:armeria-grpc")
implementation("com.google.protobuf:protobuf-java:${protobufVersion}")
implementation("com.google.protobuf:protobuf-kotlin:${protobufVersion}")
implementation("io.grpc:grpc-protobuf:${grpcVersion}")
implementation("io.grpc:grpc-stub:${grpcVersion}")
implementation("io.grpc:grpc-netty-shaded:${grpcVersion}")
api("io.grpc:grpc-kotlin-stub:${grpcKotlinVersion}")
others
buildscript {
dependencies {
classpath("com.google.protobuf:protobuf-gradle-plugin:0.9.3")
}
}
...
protobuf {
protoc {
artifact = "com.google.protobuf:protoc:${protobufVersion}"
}
plugins {
id("grpc") {
artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}"
}
id("grpckt") {
artifact = "io.grpc:protoc-gen-grpc-kotlin:${grpcKotlinVersion}:jdk8@jar"
}
}
generateProtoTasks {
all().forEach {
it.plugins {
id("grpc")
id("grpckt")
}
it.builtins {
id("kotlin")
}
}
}
sourceSets{
main{
proto {
srcDir("../proto")
}
java {
srcDir("build/generated/source/proto/main/java")
srcDir("build/generated/source/proto/main/kotlin")
}
}
}
}
Logging
Problem: In webflux, request body type is Flux, one it is read then it cannot be read again. -> read for logging then 400 bad request will happen.
implementation("net.logstash.logback:logstash-logback-encoder:6.6")