Browse Source

http4k v5 upgrade and new servers (#8267)

* v5 upgrade and new versions

* upgrade http4k library

* bump to retrigger

* use java 17 instead of java 19 for building

* use java 17 for graalvm

* use JettyLoom server from http4k instead of custom one

* downgrade to j17 to try and get things working
David Denton 2 years ago
parent
commit
ef8542129a

+ 1 - 1
frameworks/Kotlin/http4k/.java-version

@@ -1 +1 @@
-19
+20.0

+ 3 - 2
frameworks/Kotlin/http4k/README.md

@@ -16,12 +16,13 @@ The tests were run with:
 - Plaintext: http://localhost:9000/plaintext
 
 ## Supported backends (w/ Postgres client)
-- SunHttp (default - bundled with core module - zero dependencies)
+- SunHttp/SunHttpLoom (default - bundled with core module - zero dependencies)
 - Apache (5)
 - Apache4
+- Helidon (Nima)
 - KtorCIO
 - KtorNetty
-- Jetty
+- Jetty/JettyLoom
 - Netty
 - Ratpack
 - Undertow

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

@@ -1,6 +1,6 @@
 buildscript {
-    ext.kotlin_version = "1.8.10"
-    ext.http4k_version = "4.39.0.0"
+    ext.kotlin_version = "1.8.22"
+    ext.http4k_version = "5.1.1.1"
 
     repositories {
         mavenCentral()

+ 36 - 0
frameworks/Kotlin/http4k/config.toml

@@ -163,6 +163,42 @@ platform = "jetty-loom-pgclient"
 webserver = "None"
 versus = "jetty"
 
+[helidon-jdbc]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached?queries="
+approach = "Realistic"
+classification = "Micro"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "helidon-jdbc"
+webserver = "None"
+versus = "helidon-nima"
+
+[helidon-pgclient]
+urls.plaintext = "/plaintext"
+urls.json = "/json"
+urls.db = "/db"
+urls.query = "/queries?queries="
+urls.update = "/updates?queries="
+urls.fortune = "/fortunes"
+urls.cached_query = "/cached?queries="
+approach = "Realistic"
+classification = "Micro"
+database = "Postgres"
+database_os = "Linux"
+os = "Linux"
+orm = "Raw"
+platform = "helidon-pgclient"
+webserver = "None"
+versus = "helidon-nima"
+
 [apache]
 urls.plaintext = "/plaintext"
 urls.json = "/json"

+ 14 - 0
frameworks/Kotlin/http4k/helidon-jdbc/build.gradle

@@ -0,0 +1,14 @@
+dependencies {
+    api(project(":core-jdbc"))
+    api("org.http4k:http4k-server-helidon:$http4k_version")
+}
+
+apply plugin: 'application'
+mainClassName = "Http4kHelidonServerKt"
+apply plugin: 'com.github.johnrengelman.shadow'
+
+shadowJar {
+    baseName = "http4k-benchmark"
+    classifier = null
+    version = null
+}

+ 5 - 0
frameworks/Kotlin/http4k/helidon-jdbc/src/main/kotlin/Http4kHelidonServer.kt

@@ -0,0 +1,5 @@
+import org.http4k.server.Helidon
+
+fun main() {
+    Http4kBenchmarkServer(PostgresDatabase(), false).start(Helidon(9000))
+}

+ 14 - 0
frameworks/Kotlin/http4k/helidon-pgclient/build.gradle

@@ -0,0 +1,14 @@
+dependencies {
+    api(project(":core-pgclient"))
+    api("org.http4k:http4k-server-helidon:$http4k_version")
+}
+
+apply plugin: 'application'
+mainClassName = "Http4kHelidonServerKt"
+apply plugin: 'com.github.johnrengelman.shadow'
+
+shadowJar {
+    baseName = "http4k-benchmark"
+    classifier = null
+    version = null
+}

+ 5 - 0
frameworks/Kotlin/http4k/helidon-pgclient/src/main/kotlin/Http4kHelidonServer.kt

@@ -0,0 +1,5 @@
+import org.http4k.server.Helidon
+
+fun main() {
+    Http4kBenchmarkServer(PostgresDatabase(), false).start(Helidon(9000))
+}

+ 14 - 0
frameworks/Kotlin/http4k/http4k-helidon-jdbc.dockerfile

@@ -0,0 +1,14 @@
+FROM gradle:7.6-jdk19
+USER root
+WORKDIR /http4k
+COPY build.gradle build.gradle
+COPY settings.gradle settings.gradle
+COPY core core
+COPY core-jdbc core-jdbc
+COPY core-pgclient core-pgclient
+COPY helidon-jdbc helidon-jdbc
+RUN gradle --quiet --no-daemon helidon-jdbc:shadowJar
+
+EXPOSE 9000
+
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "helidon-jdbc/build/libs/http4k-benchmark.jar"]

+ 14 - 0
frameworks/Kotlin/http4k/http4k-helidon-pgclient.dockerfile

@@ -0,0 +1,14 @@
+FROM gradle:7.6-jdk19
+USER root
+WORKDIR /http4k
+COPY build.gradle build.gradle
+COPY settings.gradle settings.gradle
+COPY core core
+COPY core-jdbc core-jdbc
+COPY core-pgclient core-pgclient
+COPY helidon-pgclient helidon-pgclient
+RUN gradle --quiet --no-daemon helidon-pgclient:shadowJar
+
+EXPOSE 9000
+
+CMD ["java", "-server", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-XX:+AlwaysPreTouch", "-jar", "helidon-pgclient/build/libs/http4k-benchmark.jar"]

+ 2 - 0
frameworks/Kotlin/http4k/jettyloom-jdbc/src/main/kotlin/Http4kJettyLoomServer.kt

@@ -1,3 +1,5 @@
+import org.http4k.server.JettyLoom
+
 fun main() {
     Http4kBenchmarkServer(PostgresDatabase(), false).start(JettyLoom(9000))
 }

+ 0 - 28
frameworks/Kotlin/http4k/jettyloom-jdbc/src/main/kotlin/JettyLoom.kt

@@ -1,28 +0,0 @@
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.util.thread.QueuedThreadPool
-import org.http4k.core.HttpHandler
-import org.http4k.server.Http4kServer
-import org.http4k.server.ServerConfig
-import org.http4k.server.ServerConfig.StopMode.Graceful
-import org.http4k.server.http
-import org.http4k.server.toJettyHandler
-import java.time.Duration.ofSeconds
-import java.util.concurrent.Executors.newVirtualThreadPerTaskExecutor
-
-class JettyLoom(private val port: Int) : ServerConfig {
-    private val server = Server(QueuedThreadPool().apply {
-        virtualThreadsExecutor = newVirtualThreadPerTaskExecutor()
-    })
-
-    override val stopMode = Graceful(ofSeconds(5))
-
-    override fun toServer(http: HttpHandler) = server.run {
-        addConnector(http(port)(this))
-        insertHandler(http.toJettyHandler(true))
-        object : Http4kServer {
-            override fun start(): Http4kServer = apply { server.start() }
-            override fun stop(): Http4kServer = apply { server.stop() }
-            override fun port(): Int = if (port > 0) port else server.uri.port
-        }
-    }
-}

+ 2 - 0
frameworks/Kotlin/http4k/jettyloom-pgclient/src/main/kotlin/Http4kJettyLoomServer.kt

@@ -1,3 +1,5 @@
+import org.http4k.server.JettyLoom
+
 fun main() {
     Http4kBenchmarkServer(PostgresDatabase(), false).start(JettyLoom(9000))
 }

+ 0 - 28
frameworks/Kotlin/http4k/jettyloom-pgclient/src/main/kotlin/JettyLoom.kt

@@ -1,28 +0,0 @@
-import org.eclipse.jetty.server.Server
-import org.eclipse.jetty.util.thread.QueuedThreadPool
-import org.http4k.core.HttpHandler
-import org.http4k.server.Http4kServer
-import org.http4k.server.ServerConfig
-import org.http4k.server.ServerConfig.StopMode.Graceful
-import org.http4k.server.http
-import org.http4k.server.toJettyHandler
-import java.time.Duration.ofSeconds
-import java.util.concurrent.Executors
-
-class JettyLoom(private val port: Int) : ServerConfig {
-    private val server = Server(QueuedThreadPool().apply {
-        virtualThreadsExecutor = Executors.newVirtualThreadPerTaskExecutor()
-    })
-
-    override val stopMode = Graceful(ofSeconds(5))
-
-    override fun toServer(http: HttpHandler) = server.run {
-        addConnector(http(port)(this))
-        insertHandler(http.toJettyHandler(true))
-        object : Http4kServer {
-            override fun start(): Http4kServer = apply { server.start() }
-            override fun stop(): Http4kServer = apply { server.stop() }
-            override fun port(): Int = if (port > 0) port else server.uri.port
-        }
-    }
-}

+ 2 - 0
frameworks/Kotlin/http4k/settings.gradle

@@ -9,6 +9,8 @@ include 'graalvm'
 include 'jetty'
 include 'jettyloom-jdbc'
 include 'jettyloom-pgclient'
+include 'helidon-jdbc'
+include 'helidon-pgclient'
 include 'ktorcio'
 include 'ktornetty'
 include 'netty'

+ 1 - 27
frameworks/Kotlin/http4k/sunhttploom/src/main/kotlin/Http4kSunHttpServer.kt

@@ -1,31 +1,5 @@
-import com.sun.net.httpserver.HttpServer
-import org.http4k.core.HttpHandler
-import org.http4k.server.Http4kServer
-import org.http4k.server.HttpExchangeHandler
-import org.http4k.server.ServerConfig
-import java.net.InetSocketAddress
-import java.util.concurrent.Executors
+import org.http4k.server.SunHttpLoom
 
 fun main() {
     Http4kBenchmarkServer(PostgresDatabase()).start(SunHttpLoom(9000))
 }
-
-class SunHttpLoom(val port: Int = 8000) : ServerConfig {
-    override val stopMode: ServerConfig.StopMode = ServerConfig.StopMode.Immediate
-
-    override fun toServer(http: HttpHandler): Http4kServer = object : Http4kServer {
-        override fun port(): Int = if (port > 0) port else server.address.port
-
-        private val executor = Executors.newVirtualThreadPerTaskExecutor()
-        private val server = HttpServer.create(InetSocketAddress(port), 1000)
-        override fun start(): Http4kServer = apply {
-            server.createContext("/", HttpExchangeHandler(http))
-            server.executor = executor
-            server.start()
-        }
-
-        override fun stop() = apply {
-            server.stop(0)
-        }
-    }
-}

+ 2 - 22
frameworks/Kotlin/http4k/undertow/src/main/kotlin/Http4kUndertowServer.kt

@@ -1,25 +1,5 @@
-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
+import org.http4k.server.Undertow
 
 fun main() {
-    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(64 * Runtime.getRuntime().availableProcessors())
-            .build()
-
-        override fun start() = apply { server.start() }
-
-        override fun stop() = apply { server.stop() }
-
-        override fun port() = port
-    }
+    Http4kBenchmarkServer(PostgresDatabase()).start(Undertow(9000))
 }