Browse Source
Starts with Contract tests as this was suggested a place we may need caching. See #214pull/217/head
6 changed files with 246 additions and 0 deletions
@ -0,0 +1,10 @@ |
|||||||
|
Feign Benchmarks |
||||||
|
=================== |
||||||
|
|
||||||
|
This module includes [JMH](http://openjdk.java.net/projects/code-tools/jmh/) benchmarks for Feign. |
||||||
|
|
||||||
|
=== Building the benchmark |
||||||
|
Install and run `mvn -Dfeign.version=8.1.0` to produce `target/benchmark` pinned to version `8.1.0` |
||||||
|
|
||||||
|
=== Running the benchmark |
||||||
|
Execute `target/benchmark` |
@ -0,0 +1,93 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<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/maven-v4_0_0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
|
||||||
|
<parent> |
||||||
|
<groupId>org.sonatype.oss</groupId> |
||||||
|
<artifactId>oss-parent</artifactId> |
||||||
|
<version>9</version> |
||||||
|
</parent> |
||||||
|
|
||||||
|
<groupId>com.netflix.feign</groupId> |
||||||
|
<artifactId>feign-benchmark</artifactId> |
||||||
|
<packaging>jar</packaging> |
||||||
|
<version>8.1.0-SNAPSHOT</version> |
||||||
|
<name>Feign Benchmark (JMH)</name> |
||||||
|
|
||||||
|
<properties> |
||||||
|
<jmh.version>1.8</jmh.version> |
||||||
|
</properties> |
||||||
|
|
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>com.netflix.feign</groupId> |
||||||
|
<artifactId>feign-core</artifactId> |
||||||
|
<version>${project.version}</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>com.netflix.feign</groupId> |
||||||
|
<artifactId>feign-jaxrs</artifactId> |
||||||
|
<version>${project.version}</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>javax.ws.rs</groupId> |
||||||
|
<artifactId>jsr311-api</artifactId> |
||||||
|
<version>1.1.1</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.openjdk.jmh</groupId> |
||||||
|
<artifactId>jmh-core</artifactId> |
||||||
|
<version>${jmh.version}</version> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.openjdk.jmh</groupId> |
||||||
|
<artifactId>jmh-generator-annprocess</artifactId> |
||||||
|
<version>${jmh.version}</version> |
||||||
|
<scope>provided</scope> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
|
||||||
|
<build> |
||||||
|
<defaultGoal>package</defaultGoal> |
||||||
|
<plugins> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-shade-plugin</artifactId> |
||||||
|
<version>2.3</version> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<phase>package</phase> |
||||||
|
<goals> |
||||||
|
<goal>shade</goal> |
||||||
|
</goals> |
||||||
|
<configuration> |
||||||
|
<transformers> |
||||||
|
<transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> |
||||||
|
<mainClass>org.openjdk.jmh.Main</mainClass> |
||||||
|
</transformer> |
||||||
|
</transformers> |
||||||
|
<createDependencyReducedPom>false</createDependencyReducedPom> |
||||||
|
</configuration> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<groupId>org.skife.maven</groupId> |
||||||
|
<artifactId>really-executable-jar-maven-plugin</artifactId> |
||||||
|
<version>1.4.0</version> |
||||||
|
<configuration> |
||||||
|
<programFile>benchmark</programFile> |
||||||
|
</configuration> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<phase>package</phase> |
||||||
|
<goals> |
||||||
|
<goal>really-executable-jar</goal> |
||||||
|
</goals> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
</build> |
||||||
|
</project> |
@ -0,0 +1,46 @@ |
|||||||
|
package feign.benchmark; |
||||||
|
|
||||||
|
import org.openjdk.jmh.annotations.Benchmark; |
||||||
|
import org.openjdk.jmh.annotations.BenchmarkMode; |
||||||
|
import org.openjdk.jmh.annotations.Fork; |
||||||
|
import org.openjdk.jmh.annotations.Measurement; |
||||||
|
import org.openjdk.jmh.annotations.Mode; |
||||||
|
import org.openjdk.jmh.annotations.OutputTimeUnit; |
||||||
|
import org.openjdk.jmh.annotations.Scope; |
||||||
|
import org.openjdk.jmh.annotations.Setup; |
||||||
|
import org.openjdk.jmh.annotations.State; |
||||||
|
import org.openjdk.jmh.annotations.Warmup; |
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit; |
||||||
|
|
||||||
|
import feign.Contract; |
||||||
|
import feign.jaxrs.JAXRSContract; |
||||||
|
|
||||||
|
@Measurement(iterations = 5, time = 1) |
||||||
|
@Warmup(iterations = 5, time = 1) |
||||||
|
@Fork(3) |
||||||
|
@BenchmarkMode(Mode.Throughput) |
||||||
|
@OutputTimeUnit(TimeUnit.SECONDS) |
||||||
|
@State(Scope.Thread) |
||||||
|
public class ContractBenchmarks { |
||||||
|
|
||||||
|
private Contract feignContract; |
||||||
|
private Contract jaxrsContract; |
||||||
|
|
||||||
|
@Setup |
||||||
|
public void setup() { |
||||||
|
feignContract = new Contract.Default(); |
||||||
|
jaxrsContract = new JAXRSContract(); |
||||||
|
} |
||||||
|
|
||||||
|
@Benchmark |
||||||
|
public void parseFeign() { |
||||||
|
feignContract.parseAndValidatateMetadata(FeignTestInterface.class); |
||||||
|
} |
||||||
|
|
||||||
|
@Benchmark |
||||||
|
public void parseJAXRS() { |
||||||
|
jaxrsContract.parseAndValidatateMetadata(JAXRSTestInterface.class); |
||||||
|
} |
||||||
|
|
||||||
|
} |
@ -0,0 +1,39 @@ |
|||||||
|
package feign.benchmark; |
||||||
|
|
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.ws.rs.HeaderParam; |
||||||
|
|
||||||
|
import feign.Body; |
||||||
|
import feign.Headers; |
||||||
|
import feign.Param; |
||||||
|
import feign.RequestLine; |
||||||
|
import feign.Response; |
||||||
|
|
||||||
|
@Headers("Accept: application/json") |
||||||
|
interface FeignTestInterface { |
||||||
|
|
||||||
|
@RequestLine("GET /?Action=GetUser&Version=2010-05-08&limit=1") |
||||||
|
Response query(); |
||||||
|
|
||||||
|
@RequestLine("GET /domains/{domainId}/records?name={name}&type={type}") |
||||||
|
Response mixedParams(@Param("domainId") int id, |
||||||
|
@Param("name") String nameFilter, |
||||||
|
@Param("type") String typeFilter); |
||||||
|
|
||||||
|
@RequestLine("PATCH /") |
||||||
|
Response customMethod(); |
||||||
|
|
||||||
|
@RequestLine("PUT /") |
||||||
|
@Headers("Content-Type: application/json") |
||||||
|
void bodyParam(List<String> body); |
||||||
|
|
||||||
|
@RequestLine("POST /") |
||||||
|
@Body("%7B\"customer_name\": \"{customer_name}\", \"user_name\": \"{user_name}\", \"password\": \"{password}\"%7D") |
||||||
|
void form(@Param("customer_name") String customer, @Param("user_name") String user, |
||||||
|
@Param("password") String password); |
||||||
|
|
||||||
|
@RequestLine("POST /") |
||||||
|
@Headers({"Happy: sad", "Auth-Token: {authToken}"}) |
||||||
|
void headers(@HeaderParam("authToken") String token); |
||||||
|
} |
@ -0,0 +1,57 @@ |
|||||||
|
package feign.benchmark; |
||||||
|
|
||||||
|
import java.lang.annotation.ElementType; |
||||||
|
import java.lang.annotation.Retention; |
||||||
|
import java.lang.annotation.RetentionPolicy; |
||||||
|
import java.lang.annotation.Target; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
import javax.ws.rs.Consumes; |
||||||
|
import javax.ws.rs.FormParam; |
||||||
|
import javax.ws.rs.GET; |
||||||
|
import javax.ws.rs.HeaderParam; |
||||||
|
import javax.ws.rs.HttpMethod; |
||||||
|
import javax.ws.rs.POST; |
||||||
|
import javax.ws.rs.PUT; |
||||||
|
import javax.ws.rs.Path; |
||||||
|
import javax.ws.rs.PathParam; |
||||||
|
import javax.ws.rs.Produces; |
||||||
|
import javax.ws.rs.QueryParam; |
||||||
|
|
||||||
|
import feign.Headers; |
||||||
|
import feign.Response; |
||||||
|
|
||||||
|
@Consumes("application/json") |
||||||
|
interface JAXRSTestInterface { |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/?Action=GetUser&Version=2010-05-08&limit=1") |
||||||
|
Response query(); |
||||||
|
|
||||||
|
@GET |
||||||
|
@Path("/domains/{domainId}/records") |
||||||
|
Response mixedParams(@PathParam("domainId") int id, @QueryParam("name") String nameFilter, |
||||||
|
@QueryParam("type") String typeFilter); |
||||||
|
|
||||||
|
@PATCH |
||||||
|
Response customMethod(); |
||||||
|
|
||||||
|
@Target({ElementType.METHOD}) |
||||||
|
@Retention(RetentionPolicy.RUNTIME) |
||||||
|
@HttpMethod("PATCH") |
||||||
|
@interface PATCH { |
||||||
|
|
||||||
|
} |
||||||
|
|
||||||
|
@PUT |
||||||
|
@Produces("application/json") |
||||||
|
void bodyParam(List<String> body); |
||||||
|
|
||||||
|
@POST |
||||||
|
void form(@FormParam("customer_name") String customer, @FormParam("user_name") String user, |
||||||
|
@FormParam("password") String password); |
||||||
|
|
||||||
|
@POST |
||||||
|
@Headers("Happy: sad") |
||||||
|
void headers(@HeaderParam("Auth-Token") String token); |
||||||
|
} |
Loading…
Reference in new issue