Browse Source

Donkey (#6218)

* initial commit

* Updating README.md

* Update jdk image and donkey release version

* PR #6128 - Revision #1 - Reconstruct JSON response on each request

Co-authored-by: yaron.elyashiv <[email protected]>
Yaron Elyashiv 4 years ago
parent
commit
c4a82b412d

+ 4 - 0
frameworks/Clojure/donkey/.gitignore

@@ -0,0 +1,4 @@
+.nrepl-port
+.idea
+hello.iml
+target

+ 23 - 0
frameworks/Clojure/donkey/README.md

@@ -0,0 +1,23 @@
+# Donkey Benchmarking Test
+
+Benchmark tests for Donkey - Ring compliant Clojure HTTP server
+
+### Test Type Implementation Source Code
+
+* [JSON](src/hello/handler.clj)
+* [PLAINTEXT](src/hello/handler.clj)
+
+## Important Libraries
+The tests were run with:
+* [Donkey](https://github.com/AppsFlyer/donkey)
+* [Clojure 1.10.1](https://clojure.org/)
+* [Vert.x Web 3.9.2](https://vertx.io/docs/vertx-web/java/)
+
+## Test URLs
+### JSON
+
+http://localhost:8080/json
+
+### PLAINTEXT
+
+http://localhost:8080/plaintext

+ 26 - 0
frameworks/Clojure/donkey/benchmark_config.json

@@ -0,0 +1,26 @@
+{
+  "framework": "donkey",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "None",
+        "framework": "Donkey",
+        "language": "Clojure",
+        "flavor": "None",
+        "orm": "None",
+        "platform": "Netty",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "Donkey",
+        "notes": "",
+        "versus": "Vertx"
+      }
+    }
+  ]
+}

+ 9 - 0
frameworks/Clojure/donkey/donkey.dockerfile

@@ -0,0 +1,9 @@
+FROM clojure:openjdk-11-lein-2.9.3 as lein
+WORKDIR /donkey
+COPY src src
+COPY project.clj project.clj
+RUN lein uberjar
+
+FROM openjdk:11.0.9.1-jdk-slim
+COPY --from=lein /donkey/target/hello-donkey-standalone.jar  app.jar
+CMD ["java", "-server", "-Xms2G", "-Xmx2G", "-XX:+UseStringDeduplication", "-XX:+UseNUMA", "-XX:+UseParallelGC", "-Dvertx.disableMetrics=true", "-Dvertx.threadChecks=false", "-Dvertx.disableContextTimings=true", "-Dvertx.disableTCCL=true", "-Dvertx.disableH2c=true", "-Dvertx.disableWebsockets=true", "-Dvertx.disableHttpHeadersValidation=true", "-Dvertx.flashPolicyHandler=false", "-Djava.net.preferIPv4Stack=true", "-jar", "app.jar"]

+ 7 - 0
frameworks/Clojure/donkey/project.clj

@@ -0,0 +1,7 @@
+(defproject hello "donkey"
+  :description "Donkey Server"
+  :dependencies [[org.clojure/clojure "1.10.1"]
+                 [com.appsflyer/donkey "0.1.0"]]
+  :jvm-opts ^:replace ["-Dclojure.compiler.direct-linking=true"]
+  :main hello.handler
+  :aot :all)

+ 46 - 0
frameworks/Clojure/donkey/src/hello/handler.clj

@@ -0,0 +1,46 @@
+(ns hello.handler
+  (:require [com.appsflyer.donkey.core :as donkey-core]
+            [com.appsflyer.donkey.server :as donkey-server]
+            [com.appsflyer.donkey.middleware.json :as json])
+  (:gen-class)
+  (:import (io.vertx.core.impl.cpu CpuCoreSensor)))
+
+(defn- json-handler [_ res _]
+  (res {:status  200
+        :headers {"content-type" "application/json"}
+        :body    {"message" "Hello, World!"}}))
+
+(def ^:private json-route {:methods    [:get]
+                           :middleware [(json/make-serialize-middleware)]
+                           :path       "/json"
+                           :handler    json-handler})
+
+(def ^:private hello-world-body
+  (bytes (byte-array (map (comp byte int) "Hello, World!"))))
+
+(def ^:private hello-world-response
+  {:status  200
+   :headers {"content-type" "text/plain"}
+   :body    hello-world-body})
+
+(defn- hello-world-handler [_ res _]
+  (res hello-world-response))
+
+(def ^:private hello-world-route {:methods [:get]
+                                  :path    "/plaintext"
+                                  :handler hello-world-handler})
+
+(defn -main [& _]
+  (let [concurrency (max 1 (- (CpuCoreSensor/availableProcessors) 1))]
+    (->
+      (donkey-core/create-donkey
+        {:event-loops concurrency})
+      (donkey-core/create-server {:port          8080
+                                  :routes        [hello-world-route json-route]
+                                  :instances     concurrency
+                                  :compression   false
+                                  :decompression false
+                                  :date-header   true
+                                  :server-header true
+                                  :keep-alive    true})
+      (donkey-server/start-sync))))