Browse Source

upgrade http4k and associated API changes (#2948)

* upgrade http4k and associated API changes

* slight rejig of routes

* removing database routes in order to detect what is going on with the various implementations. Also switching ports to vary between implementations

* removing netty and undertow implementations whilst we investigate

* split out various benchmarks into separate JARs

* Upgrade http4k version
David Denton 8 years ago
parent
commit
fbf6ff6c03

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

@@ -4,7 +4,7 @@
 The tests were run with:
 The tests were run with:
 
 
 * [Java Oracle 1.8.0_25](http://www.oracle.com/technetwork/java/javase)
 * [Java Oracle 1.8.0_25](http://www.oracle.com/technetwork/java/javase)
-* [http4k](https://github.com/http4k/http4k)
+* [http4k](https://http4k.org)
 
 
 ## Test URLs
 ## Test URLs
 
 
@@ -13,8 +13,6 @@ The tests were run with:
 
 
 ## Supported backends
 ## Supported backends
 - Jetty
 - Jetty
-- Netty
-- Undertow
 
 
 ## How to run
 ## How to run
 ```bash
 ```bash

+ 0 - 50
frameworks/Kotlin/http4k/benchmark_config.json

@@ -25,56 +25,6 @@
         "notes": "",
         "notes": "",
         "versus": "servlet"
         "versus": "servlet"
       }
       }
-    },
-    {
-      "netty": {
-        "setup_file": "setup_netty",
-        "orm": "Raw",
-        "database_os": "Linux",
-        "db_url": "/db",
-        "fortune_url": "/fortunes",
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "database": "postgres",
-        "json_url": "/json",
-        "plaintext_url": "/plaintext",
-        "port": 9000,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "framework": "http4k",
-        "language": "Kotlin",
-        "platform": "netty",
-        "webserver": "None",
-        "os": "Linux",
-        "display_name": "http4k-netty",
-        "notes": "",
-        "versus": "netty"
-      }
-    },
-    {
-      "undertow": {
-        "setup_file": "setup_undertow",
-        "orm": "Raw",
-        "database_os": "Linux",
-        "db_url": "/db",
-        "fortune_url": "/fortunes",
-        "query_url": "/queries?queries=",
-        "update_url": "/updates?queries=",
-        "database": "postgres",
-        "json_url": "/json",
-        "plaintext_url": "/plaintext",
-        "port": 9000,
-        "approach": "Realistic",
-        "classification": "Micro",
-        "framework": "http4k",
-        "language": "Kotlin",
-        "platform": "undertow",
-        "webserver": "None",
-        "os": "Linux",
-        "display_name": "http4k-undertow",
-        "notes": "",
-        "versus": "undertow"
-      }
     }
     }
   ]
   ]
 }
 }

+ 30 - 28
frameworks/Kotlin/http4k/build.gradle

@@ -1,6 +1,7 @@
 buildscript {
 buildscript {
-    ext.kotlin_version = "1.1.2-4"
-    ext.http4k_version = "2.2.1"
+    ext.kotlin_version = "1.1.4"
+    ext.http4k_version = "2.25.4"
+
     repositories {
     repositories {
         mavenCentral()
         mavenCentral()
         jcenter()
         jcenter()
@@ -12,37 +13,38 @@ buildscript {
     }
     }
 }
 }
 
 
-repositories {
-    mavenCentral()
-    jcenter()
+plugins {
+    id "com.jfrog.bintray" version "1.7.3"
+    id 'net.saliman.cobertura' version '2.4.0'
+    id 'com.github.kt3k.coveralls' version '2.8.1'
 }
 }
 
 
-apply plugin: "kotlin"
-apply plugin: 'gradle-one-jar'
+allprojects {
 
 
-sourceCompatibility = JavaVersion.VERSION_1_8
-targetCompatibility = JavaVersion.VERSION_1_8
+    repositories {
+        mavenCentral()
+        jcenter()
+    }
 
 
-dependencies {
-    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
-    compile "org.http4k:http4k-core:$http4k_version"
-    compile "org.http4k:http4k-format-jackson:$http4k_version"
-    compile "org.http4k:http4k-server-jetty:$http4k_version"
-    compile "org.http4k:http4k-server-netty:$http4k_version"
-    compile "org.http4k:http4k-server-undertow:$http4k_version"
-    compile "org.http4k:http4k-template-handlebars:$http4k_version"
-    compile "org.apache.commons:commons-lang3:3.5"
-    compile "com.zaxxer:HikariCP:2.6.1"
-    compile "org.postgresql:postgresql:42.0.0"
-}
+    apply plugin: "kotlin"
+    apply plugin: 'gradle-one-jar'
+
+    sourceCompatibility = JavaVersion.VERSION_1_8
+    targetCompatibility = JavaVersion.VERSION_1_8
+
+    version = project.hasProperty('releaseVersion') ? project.releaseVersion : 'LOCAL'
+    group = 'org.http4k'
 
 
-task jetty(type: OneJar) {
-    mainClass = 'Http4kJettyServerKt'
+    compileTestKotlin {
+        kotlinOptions {
+            languageVersion = "1.1"
+        }
+    }
 }
 }
 
 
-task netty(type: OneJar) {
-    mainClass = 'Http4kNettyServerKt'
+dependencies {
+    compile project(":core")
+    compile project(":jetty")
+    compile project(":netty")
+    compile project(":undertow")
 }
 }
-task undertow(type: OneJar) {
-    mainClass = 'Http4kUndertowServerKt'
-}

+ 9 - 0
frameworks/Kotlin/http4k/core/build.gradle

@@ -0,0 +1,9 @@
+dependencies {
+    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
+    compile "org.http4k:http4k-core:$http4k_version"
+    compile "org.http4k:http4k-format-jackson:$http4k_version"
+    compile "org.http4k:http4k-template-handlebars:$http4k_version"
+    compile "org.apache.commons:commons-lang3:3.5"
+    compile "com.zaxxer:HikariCP:2.6.1"
+    compile "org.postgresql:postgresql:42.0.0"
+}

+ 0 - 0
frameworks/Kotlin/http4k/src/main/kotlin/Database.kt → frameworks/Kotlin/http4k/core/src/main/kotlin/Database.kt


+ 1 - 2
frameworks/Kotlin/http4k/src/main/kotlin/FortunesRoute.kt → frameworks/Kotlin/http4k/core/src/main/kotlin/FortunesRoute.kt

@@ -4,7 +4,6 @@ import org.http4k.core.Method.GET
 import org.http4k.core.Response
 import org.http4k.core.Response
 import org.http4k.core.Status.Companion.OK
 import org.http4k.core.Status.Companion.OK
 import org.http4k.core.with
 import org.http4k.core.with
-import org.http4k.routing.Route
 import org.http4k.routing.bind
 import org.http4k.routing.bind
 import org.http4k.template.HandlebarsTemplates
 import org.http4k.template.HandlebarsTemplates
 import org.http4k.template.ViewModel
 import org.http4k.template.ViewModel
@@ -18,7 +17,7 @@ object FortunesRoute {
 
 
     private val viewBody = Body.view(HandlebarsTemplates().CachingClasspath(), TEXT_HTML)
     private val viewBody = Body.view(HandlebarsTemplates().CachingClasspath(), TEXT_HTML)
 
 
-    operator fun invoke(database: Database): Route = "/fortunes" to GET bind {
+    operator fun invoke(database: Database) = "/fortunes" bind GET to {
         val items = database.withConnection {
         val items = database.withConnection {
             it.prepareStatement("select * from fortune").executeQuery().toList {
             it.prepareStatement("select * from fortune").executeQuery().toList {
                 Fortune(it.getInt(1), it.getString(2))
                 Fortune(it.getInt(1), it.getString(2))

+ 12 - 11
frameworks/Kotlin/http4k/src/main/kotlin/Http4kBenchmarkServer.kt → frameworks/Kotlin/http4k/core/src/main/kotlin/Http4kBenchmarkServer.kt

@@ -9,24 +9,25 @@ import java.util.TimeZone.getTimeZone
 object Http4kBenchmarkServer {
 object Http4kBenchmarkServer {
     private val dateFormat = getInstance("EEE, d MMM yyyy HH:mm:ss 'GMT'", getTimeZone("GMT"))
     private val dateFormat = getInstance("EEE, d MMM yyyy HH:mm:ss 'GMT'", getTimeZone("GMT"))
 
 
-    private val headers = Filter {
-        next ->
+    private val headers = Filter { next ->
         {
         {
             next(it).let {
             next(it).let {
                 it
                 it
-                    .header("Server", "Example")
+                    .header("Server", "http4k")
                     .header("Date", dateFormat.format(System.currentTimeMillis()))
                     .header("Date", dateFormat.format(System.currentTimeMillis()))
                     .header("Content-Length", it.body.payload.remaining().toString())
                     .header("Content-Length", it.body.payload.remaining().toString())
             }
             }
         }
         }
     }
     }
 
 
-    private val database = Database(System.getenv("DBHOST") ?: "localhost")
-
-    val routes = listOf(PlainTextRoute(),
-        JsonRoute(),
-        FortunesRoute(database)
-    ).plus(WorldRoutes(database))
-
-    fun start(config: ServerConfig) = headers.then(routes(*routes.toTypedArray())).asServer(config).start().block()
+    fun start(config: ServerConfig) = headers.then(
+        routes(
+            JsonRoute(),
+            PlainTextRoute()
+//            FortunesRoute(database),
+//            WorldRoutes.queryRoute(database),
+//            WorldRoutes.updateRoute(database),
+//            WorldRoutes.multipleRoute(database)
+        )
+    ).asServer(config).start().block()
 }
 }

+ 6 - 0
frameworks/Kotlin/http4k/core/src/main/kotlin/Http4kSunHttpServer.kt

@@ -0,0 +1,6 @@
+
+import org.http4k.server.SunHttp
+
+fun main(args: Array<String>) {
+    Http4kBenchmarkServer.start(SunHttp(9000))
+}

+ 1 - 1
frameworks/Kotlin/http4k/src/main/kotlin/JsonRoute.kt → frameworks/Kotlin/http4k/core/src/main/kotlin/JsonRoute.kt

@@ -11,5 +11,5 @@ import org.http4k.routing.bind
 object JsonRoute {
 object JsonRoute {
     private val jsonBody = Body.json().toLens()
     private val jsonBody = Body.json().toLens()
 
 
-    operator fun invoke() = "/json" to GET bind { Response(OK).with(jsonBody of obj("message" to string("Hello, World!"))) }
+    operator fun invoke() = "/json" bind GET to { Response(OK).with(jsonBody of obj("message" to string("Hello, World!"))) }
 }
 }

+ 1 - 1
frameworks/Kotlin/http4k/src/main/kotlin/PlainTextRoute.kt → frameworks/Kotlin/http4k/core/src/main/kotlin/PlainTextRoute.kt

@@ -13,5 +13,5 @@ object PlainTextRoute {
 
 
     private val plainTextBody = Body.binary(TEXT_PLAIN).toLens()
     private val plainTextBody = Body.binary(TEXT_PLAIN).toLens()
 
 
-    operator fun invoke() = "/plaintext" to GET bind { Response(OK).with(plainTextBody of preAllocatedHelloWorldText) }
+    operator fun invoke() = "/plaintext" bind GET to { Response(OK).with(plainTextBody of preAllocatedHelloWorldText) }
 }
 }

+ 4 - 11
frameworks/Kotlin/http4k/src/main/kotlin/WorldRoutes.kt → frameworks/Kotlin/http4k/core/src/main/kotlin/WorldRoutes.kt

@@ -1,3 +1,4 @@
+
 import com.fasterxml.jackson.databind.JsonNode
 import com.fasterxml.jackson.databind.JsonNode
 import org.http4k.core.Body
 import org.http4k.core.Body
 import org.http4k.core.Method.GET
 import org.http4k.core.Method.GET
@@ -10,7 +11,6 @@ import org.http4k.format.Jackson.json
 import org.http4k.format.Jackson.number
 import org.http4k.format.Jackson.number
 import org.http4k.format.Jackson.obj
 import org.http4k.format.Jackson.obj
 import org.http4k.lens.Query
 import org.http4k.lens.Query
-import org.http4k.routing.Route
 import org.http4k.routing.bind
 import org.http4k.routing.bind
 import java.lang.Math.max
 import java.lang.Math.max
 import java.lang.Math.min
 import java.lang.Math.min
@@ -34,20 +34,13 @@ object WorldRoutes {
         }
         }
         .defaulted("queries", 1)
         .defaulted("queries", 1)
 
 
-    operator fun invoke(database: Database): List<Route> =
-        listOf(
-            queryRoute(database),
-            multipleRoute(database),
-            updateRoute(database)
-        )
-
-    private fun queryRoute(database: Database): Route = "/db" to GET bind {
+    fun queryRoute(database: Database) = "/db" bind GET to {
         database.withConnection {
         database.withConnection {
             findWorld(it, randomWorld())
             findWorld(it, randomWorld())
         }?.let { Response(OK).with(jsonBody of it) } ?: Response(NOT_FOUND)
         }?.let { Response(OK).with(jsonBody of it) } ?: Response(NOT_FOUND)
     }
     }
 
 
-    private fun multipleRoute(database: Database): Route = "/queries" to GET bind {
+    fun multipleRoute(database: Database) = "/queries" bind GET to {
         val worlds = database.withConnection {
         val worlds = database.withConnection {
             con ->
             con ->
             (1..numberOfQueries(it)).mapNotNull { findWorld(con, randomWorld()) }
             (1..numberOfQueries(it)).mapNotNull { findWorld(con, randomWorld()) }
@@ -55,7 +48,7 @@ object WorldRoutes {
         Response(OK).with(jsonBody of array(worlds))
         Response(OK).with(jsonBody of array(worlds))
     }
     }
 
 
-    private fun updateRoute(database: Database): Route = "/updates" to GET bind {
+    fun updateRoute(database: Database) = "/updates" bind GET to {
         val worlds = database.withConnection {
         val worlds = database.withConnection {
             con ->
             con ->
             (1..numberOfQueries(it)).mapNotNull {
             (1..numberOfQueries(it)).mapNotNull {

+ 0 - 0
frameworks/Kotlin/http4k/src/main/resources/FortunesList.hbs → frameworks/Kotlin/http4k/core/src/main/resources/FortunesList.hbs


+ 9 - 0
frameworks/Kotlin/http4k/jetty/build.gradle

@@ -0,0 +1,9 @@
+dependencies {
+    compile project(":core")
+    compile "org.http4k:http4k-server-jetty:$http4k_version"
+}
+
+task uber(type: OneJar) {
+    mainClass = "Http4kJettyServerKt"
+    archiveName = 'http4k-jetty-benchmark.jar'
+}

+ 0 - 0
frameworks/Kotlin/http4k/src/main/kotlin/Http4kJettyServer.kt → frameworks/Kotlin/http4k/jetty/src/main/kotlin/Http4kJettyServer.kt


+ 2 - 0
frameworks/Kotlin/http4k/killbenchmark.sh

@@ -0,0 +1,2 @@
+#!/usr/bin/env bash
+ps -ef | grep benchmark | awk '{print $2}' | xargs kill

+ 9 - 0
frameworks/Kotlin/http4k/netty/build.gradle

@@ -0,0 +1,9 @@
+dependencies {
+    compile project(":core")
+    compile "org.http4k:http4k-server-netty:$http4k_version"
+}
+
+task uber(type: OneJar) {
+    mainClass = "Http4kNettyServerKt"
+    archiveName = 'http4k-netty-benchmark.jar'
+}

+ 2 - 1
frameworks/Kotlin/http4k/src/main/kotlin/Http4kNettyServer.kt → frameworks/Kotlin/http4k/netty/src/main/kotlin/Http4kNettyServer.kt

@@ -1,5 +1,6 @@
+
 import org.http4k.server.Netty
 import org.http4k.server.Netty
 
 
 fun main(args: Array<String>) {
 fun main(args: Array<String>) {
-    Http4kBenchmarkServer.start(Netty(9000))
+    Http4kBenchmarkServer.start(Netty(9001))
 }
 }

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

@@ -0,0 +1,5 @@
+rootProject.name = 'http4k-benchmark'
+include 'core'
+include 'jetty'
+include 'netty'
+include 'undertow'

+ 2 - 2
frameworks/Kotlin/http4k/setup_jetty.sh

@@ -2,6 +2,6 @@
 
 
 fw_depends postgresql java
 fw_depends postgresql java
 
 
-./gradlew clean build jetty
+./gradlew clean build jetty:uber
 
 
-java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar build/libs/http4k-standalone.jar &
+java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar jetty/build/libs/http4k-jetty-benchmark.jar &

+ 2 - 2
frameworks/Kotlin/http4k/setup_netty.sh

@@ -2,6 +2,6 @@
 
 
 fw_depends postgresql java
 fw_depends postgresql java
 
 
-./gradlew clean build netty
+./gradlew clean build netty:uber
 
 
-java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar build/libs/http4k-standalone.jar &
+java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar netty/build/libs/http4k-netty-benchmark.jar &

+ 2 - 2
frameworks/Kotlin/http4k/setup_undertow.sh

@@ -2,6 +2,6 @@
 
 
 fw_depends postgresql java
 fw_depends postgresql java
 
 
-./gradlew clean build undertow
+./gradlew clean build undertow:uber
 
 
-java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar build/libs/http4k-standalone.jar &
+java -server -XX:+UseNUMA -XX:+UseParallelGC -XX:+AggressiveOpts -XX:+AlwaysPreTouch -jar undertow/build/libs/http4k-undertow-benchmark.jar &

+ 9 - 0
frameworks/Kotlin/http4k/undertow/build.gradle

@@ -0,0 +1,9 @@
+dependencies {
+    compile project(":core")
+    compile "org.http4k:http4k-server-undertow:$http4k_version"
+}
+
+task uber(type: OneJar) {
+    mainClass = "Http4kUndertowServerKt"
+    archiveName = 'http4k-undertow-benchmark.jar'
+}

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

@@ -1,5 +1,6 @@
+
 import org.http4k.server.Undertow
 import org.http4k.server.Undertow
 
 
 fun main(args: Array<String>) {
 fun main(args: Array<String>) {
-    Http4kBenchmarkServer.start(Undertow(9000))
+    Http4kBenchmarkServer.start(Undertow(9002))
 }
 }