This is an automated email from the ASF dual-hosted git repository. alexstocks pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git
commit 62ce23b1d6059aee9c23b230543672091d5ea46a Author: beiwei30 <[email protected]> AuthorDate: Mon May 21 16:12:47 2018 +0800 initial checkin for dubbo benchmark and profile --- .gitignore | 8 ++ benchmark-base/pom.xml | 15 +++ .../java/org/apache/dubbo/benchmark/bean/Page.java | 41 +++++++ .../java/org/apache/dubbo/benchmark/bean/User.java | 128 ++++++++++++++++++++ .../apache/dubbo/benchmark/rpc/AbstractClient.java | 38 ++++++ .../serialize/SerializationOptimizerImpl.java | 16 +++ .../dubbo/benchmark/service/UserService.java | 17 +++ .../benchmark/service/UserServiceServerImpl.java | 97 +++++++++++++++ benchmark.sh | 52 ++++++++ dubbo-hessianlite-client/pom.xml | 15 +++ .../java/org/apache/dubbo/benchmark/Client.java | 95 +++++++++++++++ .../src/main/resources/benchmark.properties | 2 + .../src/main/resources/consumer.xml | 10 ++ .../src/main/resources/logback.xml | 28 +++++ dubbo-hessianlite-server/pom.xml | 15 +++ .../java/org/apache/dubbo/benchmark/Server.java | 14 +++ .../src/main/resources/benchmark.properties | 2 + .../src/main/resources/logback.xml | 26 ++++ .../src/main/resources/provider.xml | 13 ++ dubbo-kryo-client/pom.xml | 83 +++++++++++++ .../java/org/apache/dubbo/benchmark/Client.java | 95 +++++++++++++++ .../src/main/resources/benchmark.properties | 2 + dubbo-kryo-client/src/main/resources/consumer.xml | 10 ++ dubbo-kryo-client/src/main/resources/logback.xml | 28 +++++ dubbo-kryo-server/pom.xml | 99 +++++++++++++++ .../java/org/apache/dubbo/benchmark/Server.java | 14 +++ .../src/main/resources/benchmark.properties | 2 + dubbo-kryo-server/src/main/resources/logback.xml | 28 +++++ dubbo-kryo-server/src/main/resources/provider.xml | 13 ++ pom.xml | 133 +++++++++++++++++++++ 30 files changed, 1139 insertions(+) diff --git a/.gitignore b/.gitignore index a1c2a23..2d74208 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ # Compiled class file *.class +target/ # Log file *.log @@ -21,3 +22,10 @@ # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml hs_err_pid* + +# intellij idea +*.iml +.idea/ + +# preflight record result +*.jfr diff --git a/benchmark-base/pom.xml b/benchmark-base/pom.xml new file mode 100644 index 0000000..88cd301 --- /dev/null +++ b/benchmark-base/pom.xml @@ -0,0 +1,15 @@ +<?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/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>dubbo-benchmark</artifactId> + <groupId>org.apache.dubbo</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>benchmark-base</artifactId> + + +</project> \ No newline at end of file diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/bean/Page.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/bean/Page.java new file mode 100644 index 0000000..6cf1f1d --- /dev/null +++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/bean/Page.java @@ -0,0 +1,41 @@ +package org.apache.dubbo.benchmark.bean; + +import java.io.Serializable; +import java.util.List; + +public class Page<T> implements Serializable { + private static final long serialVersionUID = -7529237188686406553L; + + private int pageNo; + private int total; + private List<T> result; + + public int getPageNo() { + return pageNo; + } + + public void setPageNo(int pageNo) { + this.pageNo = pageNo; + } + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public List<T> getResult() { + return result; + } + + public void setResult(List<T> result) { + this.result = result; + } + + @Override + public String toString() { + return "Page [pageNo=" + pageNo + ", total=" + total + ", result=" + result + "]"; + } +} diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/bean/User.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/bean/User.java new file mode 100644 index 0000000..cecb779 --- /dev/null +++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/bean/User.java @@ -0,0 +1,128 @@ +package org.apache.dubbo.benchmark.bean; + +import java.io.Serializable; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +public class User implements Serializable { + private static final long serialVersionUID = 2566816725396650300L; + + private long id; + private String name; + private int sex; + private LocalDate birthday; + private String email; + private String mobile; + private String address; + private String icon; + private List<Integer> permissions; + private int status; + private LocalDateTime createTime; + private LocalDateTime updateTime; + + public long getId() { + return id; + } + + public void setId(long id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public int getSex() { + return sex; + } + + public void setSex(int sex) { + this.sex = sex; + } + + public LocalDate getBirthday() { + return birthday; + } + + public void setBirthday(LocalDate birthday) { + this.birthday = birthday; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getMobile() { + return mobile; + } + + public void setMobile(String mobile) { + this.mobile = mobile; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public List<Integer> getPermissions() { + return permissions; + } + + public void setPermissions(List<Integer> permissions) { + this.permissions = permissions; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public LocalDateTime getCreateTime() { + return createTime; + } + + public void setCreateTime(LocalDateTime createTime) { + this.createTime = createTime; + } + + public LocalDateTime getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(LocalDateTime updateTime) { + this.updateTime = updateTime; + } + + @Override + public String toString() { + return "User [id=" + id + ", name=" + name + ", sex=" + sex + ", birthday=" + birthday + ", email=" + email + + ", mobile=" + mobile + ", address=" + address + ", icon=" + icon + ", permissions=" + permissions + + ", status=" + status + ", createTime=" + createTime + ", updateTime=" + updateTime + "]"; + } + +} + diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/rpc/AbstractClient.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/rpc/AbstractClient.java new file mode 100644 index 0000000..f6556f2 --- /dev/null +++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/rpc/AbstractClient.java @@ -0,0 +1,38 @@ +package org.apache.dubbo.benchmark.rpc; + +import org.apache.dubbo.benchmark.bean.Page; +import org.apache.dubbo.benchmark.bean.User; +import org.apache.dubbo.benchmark.service.UserService; +import org.apache.dubbo.benchmark.service.UserServiceServerImpl; + +import java.util.concurrent.atomic.AtomicInteger; + +public abstract class AbstractClient { + private final AtomicInteger counter = new AtomicInteger(0); + private final UserService _serviceUserService = new UserServiceServerImpl(); + + protected abstract UserService getUserService(); + + public boolean existUser() throws Exception { + String email = String.valueOf(counter.getAndIncrement()); + return getUserService().existUser(email); + } + + public boolean createUser() throws Exception { + int id = counter.getAndIncrement(); + User user = _serviceUserService.getUser(id); + return getUserService().createUser(user); + } + + public User getUser() throws Exception { + int id = counter.getAndIncrement(); + return getUserService().getUser(id); + } + + public Page<User> listUser() throws Exception { + int pageNo = counter.getAndIncrement(); + return getUserService().listUser(pageNo); + } + +} + diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/serialize/SerializationOptimizerImpl.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/serialize/SerializationOptimizerImpl.java new file mode 100644 index 0000000..9c47274 --- /dev/null +++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/serialize/SerializationOptimizerImpl.java @@ -0,0 +1,16 @@ +package org.apache.dubbo.benchmark.serialize; + +import com.alibaba.dubbo.common.serialize.support.SerializationOptimizer; +import org.apache.dubbo.benchmark.bean.Page; +import org.apache.dubbo.benchmark.bean.User; +import org.apache.dubbo.benchmark.service.UserService; + +import java.util.Arrays; +import java.util.Collection; + +public class SerializationOptimizerImpl implements SerializationOptimizer { + @Override + public Collection<Class> getSerializableClasses() { + return Arrays.asList(User.class, Page.class, UserService.class); + } +} diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserService.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserService.java new file mode 100644 index 0000000..9f4a164 --- /dev/null +++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserService.java @@ -0,0 +1,17 @@ +package org.apache.dubbo.benchmark.service; + + +import org.apache.dubbo.benchmark.bean.Page; +import org.apache.dubbo.benchmark.bean.User; + +public interface UserService { + public boolean existUser(String email); + + public boolean createUser(User user); + + public User getUser(long id); + + public Page<User> listUser(int pageNo); + +} + diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceServerImpl.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceServerImpl.java new file mode 100644 index 0000000..34db9c0 --- /dev/null +++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceServerImpl.java @@ -0,0 +1,97 @@ +package org.apache.dubbo.benchmark.service; + + +import org.apache.dubbo.benchmark.bean.Page; +import org.apache.dubbo.benchmark.bean.User; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + + +public class UserServiceServerImpl implements UserService { + + @Override + public boolean existUser(String email) { + if (email == null || email.isEmpty()) { + return true; + } + + if (email.charAt(email.length() - 1) < '5') { + return false; + } + + return true; + } + + @Override + public User getUser(long id) { + User user = new User(); + + user.setId(id); + user.setName(new String("Doug Lea")); + user.setSex(1); + user.setBirthday(LocalDate.of(1968, 12, 8)); + user.setEmail(new String("[email protected]")); + user.setMobile(new String("18612345678")); + user.setAddress(new String("北京市 中关村 中关村大街1号 鼎好大厦 1605")); + user.setIcon(new String("https://www.baidu.com/img/bd_logo1.png")); + user.setStatus(1); + user.setCreateTime(LocalDateTime.now()); + user.setUpdateTime(user.getCreateTime()); + + List<Integer> permissions = new ArrayList<Integer>( + Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92)); + + user.setPermissions(permissions); + + return user; + } + + @Override + public Page<User> listUser(int pageNo) { + List<User> userList = new ArrayList<>(15); + + for (int i = 0; i < 15; i++) { + User user = new User(); + + user.setId(i); + user.setName("Doug Lea" + i); + user.setSex(1); + user.setBirthday(LocalDate.of(1968, 12, 8)); + user.setEmail("[email protected]" + i); + user.setMobile("18612345678" + i); + user.setAddress("北京市 中关村 中关村大街1号 鼎好大厦 1605" + i); + user.setIcon("https://www.baidu.com/img/bd_logo1.png" + i); + user.setStatus(1); + user.setCreateTime(LocalDateTime.now()); + user.setUpdateTime(user.getCreateTime()); + + List<Integer> permissions = new ArrayList<Integer>( + Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 19, 88, 86, 89, 90, 91, 92)); + user.setPermissions(permissions); + + userList.add(user); + } + + Page<User> page = new Page<>(); + page.setPageNo(pageNo); + page.setTotal(1000); + page.setResult(userList); + + return page; + } + + @Override + public boolean createUser(User user) { + if (user == null) { + return false; + } + + return true; + } + +} + diff --git a/benchmark.sh b/benchmark.sh new file mode 100755 index 0000000..1959c92 --- /dev/null +++ b/benchmark.sh @@ -0,0 +1,52 @@ +#!/usr/bin/env bash + +PROGRAM_NAME=$0 +TASK=$1 +PROFILE=$2 + +if [ ! -d "${TASK}" ]; then + usage +fi + +usage() { + echo "Usage: ${PROGRAM_NAME} directory-name {profiling|benchmark}" + echo "run in benchmark mode by default if mode is not specified." + exit 2 +} + +build() { + mvn clean package +} + +options() { + JAVA_OPTIONS="-server -Xmx1g -Xms1g -XX:MaxDirectMemorySize=1g -XX:+UseG1GC" + if [ "x${PROFILE}" = "xprofiling" ]; then + JAVA_OPTIONS="${JAVA_OPTIONS} \ +-XX:+UnlockCommercialFeatures \ +-XX:+FlightRecorder \ +-XX:StartFlightRecording=duration=30s,filename=${TASK}.jfr \ +-XX:FlightRecorderOptions=stackdepth=256" + fi +} + +run() { + if [ -d "${TASK}/target" ]; then + JAR=`find ${TASK}/target/*.jar | head -n 1` + echo + echo "RUN ${TASK} IN ${PROFILE:-benchmark} MODE" + CMD="java ${JAVA_OPTIONS} -jar ${JAR}" + echo "command is: ${CMD}" + echo + ${CMD} + fi +} + +build +options +run + + + + + + diff --git a/dubbo-hessianlite-client/pom.xml b/dubbo-hessianlite-client/pom.xml new file mode 100644 index 0000000..36640db --- /dev/null +++ b/dubbo-hessianlite-client/pom.xml @@ -0,0 +1,15 @@ +<?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/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>dubbo-benchmark</artifactId> + <groupId>org.apache.dubbo</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>dubbo-hessianlite-client</artifactId> + + +</project> \ No newline at end of file diff --git a/dubbo-hessianlite-client/src/main/java/org/apache/dubbo/benchmark/Client.java b/dubbo-hessianlite-client/src/main/java/org/apache/dubbo/benchmark/Client.java new file mode 100644 index 0000000..08fe221 --- /dev/null +++ b/dubbo-hessianlite-client/src/main/java/org/apache/dubbo/benchmark/Client.java @@ -0,0 +1,95 @@ +package org.apache.dubbo.benchmark; + +import com.alibaba.dubbo.config.ProtocolConfig; +import org.apache.dubbo.benchmark.bean.Page; +import org.apache.dubbo.benchmark.bean.User; +import org.apache.dubbo.benchmark.rpc.AbstractClient; +import org.apache.dubbo.benchmark.service.UserService; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.results.format.ResultFormatType; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import org.openjdk.jmh.runner.options.TimeValue; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +@State(Scope.Benchmark) +public class Client extends AbstractClient { + private static final int CONCURRENCY = 32; + + private final ClassPathXmlApplicationContext context; + private final UserService userService; + + public Client() { + context = new ClassPathXmlApplicationContext("consumer.xml"); + context.start(); + userService = (UserService) context.getBean("userService"); + } + + @Override + protected UserService getUserService() { + return userService; + } + + @TearDown + public void close() throws IOException { + context.close(); + ProtocolConfig.destroyAll(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public boolean existUser() throws Exception { + return super.existUser(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public boolean createUser() throws Exception { + return super.createUser(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public User getUser() throws Exception { + return super.getUser(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public Page<User> listUser() throws Exception { + return super.listUser(); + } + + public static void main(String[] args) throws Exception { + Options opt = new OptionsBuilder() + .include(Client.class.getSimpleName()) + .warmupIterations(3) + .warmupTime(TimeValue.seconds(10)) + .measurementIterations(3) + .measurementTime(TimeValue.seconds(10)) + .threads(CONCURRENCY) + .resultFormat(ResultFormatType.JSON) + .forks(1) + .build(); + + new Runner(opt).run(); + } +} diff --git a/dubbo-hessianlite-client/src/main/resources/benchmark.properties b/dubbo-hessianlite-client/src/main/resources/benchmark.properties new file mode 100644 index 0000000..9d276bf --- /dev/null +++ b/dubbo-hessianlite-client/src/main/resources/benchmark.properties @@ -0,0 +1,2 @@ +server.host=localhost +server.port=8080 \ No newline at end of file diff --git a/dubbo-hessianlite-client/src/main/resources/consumer.xml b/dubbo-hessianlite-client/src/main/resources/consumer.xml new file mode 100644 index 0000000..22c89f9 --- /dev/null +++ b/dubbo-hessianlite-client/src/main/resources/consumer.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> + <dubbo:application name="dubbo-client-kyro"/> + <dubbo:reference id="userService" check="false" + interface="org.apache.dubbo.benchmark.service.UserService" + url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&serialization=kryo"/> + <dubbo:consumer client="netty4" filter="-default"/> +</beans> \ No newline at end of file diff --git a/dubbo-hessianlite-client/src/main/resources/logback.xml b/dubbo-hessianlite-client/src/main/resources/logback.xml new file mode 100644 index 0000000..cb8c9fd --- /dev/null +++ b/dubbo-hessianlite-client/src/main/resources/logback.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <jmxConfigurator/> + + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + </pattern> + </encoder> + </appender> + + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>logs/dubbo-kyro-client.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz</fileNamePattern> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> + </encoder> + </appender> + + <logger name="benchmark.rpc" level="INFO"/> + + <root level="INFO"> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="FILE"/> + </root> +</configuration> diff --git a/dubbo-hessianlite-server/pom.xml b/dubbo-hessianlite-server/pom.xml new file mode 100644 index 0000000..7b095f2 --- /dev/null +++ b/dubbo-hessianlite-server/pom.xml @@ -0,0 +1,15 @@ +<?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/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>dubbo-benchmark</artifactId> + <groupId>org.apache.dubbo</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>dubbo-hessianlite-server</artifactId> + + +</project> \ No newline at end of file diff --git a/dubbo-hessianlite-server/src/main/java/org/apache/dubbo/benchmark/Server.java b/dubbo-hessianlite-server/src/main/java/org/apache/dubbo/benchmark/Server.java new file mode 100644 index 0000000..6787d36 --- /dev/null +++ b/dubbo-hessianlite-server/src/main/java/org/apache/dubbo/benchmark/Server.java @@ -0,0 +1,14 @@ +package org.apache.dubbo.benchmark; + +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class Server { + + public static void main(String[] args) throws InterruptedException { + try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml")) { + context.start(); + Thread.sleep(Integer.MAX_VALUE); + } + } + +} diff --git a/dubbo-hessianlite-server/src/main/resources/benchmark.properties b/dubbo-hessianlite-server/src/main/resources/benchmark.properties new file mode 100644 index 0000000..9d276bf --- /dev/null +++ b/dubbo-hessianlite-server/src/main/resources/benchmark.properties @@ -0,0 +1,2 @@ +server.host=localhost +server.port=8080 \ No newline at end of file diff --git a/dubbo-hessianlite-server/src/main/resources/logback.xml b/dubbo-hessianlite-server/src/main/resources/logback.xml new file mode 100644 index 0000000..6b20820 --- /dev/null +++ b/dubbo-hessianlite-server/src/main/resources/logback.xml @@ -0,0 +1,26 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <jmxConfigurator/> + + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + </pattern> + </encoder> + </appender> + + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>logs/dubbo-kryo-server.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>logs/dubbo-kryo-server.%d{yyyy-MM-dd}.log.gz</fileNamePattern> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern> + </encoder> + </appender> + + <root level="INFO"> + <appender-ref ref="CONSOLE"/> + <appender-ref ref="FILE"/> + </root> +</configuration> diff --git a/dubbo-hessianlite-server/src/main/resources/provider.xml b/dubbo-hessianlite-server/src/main/resources/provider.xml new file mode 100644 index 0000000..c0ba8cd --- /dev/null +++ b/dubbo-hessianlite-server/src/main/resources/provider.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> + <context:property-placeholder location="classpath:benchmark.properties" system-properties-mode="OVERRIDE"/> + <dubbo:application name="dubbo-kryo-server"/> + <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="kryo" + optimizer="org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl"/> + <dubbo:registry address="N/A"/> + <dubbo:service interface="org.apache.dubbo.benchmark.service.UserService" ref="userService" filter="-default"/> + <bean id="userService" class="org.apache.dubbo.benchmark.service.UserServiceServerImpl"/> +</beans> \ No newline at end of file diff --git a/dubbo-kryo-client/pom.xml b/dubbo-kryo-client/pom.xml new file mode 100644 index 0000000..eeee860 --- /dev/null +++ b/dubbo-kryo-client/pom.xml @@ -0,0 +1,83 @@ +<?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/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>dubbo-benchmark</artifactId> + <groupId>org.apache.dubbo</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>dubbo-client-kryo</artifactId> + + <dependencies> + <dependency> + <groupId>org.apache.dubbo</groupId> + <artifactId>benchmark-base</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>com.esotericsoftware</groupId> + <artifactId>kryo</artifactId> + </dependency> + + <dependency> + <groupId>de.javakaffee</groupId> + <artifactId>kryo-serializers</artifactId> + </dependency> + + <dependency> + <groupId>com.esotericsoftware</groupId> + <artifactId>kryo</artifactId> + </dependency> + + <dependency> + <groupId>org.openjdk.jmh</groupId> + <artifactId>jmh-core</artifactId> + </dependency> + + <dependency> + <groupId>org.openjdk.jmh</groupId> + <artifactId>jmh-generator-annprocess</artifactId> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>copy-dependencies</id> + <phase>prepare-package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + <configuration> + <outputDirectory> + ${project.build.directory}/libs + </outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + <classpathPrefix>libs/</classpathPrefix> + <mainClass>org.apache.dubbo.benchmark.Client</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/dubbo-kryo-client/src/main/java/org/apache/dubbo/benchmark/Client.java b/dubbo-kryo-client/src/main/java/org/apache/dubbo/benchmark/Client.java new file mode 100644 index 0000000..08fe221 --- /dev/null +++ b/dubbo-kryo-client/src/main/java/org/apache/dubbo/benchmark/Client.java @@ -0,0 +1,95 @@ +package org.apache.dubbo.benchmark; + +import com.alibaba.dubbo.config.ProtocolConfig; +import org.apache.dubbo.benchmark.bean.Page; +import org.apache.dubbo.benchmark.bean.User; +import org.apache.dubbo.benchmark.rpc.AbstractClient; +import org.apache.dubbo.benchmark.service.UserService; +import org.openjdk.jmh.annotations.Benchmark; +import org.openjdk.jmh.annotations.BenchmarkMode; +import org.openjdk.jmh.annotations.Mode; +import org.openjdk.jmh.annotations.OutputTimeUnit; +import org.openjdk.jmh.annotations.Scope; +import org.openjdk.jmh.annotations.State; +import org.openjdk.jmh.annotations.TearDown; +import org.openjdk.jmh.results.format.ResultFormatType; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; +import org.openjdk.jmh.runner.options.TimeValue; +import org.springframework.context.support.ClassPathXmlApplicationContext; + +import java.io.IOException; +import java.util.concurrent.TimeUnit; + +@State(Scope.Benchmark) +public class Client extends AbstractClient { + private static final int CONCURRENCY = 32; + + private final ClassPathXmlApplicationContext context; + private final UserService userService; + + public Client() { + context = new ClassPathXmlApplicationContext("consumer.xml"); + context.start(); + userService = (UserService) context.getBean("userService"); + } + + @Override + protected UserService getUserService() { + return userService; + } + + @TearDown + public void close() throws IOException { + context.close(); + ProtocolConfig.destroyAll(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public boolean existUser() throws Exception { + return super.existUser(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public boolean createUser() throws Exception { + return super.createUser(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public User getUser() throws Exception { + return super.getUser(); + } + + @Benchmark + @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime}) + @OutputTimeUnit(TimeUnit.MILLISECONDS) + @Override + public Page<User> listUser() throws Exception { + return super.listUser(); + } + + public static void main(String[] args) throws Exception { + Options opt = new OptionsBuilder() + .include(Client.class.getSimpleName()) + .warmupIterations(3) + .warmupTime(TimeValue.seconds(10)) + .measurementIterations(3) + .measurementTime(TimeValue.seconds(10)) + .threads(CONCURRENCY) + .resultFormat(ResultFormatType.JSON) + .forks(1) + .build(); + + new Runner(opt).run(); + } +} diff --git a/dubbo-kryo-client/src/main/resources/benchmark.properties b/dubbo-kryo-client/src/main/resources/benchmark.properties new file mode 100644 index 0000000..9d276bf --- /dev/null +++ b/dubbo-kryo-client/src/main/resources/benchmark.properties @@ -0,0 +1,2 @@ +server.host=localhost +server.port=8080 \ No newline at end of file diff --git a/dubbo-kryo-client/src/main/resources/consumer.xml b/dubbo-kryo-client/src/main/resources/consumer.xml new file mode 100644 index 0000000..22c89f9 --- /dev/null +++ b/dubbo-kryo-client/src/main/resources/consumer.xml @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> + <dubbo:application name="dubbo-client-kyro"/> + <dubbo:reference id="userService" check="false" + interface="org.apache.dubbo.benchmark.service.UserService" + url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&serialization=kryo"/> + <dubbo:consumer client="netty4" filter="-default"/> +</beans> \ No newline at end of file diff --git a/dubbo-kryo-client/src/main/resources/logback.xml b/dubbo-kryo-client/src/main/resources/logback.xml new file mode 100644 index 0000000..cb8c9fd --- /dev/null +++ b/dubbo-kryo-client/src/main/resources/logback.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <jmxConfigurator/> + + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + </pattern> + </encoder> + </appender> + + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>logs/dubbo-kyro-client.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz</fileNamePattern> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> + </encoder> + </appender> + + <logger name="benchmark.rpc" level="INFO"/> + + <root level="INFO"> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="FILE"/> + </root> +</configuration> diff --git a/dubbo-kryo-server/pom.xml b/dubbo-kryo-server/pom.xml new file mode 100644 index 0000000..4d5f6bd --- /dev/null +++ b/dubbo-kryo-server/pom.xml @@ -0,0 +1,99 @@ +<?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/xsd/maven-4.0.0.xsd"> + <parent> + <artifactId>dubbo-benchmark</artifactId> + <groupId>org.apache.dubbo</groupId> + <version>1.0-SNAPSHOT</version> + </parent> + <modelVersion>4.0.0</modelVersion> + + <artifactId>dubbo-kryo-server</artifactId> + + <dependencies> + <dependency> + <groupId>org.apache.dubbo</groupId> + <artifactId>benchmark-base</artifactId> + <version>${project.version}</version> + </dependency> + + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>dubbo</artifactId> + </dependency> + + <dependency> + <groupId>io.netty</groupId> + <artifactId>netty-all</artifactId> + </dependency> + + <dependency> + <groupId>de.javakaffee</groupId> + <artifactId>kryo-serializers</artifactId> + </dependency> + + <dependency> + <groupId>com.esotericsoftware</groupId> + <artifactId>kryo</artifactId> + <version>${kryo.version}</version> + </dependency> + + <dependency> + <groupId>org.openjdk.jmh</groupId> + <artifactId>jmh-core</artifactId> + </dependency> + + <dependency> + <groupId>org.openjdk.jmh</groupId> + <artifactId>jmh-generator-annprocess</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency> + </dependencies> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-dependency-plugin</artifactId> + <executions> + <execution> + <id>copy-dependencies</id> + <phase>prepare-package</phase> + <goals> + <goal>copy-dependencies</goal> + </goals> + <configuration> + <outputDirectory> + ${project.build.directory}/libs + </outputDirectory> + </configuration> + </execution> + </executions> + </plugin> + + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-jar-plugin</artifactId> + <configuration> + <archive> + <manifest> + <addClasspath>true</addClasspath> + <classpathPrefix>libs/</classpathPrefix> + <mainClass>org.apache.dubbo.benchmark.Server</mainClass> + </manifest> + </archive> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file diff --git a/dubbo-kryo-server/src/main/java/org/apache/dubbo/benchmark/Server.java b/dubbo-kryo-server/src/main/java/org/apache/dubbo/benchmark/Server.java new file mode 100644 index 0000000..6787d36 --- /dev/null +++ b/dubbo-kryo-server/src/main/java/org/apache/dubbo/benchmark/Server.java @@ -0,0 +1,14 @@ +package org.apache.dubbo.benchmark; + +import org.springframework.context.support.ClassPathXmlApplicationContext; + +public class Server { + + public static void main(String[] args) throws InterruptedException { + try (ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml")) { + context.start(); + Thread.sleep(Integer.MAX_VALUE); + } + } + +} diff --git a/dubbo-kryo-server/src/main/resources/benchmark.properties b/dubbo-kryo-server/src/main/resources/benchmark.properties new file mode 100644 index 0000000..9d276bf --- /dev/null +++ b/dubbo-kryo-server/src/main/resources/benchmark.properties @@ -0,0 +1,2 @@ +server.host=localhost +server.port=8080 \ No newline at end of file diff --git a/dubbo-kryo-server/src/main/resources/logback.xml b/dubbo-kryo-server/src/main/resources/logback.xml new file mode 100644 index 0000000..3ba87e6 --- /dev/null +++ b/dubbo-kryo-server/src/main/resources/logback.xml @@ -0,0 +1,28 @@ +<?xml version="1.0" encoding="UTF-8"?> +<configuration> + <jmxConfigurator/> + + <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + </pattern> + </encoder> + </appender> + + <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <file>logs/dubbo-kryo-server.log</file> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz</fileNamePattern> + </rollingPolicy> + <encoder> + <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern> + </encoder> + </appender> + + <logger name="benchmark.rpc" level="INFO"/> + + <root level="INFO"> + <appender-ref ref="CONSOLE" /> + <appender-ref ref="FILE"/> + </root> +</configuration> diff --git a/dubbo-kryo-server/src/main/resources/provider.xml b/dubbo-kryo-server/src/main/resources/provider.xml new file mode 100644 index 0000000..3666e87 --- /dev/null +++ b/dubbo-kryo-server/src/main/resources/provider.xml @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<beans xmlns="http://www.springframework.org/schema/beans" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" + xmlns:context="http://www.springframework.org/schema/context" + xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> + <context:property-placeholder location="classpath:benchmark.properties" system-properties-mode="OVERRIDE"/> + <dubbo:application name="dubbo-server-kryo" /> + <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="kryo" + optimizer="org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl"/> + <dubbo:registry address="N/A"/> + <dubbo:service interface="org.apache.dubbo.benchmark.service.UserService" ref="userService" filter="-default"/> + <bean id="userService" class="org.apache.dubbo.benchmark.service.UserServiceServerImpl"/> +</beans> \ No newline at end of file diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..20bea57 --- /dev/null +++ b/pom.xml @@ -0,0 +1,133 @@ +<?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/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + + <groupId>org.apache.dubbo</groupId> + <artifactId>dubbo-benchmark</artifactId> + <packaging>pom</packaging> + <version>1.0-SNAPSHOT</version> + + <properties> + <java.source>1.8</java.source> + <java.target>1.8</java.target> + <dubbo.version>2.6.1</dubbo.version> + <netty.version>4.1.25.Final</netty.version> + <kryo.version>4.0.2</kryo.version> + <kryo-serializers.version>0.42</kryo-serializers.version> + <jmh.version>1.21</jmh.version> + <slf4j.version>1.7.25</slf4j.version> + <logback.version>1.2.3</logback.version> + <junit.version>4.12</junit.version> + </properties> + + <modules> + <module>benchmark-base</module> + <module>dubbo-kryo-client</module> + <module>dubbo-kryo-server</module> + </modules> + + <dependencies> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>dubbo</artifactId> + </dependency> + + <dependency> + <groupId>io.netty</groupId> + <artifactId>netty-all</artifactId> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + </dependency> + + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency> + </dependencies> + + <dependencyManagement> + <dependencies> + <!-- use netty 4 by default --> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>dubbo</artifactId> + <version>${dubbo.version}</version> + <exclusions> + <exclusion> + <groupId>org.jboss.netty</groupId> + <artifactId>netty</artifactId> + </exclusion> + </exclusions> + </dependency> + + <dependency> + <groupId>io.netty</groupId> + <artifactId>netty-all</artifactId> + <version>${netty.version}</version> + </dependency> + + <dependency> + <groupId>de.javakaffee</groupId> + <artifactId>kryo-serializers</artifactId> + <version>${kryo-serializers.version}</version> + </dependency> + + <dependency> + <groupId>com.esotericsoftware</groupId> + <artifactId>kryo</artifactId> + <version>${kryo.version}</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> + </dependency> + + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <version>${junit.version}</version> + <scope>test</scope> + </dependency> + + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-api</artifactId> + <version>${slf4j.version}</version> + </dependency> + + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + <version>${logback.version}</version> + </dependency> + </dependencies> + </dependencyManagement> + + <build> + <plugins> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <version>3.7.0</version> + <configuration> + <source>${java.source}</source> + <target>${java.target}</target> + <encoding>UTF-8</encoding> + </configuration> + </plugin> + </plugins> + </build> +</project> \ No newline at end of file
