Browse Source

Add wizzardo-http framework (#3576)

* added wizzardo-http framework

* added wizzardo-http to travis config

* added README for wizzardo-http

* removed dependency on techempower/*

* fix dockerfile
Mikhail Bobrutskov 7 years ago
parent
commit
a00f6687fe

+ 1 - 0
.travis.yml

@@ -76,6 +76,7 @@ env:
      - "TESTDIR=Java/vertx-web"
      - "TESTDIR=Java/vertx-web"
      - "TESTDIR=Java/wicket"
      - "TESTDIR=Java/wicket"
      - "TESTDIR=Java/wildfly-ee7"
      - "TESTDIR=Java/wildfly-ee7"
+     - "TESTDIR=Java/wizzardo-http"
      - "TESTLANG=JavaScript"
      - "TESTLANG=JavaScript"
      - "TESTLANG=Kotlin"
      - "TESTLANG=Kotlin"
      - "TESTLANG=Lua"
      - "TESTLANG=Lua"

+ 20 - 0
frameworks/Java/wizzardo-http/README.md

@@ -0,0 +1,20 @@
+# Wizzardo-http Benchmarking Test
+
+This is the wizzardo-http portion of a [benchmarking test suite](../) comparing a variety of web development platforms.
+
+### Source code
+* [App.java](src/main/java/com/wizzardo/techempower/App.java)
+* [DBService.java](src/main/java/com/wizzardo/techempower/DBService.java)
+* [DBController.java](src/main/java/com/wizzardo/techempower/DBController.java)
+* [Config.groovy](src/main/resources/Config.groovy)
+
+### Implemented benchmarks
+- [x] JSON serialization
+- [x] Single query
+- [x] Multiple queries
+- [ ] Fortunes
+- [x] Data updates
+- [x] Plaintext
+
+## Versions
+wizzardo-http 0.2 (https://github.com/wizzardo/http)

+ 29 - 0
frameworks/Java/wizzardo-http/benchmark_config.json

@@ -0,0 +1,29 @@
+{
+  "framework": "wizzardo-http",
+  "tests": [
+    {
+      "default": {
+        "json_url": "/json",
+        "plaintext_url": "/plaintext",
+        "db_url": "/db",
+        "query_url": "/queries?queries=",
+        "update_url": "/updates?queries=",
+        "_fortune_url": "/fortunes",
+        "port": 8080,
+        "approach": "Realistic",
+        "classification": "Micro",
+        "database": "Postgres",
+        "framework": "wizzardo-http",
+        "language": "Java",
+        "orm": "Raw",
+        "platform": "None",
+        "webserver": "None",
+        "os": "Linux",
+        "database_os": "Linux",
+        "display_name": "wizzardo-http",
+        "notes": "",
+        "versus": ""
+      }
+    }
+  ]
+}

+ 36 - 0
frameworks/Java/wizzardo-http/build.gradle

@@ -0,0 +1,36 @@
+group 'com.wizzardo.techempower'
+version '1.0-SNAPSHOT'
+
+apply plugin: 'java'
+apply plugin: 'application'
+
+sourceCompatibility = 1.8
+
+mainClassName = "com.wizzardo.techempower.App"
+
+repositories {
+    maven {
+        url "https://oss.sonatype.org/content/repositories/snapshots/"
+    }
+
+    jcenter()
+    mavenCentral()
+}
+
+dependencies {
+    compile 'com.wizzardo:http:0.2-SNAPSHOT'
+    compile 'org.postgresql:postgresql:9.4.1212'
+    compile 'com.zaxxer:HikariCP:2.7.3'
+}
+
+//create a single Jar with all dependencies
+task fatJar(type: Jar) {
+    manifest {
+        attributes(
+                "Main-Class": mainClassName
+        )
+    }
+    baseName = project.name + '-all'
+    from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } }
+    with jar
+}

+ 2 - 0
frameworks/Java/wizzardo-http/settings.gradle

@@ -0,0 +1,2 @@
+rootProject.name = 'techempower-benchmark'
+

+ 4 - 0
frameworks/Java/wizzardo-http/source_code

@@ -0,0 +1,4 @@
+./wizzardo-http/src/main/resources/Config.groovy
+./wizzardo-http/src/main/java/com/wizzardo/techempower/DBController.java
+./wizzardo-http/src/main/java/com/wizzardo/techempower/App.java
+./wizzardo-http/src/main/java/com/wizzardo/techempower/DBService.java

+ 48 - 0
frameworks/Java/wizzardo-http/src/main/java/com/wizzardo/techempower/App.java

@@ -0,0 +1,48 @@
+package com.wizzardo.techempower;
+
+import com.wizzardo.http.HttpConnection;
+import com.wizzardo.http.framework.WebApplication;
+import com.wizzardo.http.request.ByteTree;
+import com.wizzardo.http.request.Header;
+import com.wizzardo.http.request.Request;
+import com.wizzardo.tools.json.JsonTools;
+
+public class App {
+    public static final byte[] HELLO_WORLD = "Hello, World!".getBytes();
+
+    public static class Message {
+        public String message;
+
+        public Message(String message) {
+            this.message = message;
+        }
+    }
+
+    public static void main(String[] args) {
+        WebApplication webApplication = new WebApplication(args) {
+            @Override
+            protected void initHttpPartsCache() {
+                ByteTree tree = httpStringsCache.getTree();
+                for (Request.Method method : Request.Method.values()) {
+                    tree.append(method.name());
+                }
+                tree.append(HttpConnection.HTTP_1_1);
+            }
+        };
+
+        webApplication.onSetup(app -> {
+                app.getUrlMapping()
+                        .append("/plaintext", (request, response) -> response.setBody(HELLO_WORLD)
+                                .appendHeader(Header.KV_CONTENT_TYPE_TEXT_PLAIN))
+                        .append("/json", (request, response) -> response
+                                .setBody(JsonTools.serializeToBytes(new Message("Hello, World!")))
+                                .appendHeader(Header.KV_CONTENT_TYPE_APPLICATION_JSON))
+                        .append("/db", DBController.class, "world")
+                        .append("/queries", DBController.class, "queries")
+                        .append("/updates", DBController.class, "updates");
+                }
+        );
+
+        webApplication.start();
+    }
+}

+ 100 - 0
frameworks/Java/wizzardo-http/src/main/java/com/wizzardo/techempower/DBController.java

@@ -0,0 +1,100 @@
+package com.wizzardo.techempower;
+
+import com.wizzardo.http.framework.Controller;
+import com.wizzardo.http.framework.parameters.Parameter;
+import com.wizzardo.http.framework.template.Renderer;
+import com.wizzardo.http.request.Header;
+
+import java.nio.charset.StandardCharsets;
+import java.sql.Connection;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ThreadLocalRandom;
+
+public class DBController extends Controller {
+
+    DBService dbService;
+
+    public Renderer world() throws SQLException {
+        World world;
+        try (Connection connection = dbService.getConnection();
+             PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")
+        ) {
+            statement.setInt(1, getRandomNumber());
+            try (ResultSet resultSet = statement.executeQuery()) {
+                resultSet.next();
+                int id = resultSet.getInt(1);
+                int randomNumber = resultSet.getInt(2);
+                world = new World(id, randomNumber);
+            }
+        }
+
+        return renderJson(world);
+    }
+
+    public Renderer queries() throws SQLException {
+        int queries = Math.min(Math.max(params().getInt("queries", 1), 1), 500);
+
+        World[] worlds = new World[queries];
+        try (Connection connection = dbService.getConnection();
+             PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")
+        ) {
+            for (int i = 0; i < worlds.length; i++) {
+                statement.setInt(1, getRandomNumber());
+                try (ResultSet resultSet = statement.executeQuery()) {
+                    resultSet.next();
+                    int id = resultSet.getInt(1);
+                    int randomNumber = resultSet.getInt(2);
+                    worlds[i] = new World(id, randomNumber);
+                }
+            }
+        }
+
+        return renderJson(worlds);
+    }
+
+    public Renderer updates() throws SQLException {
+        int queries = Math.min(Math.max(params().getInt("queries", 1), 1), 500);
+        World[] worlds = new World[queries];
+        try (Connection connection = dbService.getConnection()) {
+            try (PreparedStatement statement = connection.prepareStatement("SELECT id,randomNumber FROM World WHERE id = ?")) {
+                for (int i = 0; i < worlds.length; i++) {
+                    statement.setInt(1, getRandomNumber());
+                    try (ResultSet resultSet = statement.executeQuery()) {
+                        resultSet.next();
+                        int id = resultSet.getInt(1);
+                        int randomNumber = resultSet.getInt(2);
+                        worlds[i] = new World(id, randomNumber);
+                    }
+                }
+            }
+            try (PreparedStatement statement = connection.prepareStatement("UPDATE World SET randomNumber = ? WHERE id = ?")) {
+                for (World world : worlds) {
+                    world.randomNumber = getRandomNumber();
+                    statement.setInt(1, world.randomNumber);
+                    statement.setInt(2, world.id);
+                    statement.executeUpdate();
+                }
+            }
+        }
+        return renderJson(worlds);
+    }
+
+    protected int getRandomNumber() {
+        return 1 + ThreadLocalRandom.current().nextInt(10000);
+    }
+
+    public static final class World {
+        public int id;
+        public int randomNumber;
+
+        public World(int id, int randomNumber) {
+            this.id = id;
+            this.randomNumber = randomNumber;
+        }
+    }
+}

+ 63 - 0
frameworks/Java/wizzardo-http/src/main/java/com/wizzardo/techempower/DBService.java

@@ -0,0 +1,63 @@
+package com.wizzardo.techempower;
+
+import com.wizzardo.http.framework.Configuration;
+import com.wizzardo.http.framework.di.PostConstruct;
+import com.wizzardo.http.framework.di.Service;
+import com.zaxxer.hikari.HikariConfig;
+import com.zaxxer.hikari.HikariDataSource;
+import org.postgresql.ds.PGSimpleDataSource;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+public class DBService implements Service, PostConstruct {
+
+    protected DataSource dataSource;
+    protected DBConfig config;
+
+    @Override
+    public void init() {
+        PGSimpleDataSource source = new PGSimpleDataSource();
+        source.setUrl("jdbc:postgresql://" + config.host + ":" + config.port + "/" + config.dbname);
+        source.setUser(config.username);
+        source.setPassword(config.password);
+
+        HikariConfig hikariConfig = new HikariConfig();
+        hikariConfig.setMaximumPoolSize(config.maximumPoolSize);
+        hikariConfig.setMinimumIdle(config.minimumIdle);
+        hikariConfig.setDataSource(source);
+
+        dataSource = new HikariDataSource(hikariConfig);
+    }
+
+    public Connection getConnection() throws SQLException {
+        return dataSource.getConnection();
+    }
+
+    public static class DBConfig implements Configuration {
+        public final String dbname;
+        public final String host;
+        public final int port;
+        public final String username;
+        public final String password;
+        public final int maximumPoolSize;
+        public final int minimumIdle;
+
+        public DBConfig() {
+            dbname = null;
+            username = null;
+            password = null;
+            maximumPoolSize = 0;
+            minimumIdle = 0;
+            host = null;
+            port = 0;
+        }
+
+
+        @Override
+        public String prefix() {
+            return "db";
+        }
+    }
+}

+ 25 - 0
frameworks/Java/wizzardo-http/src/main/resources/Config.groovy

@@ -0,0 +1,25 @@
+server {
+    host = '0.0.0.0'
+    port = 8080
+    ttl = 5 * 60 * 1000
+    context = '/'
+
+    session {
+        ttl = 30 * 60
+    }
+
+    debugOutput = false
+    onlyCachedHeaders = true
+}
+
+db {
+    dbname = 'hello_world'
+    host = 'tfb-database'
+    port = 5432
+
+    username = 'benchmarkdbuser'
+    password = 'benchmarkdbpass'
+
+    maximumPoolSize = 128
+    minimumIdle = 128
+}

+ 18 - 0
frameworks/Java/wizzardo-http/wizzardo-http.dockerfile

@@ -0,0 +1,18 @@
+FROM gradle:4.6.0-jdk8
+
+USER root
+WORKDIR /wizzardo-http
+
+COPY build.gradle build.gradle
+COPY src src
+
+RUN gradle --refresh-dependencies clean fatJar
+
+CMD java \
+    -Xmx2G \
+    -Xms2G \
+    -server \
+    -XX:+UseNUMA \
+    -XX:+UseParallelGC \
+    -XX:+AggressiveOpts \
+    -jar build/libs/wizzardo-http-all-1.0-SNAPSHOT.jar env=prod