Browse Source

http4k- upgrade http4k, java, gradle, simplify jetty loom server, tweak undertow workers (#7896)

* http4k- upgrade http4k, java, gradle
simplify jetty loom server
use custom undertow with more worker threads/cpu

* pin versions of images in Graal dockerfiles
David Denton 2 years ago
parent
commit
d151cf2d96

+ 3 - 3
frameworks/Kotlin/http4k/build.gradle

@@ -1,6 +1,6 @@
 buildscript {
 buildscript {
-    ext.kotlin_version = "1.7.22"
-    ext.http4k_version = "4.34.2.0"
+    ext.kotlin_version = "1.8.10"
+    ext.http4k_version = "4.37.0.0"
 
 
     repositories {
     repositories {
         mavenCentral()
         mavenCentral()
@@ -28,5 +28,5 @@ allprojects {
     version = project.hasProperty('releaseVersion') ? project.releaseVersion : 'LOCAL'
     version = project.hasProperty('releaseVersion') ? project.releaseVersion : 'LOCAL'
     group = 'org.http4k'
     group = 'org.http4k'
 
 
-    compileTestKotlin.kotlinOptions.languageVersion = "1.7"
+    compileTestKotlin.kotlinOptions.languageVersion = "1.8"
 }
 }

+ 1 - 1
frameworks/Kotlin/http4k/gradle/wrapper/gradle-wrapper.properties

@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.1.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
 zipStorePath=wrapper/dists

+ 2 - 2
frameworks/Kotlin/http4k/http4k-apache-graalvm.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17 as gradle
+FROM gradle:7.6-jdk19 as gradle
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle
@@ -26,7 +26,7 @@ RUN native-image \
     --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \
     --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \
     --no-fallback -cp http4k-benchmark.jar http4k.Http4kGraalVMBenchmarkServerKt
     --no-fallback -cp http4k-benchmark.jar http4k.Http4kGraalVMBenchmarkServerKt
 
 
-FROM frolvlad/alpine-glibc
+FROM frolvlad/alpine-glibc:glibc-2.34
 RUN apk update && apk add libstdc++
 RUN apk update && apk add libstdc++
 EXPOSE 9000
 EXPOSE 9000
 COPY --from=graalvm /home/app/http4k-apache-graalvm/http4k.http4kgraalvmbenchmarkserverkt /app/http4k-apache-graalvm
 COPY --from=graalvm /home/app/http4k-apache-graalvm/http4k.http4kgraalvmbenchmarkserverkt /app/http4k-apache-graalvm

+ 1 - 1
frameworks/Kotlin/http4k/http4k-apache.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k-apache4.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 2 - 2
frameworks/Kotlin/http4k/http4k-graalvm.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17 as gradle
+FROM gradle:7.6-jdk19 as gradle
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle
@@ -26,7 +26,7 @@ RUN native-image \
     --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \
     --initialize-at-build-time="org.slf4j.LoggerFactory,org.slf4j.simple.SimpleLogger,org.slf4j.impl.StaticLoggerBinder" \
     --no-fallback -cp http4k-benchmark.jar http4k.Http4kGraalVMBenchmarkServerKt
     --no-fallback -cp http4k-benchmark.jar http4k.Http4kGraalVMBenchmarkServerKt
 
 
-FROM frolvlad/alpine-glibc
+FROM frolvlad/alpine-glibc:glibc-2.34
 RUN apk update && apk add libstdc++
 RUN apk update && apk add libstdc++
 EXPOSE 9000
 EXPOSE 9000
 COPY --from=graalvm /home/app/http4k-graalvm/http4k.http4kgraalvmbenchmarkserverkt /app/http4k-graalvm
 COPY --from=graalvm /home/app/http4k-graalvm/http4k.http4kgraalvmbenchmarkserverkt /app/http4k-graalvm

+ 1 - 1
frameworks/Kotlin/http4k/http4k-jetty.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k-ktorcio.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k-ktornetty.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k-netty.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k-ratpack.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k-undertow.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 1 - 1
frameworks/Kotlin/http4k/http4k.dockerfile

@@ -1,4 +1,4 @@
-FROM gradle:7.6-jdk17
+FROM gradle:7.6-jdk19
 USER root
 USER root
 WORKDIR /http4k
 WORKDIR /http4k
 COPY build.gradle build.gradle
 COPY build.gradle build.gradle

+ 6 - 25
frameworks/Kotlin/http4k/jettyloom-jdbc/src/main/kotlin/JettyLoom.kt

@@ -1,5 +1,5 @@
-import org.eclipse.jetty.server.*
-import org.eclipse.jetty.util.thread.ThreadPool
+import org.eclipse.jetty.server.Server
+import org.eclipse.jetty.util.thread.QueuedThreadPool
 import org.http4k.core.HttpHandler
 import org.http4k.core.HttpHandler
 import org.http4k.server.Http4kServer
 import org.http4k.server.Http4kServer
 import org.http4k.server.ServerConfig
 import org.http4k.server.ServerConfig
@@ -7,12 +7,12 @@ import org.http4k.server.ServerConfig.StopMode.Graceful
 import org.http4k.server.http
 import org.http4k.server.http
 import org.http4k.server.toJettyHandler
 import org.http4k.server.toJettyHandler
 import java.time.Duration.ofSeconds
 import java.time.Duration.ofSeconds
-import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit.NANOSECONDS
-import kotlin.Long.Companion.MAX_VALUE
+import java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor
 
 
 class JettyLoom(private val port: Int) : ServerConfig {
 class JettyLoom(private val port: Int) : ServerConfig {
-    private val server = Server(LoomThreadPool())
+    private val server = Server(QueuedThreadPool().apply {
+        virtualThreadsExecutor = newVirtualThreadPerTaskExecutor()
+    })
 
 
     override val stopMode = Graceful(ofSeconds(5))
     override val stopMode = Graceful(ofSeconds(5))
 
 
@@ -26,22 +26,3 @@ class JettyLoom(private val port: Int) : ServerConfig {
         }
         }
     }
     }
 }
 }
-
-class LoomThreadPool : ThreadPool {
-    private val executorService = Executors.newVirtualThreadPerTaskExecutor()
-
-    @Throws(InterruptedException::class)
-    override fun join() {
-        executorService.awaitTermination(MAX_VALUE, NANOSECONDS)
-    }
-
-    override fun getThreads() = 1
-
-    override fun getIdleThreads() = 1
-
-    override fun isLowOnThreads() = false
-
-    override fun execute(command: Runnable) {
-        executorService.submit(command)
-    }
-}

+ 5 - 24
frameworks/Kotlin/http4k/jettyloom-pgclient/src/main/kotlin/JettyLoom.kt

@@ -1,5 +1,5 @@
-import org.eclipse.jetty.server.*
-import org.eclipse.jetty.util.thread.ThreadPool
+import org.eclipse.jetty.server.Server
+import org.eclipse.jetty.util.thread.QueuedThreadPool
 import org.http4k.core.HttpHandler
 import org.http4k.core.HttpHandler
 import org.http4k.server.Http4kServer
 import org.http4k.server.Http4kServer
 import org.http4k.server.ServerConfig
 import org.http4k.server.ServerConfig
@@ -8,11 +8,11 @@ import org.http4k.server.http
 import org.http4k.server.toJettyHandler
 import org.http4k.server.toJettyHandler
 import java.time.Duration.ofSeconds
 import java.time.Duration.ofSeconds
 import java.util.concurrent.Executors
 import java.util.concurrent.Executors
-import java.util.concurrent.TimeUnit.NANOSECONDS
-import kotlin.Long.Companion.MAX_VALUE
 
 
 class JettyLoom(private val port: Int) : ServerConfig {
 class JettyLoom(private val port: Int) : ServerConfig {
-    private val server = Server(LoomThreadPool())
+    private val server = Server(QueuedThreadPool().apply {
+        virtualThreadsExecutor = Executors.newVirtualThreadPerTaskExecutor()
+    })
 
 
     override val stopMode = Graceful(ofSeconds(5))
     override val stopMode = Graceful(ofSeconds(5))
 
 
@@ -26,22 +26,3 @@ class JettyLoom(private val port: Int) : ServerConfig {
         }
         }
     }
     }
 }
 }
-
-class LoomThreadPool : ThreadPool {
-    private val executorService = Executors.newVirtualThreadPerTaskExecutor()
-
-    @Throws(InterruptedException::class)
-    override fun join() {
-        executorService.awaitTermination(MAX_VALUE, NANOSECONDS)
-    }
-
-    override fun getThreads() = 1
-
-    override fun getIdleThreads() = 1
-
-    override fun isLowOnThreads() = false
-
-    override fun execute(command: Runnable) {
-        executorService.submit(command)
-    }
-}

+ 23 - 3
frameworks/Kotlin/http4k/undertow/src/main/kotlin/Http4kUndertowServer.kt

@@ -1,5 +1,25 @@
-import org.http4k.server.Undertow
+import io.undertow.server.handlers.BlockingHandler
+import org.http4k.core.HttpHandler
+import org.http4k.server.Http4kServer
+import org.http4k.server.Http4kUndertowHttpHandler
+import org.http4k.server.ServerConfig
 
 
 fun main() {
 fun main() {
-    Http4kBenchmarkServer(PostgresDatabase()).start(Undertow(9000))
-}
+    Http4kBenchmarkServer(PostgresDatabase()).start(CustomUndertow(9000))
+}
+
+private fun CustomUndertow(port: Int) = object : ServerConfig {
+    override fun toServer(http: HttpHandler) = object : Http4kServer {
+        val server = io.undertow.Undertow.builder()
+            .addHttpListener(port, "0.0.0.0")
+            .setHandler(BlockingHandler(Http4kUndertowHttpHandler(http)))
+            .setWorkerThreads(32 * Runtime.getRuntime().availableProcessors())
+            .build()
+
+        override fun start() = apply { server.start() }
+
+        override fun stop() = apply { server.stop() }
+
+        override fun port() = port
+    }
+}