Browse Source

[add] Implementation of JSON/plaintext for Servicetalk (#5467)

* [add] Implementation of JSON/plaintext for Servicetalk

* [fix] Comments

* [fix] Remove try/catch block

* [fix] Naming convention + random number

* [fix] Replace date libraries + Server name

* [fix] version numbers

* [fix] Clean pom.xml
Arthur Ryabtsev 5 years ago
parent
commit
81cab7cb58

+ 1 - 1
.travis.yml

@@ -44,7 +44,7 @@ env:
     - "TESTDIR=Haskell/warp"
     - "TESTDIR=Haskell/warp"
     - "TESTDIR=Haskell/wizzardo-inline"
     - "TESTDIR=Haskell/wizzardo-inline"
     - 'TESTDIR="Java/act Java/comsat"'
     - 'TESTDIR="Java/act Java/comsat"'
-    - 'TESTDIR="Java/activeweb Java/armeria Java/baratine Java/bayou Java/blade Java/curacao Java/dropwizard Java/firenio Java/voovan"'
+    - 'TESTDIR="Java/activeweb Java/armeria Java/baratine Java/bayou Java/blade Java/curacao Java/dropwizard Java/firenio Java/servicetalk Java/voovan"'
     - 'TESTDIR="Java/gemini Java/greenlightning Java/grizzly Java/helidon Java/httpserver Java/jetty Java/jhttp Java/jooby2 Java/wicket"'
     - 'TESTDIR="Java/gemini Java/greenlightning Java/grizzly Java/helidon Java/httpserver Java/jetty Java/jhttp Java/jooby2 Java/wicket"'
     - 'TESTDIR="Java/light-java Java/minijax Java/nanohttpd Java/netty Java/ninja-standalone Java/officefloor Java/proteus Java/quarkus"'
     - 'TESTDIR="Java/light-java Java/minijax Java/nanohttpd Java/netty Java/ninja-standalone Java/officefloor Java/proteus Java/quarkus"'
     - 'TESTDIR="Java/rapidoid Java/redkale Java/restexpress Java/revenj-jvm Java/servlet Java/servlet3 Java/smart-socket Java/spark"'
     - 'TESTDIR="Java/rapidoid Java/redkale Java/restexpress Java/revenj-jvm Java/servlet Java/servlet3 Java/smart-socket Java/spark"'

+ 13 - 0
frameworks/Java/servicetalk/README.md

@@ -0,0 +1,13 @@
+# ServiceTalk framework test
+
+This is an implementationfor of [TechEmpower Framework Benchmarks](https://github.com/TechEmpower/FrameworkBenchmarks) for Apple's ServiceTalk framework. 
+
+## Documentation
+See [ServiceTalk project's documentation](https://apple.github.io/servicetalk/servicetalk/SNAPSHOT/programming-paradigms.html).
+
+## JSON serialization endpoint
+`http://localhost:8080/json`
+
+## PLAINTEXT endpoint
+`http://localhost:8080/plaintext`
+

+ 24 - 0
frameworks/Java/servicetalk/benchmark_config.json

@@ -0,0 +1,24 @@
+{
+  "framework": "servicetalk",
+  "tests": [{
+    "default": {
+      "json_url": "/json",
+      "plaintext_url": "/plaintext",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Micro",
+      "database": "none",
+      "framework": "servicetalk",
+      "language": "Java",
+      "flavor": "None",
+      "orm": "Raw",
+      "platform": "servicetalk",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "servicetalk",
+      "notes": "",
+      "versus": ""
+    }
+  }]
+}

+ 86 - 0
frameworks/Java/servicetalk/pom.xml

@@ -0,0 +1,86 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.techempower</groupId>
+    <artifactId>servicetalk</artifactId>
+    <version>1.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <properties>
+        <servicetalk.version>0.20.0</servicetalk.version>
+    </properties>
+
+
+    <dependencies>
+        <dependency>
+            <groupId>io.servicetalk</groupId>
+            <artifactId>servicetalk-serialization-api</artifactId>
+            <version>${servicetalk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.servicetalk</groupId>
+            <artifactId>servicetalk-http-api</artifactId>
+            <version>${servicetalk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.servicetalk</groupId>
+            <artifactId>servicetalk-http-netty</artifactId>
+            <version>${servicetalk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.servicetalk</groupId>
+            <artifactId>servicetalk-concurrent-api</artifactId>
+            <version>${servicetalk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.servicetalk</groupId>
+            <artifactId>servicetalk-data-jackson</artifactId>
+            <version>${servicetalk.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.servicetalk</groupId>
+            <artifactId>servicetalk-transport-netty-internal</artifactId>
+            <version>${servicetalk.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>servicetalk</finalName>
+        <plugins>
+            <plugin>
+                <inherited>true</inherited>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.8.1</version>
+                <configuration>
+                    <source>11</source>
+                    <target>11</target>
+                </configuration>
+            </plugin>
+            <plugin>
+                <artifactId>maven-assembly-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>servicetalk.Server</mainClass>
+                        </manifest>
+                    </archive>
+                    <descriptorRefs>
+                        <descriptorRef>jar-with-dependencies</descriptorRef>
+                    </descriptorRefs>
+                </configuration>
+                <executions>
+                    <execution>
+                        <id>make-assembly</id>
+                        <phase>package</phase>
+                        <goals>
+                            <goal>single</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 10 - 0
frameworks/Java/servicetalk/servicetalk.dockerfile

@@ -0,0 +1,10 @@
+FROM maven:3.6.1-jdk-11-slim as build
+WORKDIR /servicetalk
+COPY pom.xml pom.xml
+COPY src src
+RUN mvn compile assembly:single -q
+
+FROM openjdk:11.0.5-slim
+WORKDIR /servicetalk
+COPY --from=build /servicetalk/target/servicetalk-jar-with-dependencies.jar servicetalk.jar
+CMD ["java", "-jar", "servicetalk.jar"]

+ 104 - 0
frameworks/Java/servicetalk/src/main/java/servicetalk/Server.java

@@ -0,0 +1,104 @@
+package servicetalk;
+
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.HashMap;
+import java.util.Map;
+import java.time.format.DateTimeFormatter;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+import io.servicetalk.concurrent.api.AsyncContext;
+import io.servicetalk.concurrent.api.Completable;
+import io.servicetalk.http.api.*;
+import io.servicetalk.http.netty.HttpProtocolConfigs;
+import io.servicetalk.http.netty.HttpServers;
+import io.servicetalk.data.jackson.JacksonSerializationProvider;
+import io.servicetalk.transport.api.ConnectionAcceptor;
+import io.servicetalk.transport.api.ConnectionContext;
+import io.servicetalk.transport.api.IoExecutor;
+import io.servicetalk.transport.netty.internal.*;
+
+import static io.servicetalk.concurrent.api.Single.succeeded;
+
+
+
+public final class Server
+{
+
+    public static void main(String[] args) throws Exception
+    {
+
+        /*
+         * Disable  AsyncContext
+         */
+        AsyncContext.disable();
+
+        /*
+         *   Factory to implement io pooling
+         */
+        IoExecutor ioExecutor = NettyIoExecutors.createIoExecutor(
+          Runtime.getRuntime().availableProcessors(),
+          new IoThreadFactory("io-pool")
+        );
+
+        /*
+         * Factory to disable headers validation
+         */
+
+        DefaultHttpHeadersFactory headersFactory = new DefaultHttpHeadersFactory(false,false);
+
+
+        HttpSerializationProvider serializer = HttpSerializationProviders.jsonSerializer(new JacksonSerializationProvider());
+//            Create a custom server builder with performance enhancements
+        HttpServers
+          .forPort(8080)
+          .executionStrategy(HttpExecutionStrategies.noOffloadsStrategy())
+          .ioExecutor(ioExecutor)
+          .disableDrainingRequestPayloadBody()
+          .protocols(HttpProtocolConfigs.h1().headersFactory(headersFactory).build())
+          .appendConnectionAcceptorFilter(delegate -> new ConnectionAcceptor()
+          {
+              @Override
+              public Completable accept(ConnectionContext context)
+              {
+                  ((NettyConnectionContext)context).updateFlushStrategy((current, isOrig) -> FlushStrategies.flushOnEnd());
+                  return delegate.accept(context);
+              }
+          })
+          .listenAndAwait((ctx, request, responseFactory) ->
+            {
+              ((NettyConnectionContext)ctx).updateFlushStrategy(((current, isCurrentOriginal) -> FlushStrategies.flushOnEach()));
+              if(request.path().equals("/json"))
+              {
+                Map<String, String> obj = new HashMap<String, String>();
+                obj.put("message", "Hello, World!");
+                return succeeded(responseFactory.ok()
+                  .payloadBody(obj, serializer.serializerFor(Map.class))
+                  .addHeader("Date", getCurrentTime())
+                  .addHeader("Server", "ServiceTalk"));
+              }
+
+              if(request.path().equals("/plaintext"))
+              {
+                return succeeded(responseFactory.ok()
+                  .payloadBody("Hello, World!", HttpSerializationProviders.textSerializer())
+                  .addHeader("Date", getCurrentTime())
+                  .addHeader("Server", "ServiceTalk"));
+              };
+              return null;
+            })
+            .awaitShutdown();
+    }
+
+    public static String getCurrentTime()
+    {
+        return DateTimeFormatter.RFC_1123_DATE_TIME.format(
+          ZonedDateTime.now(ZoneOffset.UTC));
+    }
+
+    private static int getRandomNumber()
+    {
+        return 1 + ThreadLocalRandom.current().nextInt(10000);
+    }
+}
+