You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by co...@apache.org on 2020/04/17 00:47:26 UTC

[dubbo-benchmark] branch master updated (6c12d53 -> 9e919c9)

This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git.


    from 6c12d53  Update README.md
     new 7e5abfd  upgrade to dubbo 2.7.2
     new 58f95dc  add arvo、gson、fastsjon、protostuff
     new 2a25884  add grpc、pb benchmark
     new 9e919c9  Merge pull request #8 from CodingSinger/opensource

The 16 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 .../dubbo/benchmark/bean/DubboUserServiceGrpc.java |  324 ++
 .../org/apache/dubbo/benchmark/bean/PagePB.java    | 4808 ++++++++++++++++++++
 .../dubbo/benchmark/bean/UserServiceDubbo.java     |   59 +
 .../dubbo/benchmark/bean/UserServiceGrpc.java      |  505 ++
 benchmark-base/pom.xml                             |  124 +
 .../java/org/apache/dubbo/benchmark/bean/User.java |    1 +
 .../serialize/SerializationOptimizerImpl.java      |    2 +-
 .../benchmark/service/GrpcUserServiceImpl.java     |  103 +
 .../dubbo/benchmark/service/PBUserServiceImpl.java |  119 +
 .../dubbo/benchmark/service/UserServiceImplPb.java |   91 +
 .../dubbo/benchmark/service/UserServicePb.java     |   16 +
 benchmark-base/src/main/proto/Page.proto           |   52 +
 benchmark.sh                                       |    6 -
 client-base/pom.xml                                |   11 -
 .../src/main/java/org/apache/dubbo/Client.java     |   16 -
 .../org/apache/dubbo/benchmark/ClientGrpc.java     |  121 +
 .../java/org/apache/dubbo/benchmark/ClientPb.java  |  122 +
 {dubbo-fst-client => dubbo-avro-client}/pom.xml    |   33 +-
 .../src/main/resources/consumer.xml                |    4 +-
 {dubbo-kryo-server => dubbo-avro-server}/pom.xml   |   33 +-
 .../src/main/resources/provider.xml                |    4 +-
 .../pom.xml                                        |   12 +-
 .../src/main/resources/consumer.xml                |    4 +-
 .../pom.xml                                        |    9 +-
 .../src/main/resources/provider.xml                |    4 +-
 {dubbo-kryo-client => dubbo-grpc-client}/pom.xml   |   22 +-
 .../src/main/resources/consumer.xml                |    9 +-
 .../pom.xml                                        |   14 +-
 .../src/main/resources/provider.xml                |    8 +-
 .../pom.xml                                        |    3 +-
 .../src/main/resources/consumer.xml                |    4 +-
 .../pom.xml                                        |    3 +-
 .../src/main/resources/provider.xml                |    4 +-
 dubbo-native-hessian-client/pom.xml                |    9 +-
 dubbo-native-hessian-server/pom.xml                |    9 +-
 {dubbo-kryo-client => dubbo-pb-client}/pom.xml     |   22 +-
 .../src/main/resources/consumer.xml                |    4 +-
 .../pom.xml                                        |   14 +-
 .../src/main/resources/provider.xml                |    6 +-
 .../pom.xml                                        |   23 +-
 .../src/main/resources/consumer.xml                |    6 +-
 .../pom.xml                                        |   19 +-
 .../src/main/resources/provider.xml                |    8 +-
 .../pom.xml                                        |   20 +-
 .../src/main/resources/consumer.xml                |    4 +-
 .../pom.xml                                        |   22 +-
 .../src/main/resources/provider.xml                |    4 +-
 pom.xml                                            |   60 +-
 server-base/pom.xml                                |    5 -
 49 files changed, 6692 insertions(+), 193 deletions(-)
 create mode 100644 benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/DubboUserServiceGrpc.java
 create mode 100644 benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/PagePB.java
 create mode 100644 benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceDubbo.java
 create mode 100644 benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceGrpc.java
 create mode 100644 benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/GrpcUserServiceImpl.java
 create mode 100644 benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/PBUserServiceImpl.java
 create mode 100644 benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceImplPb.java
 create mode 100644 benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServicePb.java
 create mode 100644 benchmark-base/src/main/proto/Page.proto
 delete mode 100644 client-base/src/main/java/org/apache/dubbo/Client.java
 create mode 100644 client-base/src/main/java/org/apache/dubbo/benchmark/ClientGrpc.java
 create mode 100644 client-base/src/main/java/org/apache/dubbo/benchmark/ClientPb.java
 copy {dubbo-fst-client => dubbo-avro-client}/pom.xml (55%)
 copy {dubbo-fst-client => dubbo-avro-client}/src/main/resources/consumer.xml (94%)
 copy {dubbo-kryo-server => dubbo-avro-server}/pom.xml (53%)
 copy {dubbo-fst-server => dubbo-avro-server}/src/main/resources/provider.xml (92%)
 copy {dubbo-fst-client => dubbo-fastjson-client}/pom.xml (85%)
 copy {dubbo-fst-client => dubbo-fastjson-client}/src/main/resources/consumer.xml (94%)
 copy {dubbo-kryo-server => dubbo-fastjson-server}/pom.xml (88%)
 copy {dubbo-fst-server => dubbo-fastjson-server}/src/main/resources/provider.xml (91%)
 copy {dubbo-kryo-client => dubbo-grpc-client}/pom.xml (79%)
 copy {dubbo-hessianlite-client => dubbo-grpc-client}/src/main/resources/consumer.xml (69%)
 copy {dubbo-native-hessian-server => dubbo-grpc-server}/pom.xml (78%)
 copy {dubbo-hessianlite-server => dubbo-grpc-server}/src/main/resources/provider.xml (71%)
 copy {dubbo-hessianlite-client => dubbo-gson-client}/pom.xml (95%)
 copy {dubbo-native-hessian-client => dubbo-gson-client}/src/main/resources/consumer.xml (90%)
 copy {dubbo-hessianlite-server => dubbo-gson-server}/pom.xml (95%)
 copy {dubbo-hessianlite-server => dubbo-gson-server}/src/main/resources/provider.xml (90%)
 copy {dubbo-kryo-client => dubbo-pb-client}/pom.xml (79%)
 copy {dubbo-hessianlite-client => dubbo-pb-client}/src/main/resources/consumer.xml (85%)
 copy {dubbo-native-hessian-server => dubbo-pb-server}/pom.xml (78%)
 copy {dubbo-hessianlite-server => dubbo-pb-server}/src/main/resources/provider.xml (79%)
 copy {dubbo-kryo-client => dubbo-protobuf-json-client}/pom.xml (79%)
 copy {dubbo-native-hessian-client => dubbo-protobuf-json-client}/src/main/resources/consumer.xml (82%)
 copy {dubbo-native-hessian-server => dubbo-protobuf-json-server}/pom.xml (78%)
 copy {dubbo-native-hessian-server => dubbo-protobuf-json-server}/src/main/resources/provider.xml (77%)
 copy {dubbo-kryo-client => dubbo-protostuff-client}/pom.xml (74%)
 copy {dubbo-native-hessian-client => dubbo-protostuff-client}/src/main/resources/consumer.xml (90%)
 copy {dubbo-kryo-client => dubbo-protostuff-server}/pom.xml (72%)
 copy {dubbo-native-hessian-server => dubbo-protostuff-server}/src/main/resources/provider.xml (89%)


[dubbo-benchmark] 10/16: Update dubbo version to 2.7.2

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit a8be15a41a573b1fd91713f82682f4151be784c7
Author: Huang YunKun <ht...@gmail.com>
AuthorDate: Thu Jul 18 21:41:40 2019 +0800

    Update dubbo version to 2.7.2
    
    * add snapshot mode
    
    * exclude wrong lib when copy
    
    * exclude wrong lib when copy
    
    * polish
    
    * update to latest version
    
    * update to latest version
---
 .../dubbo/benchmark/serialize/SerializationOptimizerImpl.java       | 2 +-
 client-base/pom.xml                                                 | 2 +-
 client-base/src/main/java/org/apache/dubbo/benchmark/Client.java    | 3 ---
 pom.xml                                                             | 6 +++---
 server-base/pom.xml                                                 | 2 +-
 5 files changed, 6 insertions(+), 9 deletions(-)

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
index 9c47274..505e1ee 100644
--- 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
@@ -1,9 +1,9 @@
 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 org.apache.dubbo.common.serialize.support.SerializationOptimizer;
 
 import java.util.Arrays;
 import java.util.Collection;
diff --git a/client-base/pom.xml b/client-base/pom.xml
index 3f279f1..d4adb21 100644
--- a/client-base/pom.xml
+++ b/client-base/pom.xml
@@ -19,7 +19,7 @@
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba</groupId>
+            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
         </dependency>
 
diff --git a/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
index 8b52142..bb57bd7 100644
--- a/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
+++ b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
@@ -1,7 +1,5 @@
 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;
@@ -43,7 +41,6 @@ public class Client extends AbstractClient {
 
     @TearDown
     public void close() throws IOException {
-        ProtocolConfig.destroyAll();
         context.close();
     }
 
diff --git a/pom.xml b/pom.xml
index ea0d6c0..94af7a0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
     <properties>
         <java.source>1.8</java.source>
         <java.target>1.8</java.target>
-        <dubbo.version>2.6.1</dubbo.version>
+        <dubbo.version>2.7.2</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>
@@ -40,7 +40,7 @@
 
     <dependencies>
         <dependency>
-            <groupId>com.alibaba</groupId>
+            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
         </dependency>
 
@@ -64,7 +64,7 @@
         <dependencies>
             <!-- use netty 4 by default -->
             <dependency>
-                <groupId>com.alibaba</groupId>
+                <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo</artifactId>
                 <version>${dubbo.version}</version>
                 <exclusions>
diff --git a/server-base/pom.xml b/server-base/pom.xml
index 2a11cf2..e6392a9 100644
--- a/server-base/pom.xml
+++ b/server-base/pom.xml
@@ -19,7 +19,7 @@
         </dependency>
 
         <dependency>
-            <groupId>com.alibaba</groupId>
+            <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
         </dependency>
 


[dubbo-benchmark] 14/16: add arvo、gson、fastsjon、protostuff

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 58f95dce8fab1e3598944939b1325e9e8e831d72
Author: CodingSinger <oo...@gmail.com>
AuthorDate: Mon Jul 22 11:18:30 2019 +0800

    add arvo、gson、fastsjon、protostuff
---
 .../pom.xml                                        | 19 ++++++------------
 dubbo-avro-client/src/main/resources/consumer.xml  | 16 +++++++++++++++
 .../pom.xml                                        | 14 +++----------
 dubbo-avro-server/src/main/resources/provider.xml  | 16 +++++++++++++++
 .../pom.xml                                        | 15 ++++----------
 .../src/main/resources/consumer.xml                | 16 +++++++++++++++
 .../pom.xml                                        | 15 ++++----------
 .../src/main/resources/provider.xml                | 16 +++++++++++++++
 .../pom.xml                                        | 18 ++---------------
 dubbo-gson-client/src/main/resources/consumer.xml  | 12 +++++++++++
 .../pom.xml                                        | 18 ++---------------
 dubbo-gson-server/src/main/resources/provider.xml  | 12 +++++++++++
 dubbo-native-hessian-server/pom.xml                |  2 +-
 .../pom.xml                                        | 23 ++++++++++++----------
 .../src/main/resources/consumer.xml                | 12 +++++++++++
 .../pom.xml                                        | 23 ++++++++++++----------
 .../src/main/resources/provider.xml                | 13 ++++++++++++
 pom.xml                                            | 10 +++++++++-
 18 files changed, 170 insertions(+), 100 deletions(-)

diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-avro-client/pom.xml
similarity index 74%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-avro-client/pom.xml
index 5e7cbd4..ea76927 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-avro-client/pom.xml
@@ -9,40 +9,33 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
-
+    <artifactId>dubbo-avro-client</artifactId>
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <groupId>org.apache.avro</groupId>
+            <artifactId>avro</artifactId>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
+                <inherited>true</inherited>
             </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
+                <inherited>true</inherited>
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-avro-client/src/main/resources/consumer.xml b/dubbo-avro-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..eb6950d
--- /dev/null
+++ b/dubbo-avro-client/src/main/resources/consumer.xml
@@ -0,0 +1,16 @@
+<?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-avro-client"/>
+    <!-- FIXME: need to investigate why serialization optimizer doesn't work -->
+    <!--<dubbo:reference id="userService" check="false"-->
+                     <!--interface="org.apache.dubbo.benchmark.service.UserService"-->
+                     <!--url="dubbo://${server.host}:${server.port}?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=fst"/>-->
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.service.UserService"
+                     url="dubbo://${server.host}:${server.port}?serialization=avro"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-avro-server/pom.xml
similarity index 76%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-avro-server/pom.xml
index 5e7cbd4..ba3e693 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-avro-server/pom.xml
@@ -9,21 +9,14 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-avro-server</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <groupId>org.apache.avro</groupId>
+            <artifactId>avro</artifactId>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
@@ -44,5 +37,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-avro-server/src/main/resources/provider.xml b/dubbo-avro-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..0a1cc36
--- /dev/null
+++ b/dubbo-avro-server/src/main/resources/provider.xml
@@ -0,0 +1,16 @@
+<?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-avro-server"/>
+
+    <!-- FIXME: need to investigate why serialization optimizer doesn't work -->
+    <!--<dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="fst"-->
+                    <!--optimizer="org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl"/>-->
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="avro"/>
+    <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-native-hessian-server/pom.xml b/dubbo-fastjson-client/pom.xml
similarity index 76%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-fastjson-client/pom.xml
index 5e7cbd4..8846b59 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-fastjson-client/pom.xml
@@ -9,21 +9,15 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-fastjson-client</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.58</version>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
@@ -44,5 +38,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-fastjson-client/src/main/resources/consumer.xml b/dubbo-fastjson-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..bddeb47
--- /dev/null
+++ b/dubbo-fastjson-client/src/main/resources/consumer.xml
@@ -0,0 +1,16 @@
+<?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-fastjson-client"/>
+    <!-- FIXME: need to investigate why serialization optimizer doesn't work -->
+    <!--<dubbo:reference id="userService" check="false"-->
+                     <!--interface="org.apache.dubbo.benchmark.service.UserService"-->
+                     <!--url="dubbo://${server.host}:${server.port}?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=fst"/>-->
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.service.UserService"
+                     url="dubbo://${server.host}:${server.port}?serialization=fastjson"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-fastjson-server/pom.xml
similarity index 76%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-fastjson-server/pom.xml
index 5e7cbd4..5654d8d 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-fastjson-server/pom.xml
@@ -9,21 +9,15 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-fastjson-server</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.58</version>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
@@ -44,5 +38,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-fastjson-server/src/main/resources/provider.xml b/dubbo-fastjson-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..25ec43c
--- /dev/null
+++ b/dubbo-fastjson-server/src/main/resources/provider.xml
@@ -0,0 +1,16 @@
+<?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-fastjson-server"/>
+
+    <!-- FIXME: need to investigate why serialization optimizer doesn't work -->
+    <!--<dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="fst"-->
+                    <!--optimizer="org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl"/>-->
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="fastjson"/>
+    <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-native-hessian-server/pom.xml b/dubbo-gson-client/pom.xml
similarity index 69%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-gson-client/pom.xml
index 5e7cbd4..98d29bd 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-gson-client/pom.xml
@@ -9,20 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
-        </dependency>
-    </dependencies>
+    <artifactId>dubbo-gson-client</artifactId>
 
     <build>
         <plugins>
@@ -37,12 +24,11 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-gson-client/src/main/resources/consumer.xml b/dubbo-gson-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..5c44bbf
--- /dev/null
+++ b/dubbo-gson-client/src/main/resources/consumer.xml
@@ -0,0 +1,12 @@
+<?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-kyro-client"/>
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.service.UserService"
+                     url="dubbo://${server.host}:${server.port}?serialization=gson"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-gson-server/pom.xml
similarity index 69%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-gson-server/pom.xml
index 5e7cbd4..09a58f9 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-gson-server/pom.xml
@@ -9,20 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
-        </dependency>
-
-        <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
-        </dependency>
-    </dependencies>
+    <artifactId>dubbo-gson-server</artifactId>
 
     <build>
         <plugins>
@@ -37,12 +24,11 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-gson-server/src/main/resources/provider.xml b/dubbo-gson-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..abd1f6e
--- /dev/null
+++ b/dubbo-gson-server/src/main/resources/provider.xml
@@ -0,0 +1,12 @@
+<?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-gson-server"/>
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="gson"/>
+    <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-native-hessian-server/pom.xml b/dubbo-native-hessian-server/pom.xml
index 5e7cbd4..c1421b8 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-native-hessian-server/pom.xml
@@ -20,7 +20,7 @@
 
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <artifactId>dubbo-serialization-native-hession</artifactId>
         </dependency>
     </dependencies>
 
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-protostuff-client/pom.xml
similarity index 70%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-protostuff-client/pom.xml
index 5e7cbd4..55b0c95 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-protostuff-client/pom.xml
@@ -9,21 +9,25 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-protostuff-client</artifactId>
 
     <dependencies>
+        <!-- Protostuff -->
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
+            <groupId>io.protostuff</groupId>
+            <artifactId>protostuff-core</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <groupId>io.protostuff</groupId>
+            <artifactId>protostuff-runtime</artifactId>
+        </dependency>
+        <!-- Objenesis -->
+        <dependency>
+            <groupId>org.objenesis</groupId>
+            <artifactId>objenesis</artifactId>
+            <version>2.5</version>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
@@ -37,12 +41,11 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-protostuff-client/src/main/resources/consumer.xml b/dubbo-protostuff-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..465157d
--- /dev/null
+++ b/dubbo-protostuff-client/src/main/resources/consumer.xml
@@ -0,0 +1,12 @@
+<?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-protostuff-client"/>
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.service.UserService"
+                     url="dubbo://${server.host}:${server.port}?serialization=protostuff"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-protostuff-server/pom.xml
similarity index 70%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-protostuff-server/pom.xml
index 5e7cbd4..2ff8a28 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-protostuff-server/pom.xml
@@ -9,21 +9,25 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-protostuff-server</artifactId>
 
     <dependencies>
+        <!-- Protostuff -->
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
+            <groupId>io.protostuff</groupId>
+            <artifactId>protostuff-core</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <groupId>io.protostuff</groupId>
+            <artifactId>protostuff-runtime</artifactId>
+        </dependency>
+        <!-- Objenesis -->
+        <dependency>
+            <groupId>org.objenesis</groupId>
+            <artifactId>objenesis</artifactId>
+            <version>2.5</version>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
@@ -37,12 +41,11 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-protostuff-server/src/main/resources/provider.xml b/dubbo-protostuff-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..85cb563
--- /dev/null
+++ b/dubbo-protostuff-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-protostuff-server"/>
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}"
+                    serialization="protostuff"/>
+    <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
index 408e17f..783d373 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,14 @@
         <module>dubbo-fst-server</module>
         <module>dubbo-native-hessian-client</module>
         <module>dubbo-native-hessian-server</module>
+        <module>dubbo-avro-server</module>
+        <module>dubbo-avro-client</module>
+        <module>dubbo-fastjson-client</module>
+        <module>dubbo-fastjson-server</module>
+        <module>dubbo-protostuff-server</module>
+        <module>dubbo-protostuff-client</module>
+        <module>dubbo-gson-server</module>
+        <module>dubbo-gson-client</module>
     </modules>
 
     <dependencies>
@@ -128,7 +136,7 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-native-hessian</artifactId>
+                <artifactId>dubbo-serialization-native-hession</artifactId>
                 <version>${dubbo.version}</version>
             </dependency>
         </dependencies>


[dubbo-benchmark] 09/16: Merge pull request #2 from zonghaishang/master

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit c22b29d4944778390642baa1e5da2380600c64b8
Merge: c1e2921 5aaf493
Author: Ian Luo <ia...@gmail.com>
AuthorDate: Mon Sep 17 13:17:55 2018 +0800

    Merge pull request #2 from zonghaishang/master
    
    Support -f output to file

 README.md                                          |  4 +--
 benchmark.sh                                       | 32 ++++++++++++++--------
 .../java/org/apache/dubbo/benchmark/Client.java    | 22 +++++++++++----
 3 files changed, 39 insertions(+), 19 deletions(-)


[dubbo-benchmark] 15/16: add grpc、pb benchmark

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 2a258843c266cdb114c7a6069a02dc5cef0350f3
Author: CodingSinger <oo...@gmail.com>
AuthorDate: Mon Jul 22 11:24:03 2019 +0800

    add grpc、pb benchmark
---
 .../dubbo/benchmark/bean/DubboUserServiceGrpc.java |  324 ++
 .../org/apache/dubbo/benchmark/bean/PagePB.java    | 4808 ++++++++++++++++++++
 .../dubbo/benchmark/bean/UserServiceDubbo.java     |   59 +
 .../dubbo/benchmark/bean/UserServiceGrpc.java      |  505 ++
 benchmark-base/pom.xml                             |  124 +
 .../java/org/apache/dubbo/benchmark/bean/User.java |    1 +
 .../serialize/SerializationOptimizerImpl.java      |    2 +-
 .../benchmark/service/GrpcUserServiceImpl.java     |  103 +
 .../dubbo/benchmark/service/PBUserServiceImpl.java |  119 +
 .../dubbo/benchmark/service/UserServiceImplPb.java |   91 +
 .../dubbo/benchmark/service/UserServicePb.java     |   16 +
 benchmark-base/src/main/proto/Page.proto           |   52 +
 benchmark.sh                                       |    6 -
 .../src/main/java/org/apache/dubbo/Client.java     |   16 -
 .../org/apache/dubbo/benchmark/ClientGrpc.java     |  121 +
 .../java/org/apache/dubbo/benchmark/ClientPb.java  |  122 +
 dubbo-avro-client/pom.xml                          |   30 +
 dubbo-avro-server/pom.xml                          |   30 +
 dubbo-fastjson-client/pom.xml                      |    7 +-
 dubbo-fastjson-server/pom.xml                      |    5 +
 .../pom.xml                                        |   24 +-
 dubbo-grpc-client/src/main/resources/consumer.xml  |   11 +
 .../pom.xml                                        |   14 +-
 dubbo-grpc-server/src/main/resources/provider.xml  |   12 +
 dubbo-gson-client/pom.xml                          |    7 +
 dubbo-gson-server/pom.xml                          |    9 +-
 dubbo-native-hessian-client/pom.xml                |   10 +-
 dubbo-native-hessian-server/pom.xml                |    9 +-
 .../pom.xml                                        |   24 +-
 dubbo-pb-client/src/main/resources/consumer.xml    |   12 +
 .../pom.xml                                        |   14 +-
 dubbo-pb-server/src/main/resources/provider.xml    |   12 +
 .../pom.xml                                        |   25 +-
 .../src/main/resources/consumer.xml                |   12 +
 .../pom.xml                                        |   19 +-
 .../src/main/resources/provider.xml                |   13 +
 dubbo-protostuff-client/pom.xml                    |    5 +
 dubbo-protostuff-server/pom.xml                    |    5 +
 pom.xml                                            |   30 +-
 39 files changed, 6718 insertions(+), 90 deletions(-)

diff --git a/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/DubboUserServiceGrpc.java b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/DubboUserServiceGrpc.java
new file mode 100644
index 0000000..02228a1
--- /dev/null
+++ b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/DubboUserServiceGrpc.java
@@ -0,0 +1,324 @@
+
+    package org.apache.dubbo.benchmark.bean;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.config.ReferenceConfigBase;
+
+import java.util.concurrent.TimeUnit;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
+
+import static org.apache.dubbo.benchmark.bean.UserServiceGrpc.getServiceDescriptor;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+@javax.annotation.Generated(
+value = "by DubboGrpc generator",
+comments = "Source: Page.proto")
+public final class DubboUserServiceGrpc {
+private DubboUserServiceGrpc() {}
+
+public static class DubboUserServiceStub implements IUserService {
+
+protected URL url;
+protected ReferenceConfigBase<?> referenceConfig;
+
+protected UserServiceGrpc.UserServiceBlockingStub blockingStub;
+protected UserServiceGrpc.UserServiceFutureStub futureStub;
+protected UserServiceGrpc.UserServiceStub stub;
+
+public DubboUserServiceStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+this.url = url;
+this.referenceConfig = referenceConfig;
+
+blockingStub = UserServiceGrpc.newBlockingStub(channel).build(channel, callOptions);
+futureStub = UserServiceGrpc.newFutureStub(channel).build(channel, callOptions);
+stub = UserServiceGrpc.newStub(channel).build(channel, callOptions);
+}
+
+    public org.apache.dubbo.benchmark.bean.PagePB.Response existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return blockingStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .existUser(request);
+    }
+
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> existUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return futureStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .existUser(request);
+    }
+
+    public void existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver){
+    stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .existUser(request, responseObserver);
+    }
+
+    public org.apache.dubbo.benchmark.bean.PagePB.Response createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return blockingStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .createUser(request);
+    }
+
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> createUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return futureStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .createUser(request);
+    }
+
+    public void createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver){
+    stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .createUser(request, responseObserver);
+    }
+
+    public org.apache.dubbo.benchmark.bean.PagePB.Response getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return blockingStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .getUser(request);
+    }
+
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> getUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return futureStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .getUser(request);
+    }
+
+    public void getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver){
+    stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .getUser(request, responseObserver);
+    }
+
+    public org.apache.dubbo.benchmark.bean.PagePB.Response listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return blockingStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .listUser(request);
+    }
+
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> listUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    return futureStub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .listUser(request);
+    }
+
+    public void listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver){
+    stub
+    .withDeadlineAfter(url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT), TimeUnit.MILLISECONDS)
+    .listUser(request, responseObserver);
+    }
+
+}
+
+public static DubboUserServiceStub getDubboStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions, URL url, ReferenceConfigBase<?> referenceConfig) {
+return new DubboUserServiceStub(channel, callOptions, url, referenceConfig);
+}
+
+public interface IUserService {
+    default public org.apache.dubbo.benchmark.bean.PagePB.Response existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    default public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> existUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    public void existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver);
+
+    default public org.apache.dubbo.benchmark.bean.PagePB.Response createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    default public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> createUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    public void createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver);
+
+    default public org.apache.dubbo.benchmark.bean.PagePB.Response getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    default public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> getUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    public void getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver);
+
+    default public org.apache.dubbo.benchmark.bean.PagePB.Response listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    default public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> listUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    public void listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request, io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver);
+
+}
+
+public static abstract class UserServiceImplBase implements io.grpc.BindableService, IUserService {
+
+private IUserService proxiedImpl;
+
+public final void setProxiedImpl(IUserService proxiedImpl) {
+this.proxiedImpl = proxiedImpl;
+}
+
+    @java.lang.Override
+    public final org.apache.dubbo.benchmark.bean.PagePB.Response existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> existUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final org.apache.dubbo.benchmark.bean.PagePB.Response createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> createUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final org.apache.dubbo.benchmark.bean.PagePB.Response getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> getUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final org.apache.dubbo.benchmark.bean.PagePB.Response listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+    @java.lang.Override
+    public final com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> listUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+    throw new UnsupportedOperationException("No need to override this method, extend XxxImplBase and override all methods it allows.");
+    }
+
+        public void existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+        asyncUnimplementedUnaryCall(org.apache.dubbo.benchmark.bean.UserServiceGrpc.getExistUserMethod(), responseObserver);
+        }
+        public void createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+        asyncUnimplementedUnaryCall(org.apache.dubbo.benchmark.bean.UserServiceGrpc.getCreateUserMethod(), responseObserver);
+        }
+        public void getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+        asyncUnimplementedUnaryCall(org.apache.dubbo.benchmark.bean.UserServiceGrpc.getGetUserMethod(), responseObserver);
+        }
+        public void listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+        asyncUnimplementedUnaryCall(org.apache.dubbo.benchmark.bean.UserServiceGrpc.getListUserMethod(), responseObserver);
+        }
+
+@java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+    .addMethod(
+    org.apache.dubbo.benchmark.bean.UserServiceGrpc.getExistUserMethod(),
+    asyncUnaryCall(
+    new MethodHandlers<
+    org.apache.dubbo.benchmark.bean.PagePB.Request,
+    org.apache.dubbo.benchmark.bean.PagePB.Response>(
+    proxiedImpl, METHODID_EXIST_USER)))
+    .addMethod(
+    org.apache.dubbo.benchmark.bean.UserServiceGrpc.getCreateUserMethod(),
+    asyncUnaryCall(
+    new MethodHandlers<
+    org.apache.dubbo.benchmark.bean.PagePB.Request,
+    org.apache.dubbo.benchmark.bean.PagePB.Response>(
+    proxiedImpl, METHODID_CREATE_USER)))
+    .addMethod(
+    org.apache.dubbo.benchmark.bean.UserServiceGrpc.getGetUserMethod(),
+    asyncUnaryCall(
+    new MethodHandlers<
+    org.apache.dubbo.benchmark.bean.PagePB.Request,
+    org.apache.dubbo.benchmark.bean.PagePB.Response>(
+    proxiedImpl, METHODID_GET_USER)))
+    .addMethod(
+    org.apache.dubbo.benchmark.bean.UserServiceGrpc.getListUserMethod(),
+    asyncUnaryCall(
+    new MethodHandlers<
+    org.apache.dubbo.benchmark.bean.PagePB.Request,
+    org.apache.dubbo.benchmark.bean.PagePB.Response>(
+    proxiedImpl, METHODID_LIST_USER)))
+.build();
+}
+}
+    private static final int METHODID_EXIST_USER = 0;
+    private static final int METHODID_CREATE_USER = 1;
+    private static final int METHODID_GET_USER = 2;
+    private static final int METHODID_LIST_USER = 3;
+
+private static final class MethodHandlers
+<Req, Resp> implements
+io.grpc.stub.ServerCalls.UnaryMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ServerStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.ClientStreamingMethod
+<Req, Resp>,
+io.grpc.stub.ServerCalls.BidiStreamingMethod
+<Req, Resp> {
+private final IUserService serviceImpl;
+private final int methodId;
+
+MethodHandlers(IUserService serviceImpl, int methodId) {
+this.serviceImpl = serviceImpl;
+this.methodId = methodId;
+}
+
+@java.lang.Override
+@java.lang.SuppressWarnings("unchecked")
+public void invoke(Req request, io.grpc.stub.StreamObserver
+<Resp> responseObserver) {
+    switch (methodId) {
+            case METHODID_EXIST_USER:
+            serviceImpl.existUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+            (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+            break;
+            case METHODID_CREATE_USER:
+            serviceImpl.createUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+            (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+            break;
+            case METHODID_GET_USER:
+            serviceImpl.getUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+            (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+            break;
+            case METHODID_LIST_USER:
+            serviceImpl.listUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+            (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+            break;
+    default:
+    throw new java.lang.AssertionError();
+    }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver
+    <Req> invoke(io.grpc.stub.StreamObserver
+        <Resp> responseObserver) {
+            switch (methodId) {
+            default:
+            throw new java.lang.AssertionError();
+            }
+            }
+            }
+
+            }
diff --git a/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/PagePB.java b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/PagePB.java
new file mode 100644
index 0000000..0dab799
--- /dev/null
+++ b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/PagePB.java
@@ -0,0 +1,4808 @@
+// Generated by the protocol buffer compiler.  DO NOT EDIT!
+// source: Page.proto
+
+package org.apache.dubbo.benchmark.bean;
+
+public final class PagePB {
+  private PagePB() {}
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistryLite registry) {
+  }
+
+  public static void registerAllExtensions(
+      com.google.protobuf.ExtensionRegistry registry) {
+    registerAllExtensions(
+        (com.google.protobuf.ExtensionRegistryLite) registry);
+  }
+  public interface PageOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:org.apache.dubbo.benchmark.bean.Page)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    java.util.List<org.apache.dubbo.benchmark.bean.PagePB.User> 
+        getUsersList();
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.User getUsers(int index);
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    int getUsersCount();
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    java.util.List<? extends org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> 
+        getUsersOrBuilderList();
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUsersOrBuilder(
+        int index);
+
+    /**
+     * <code>int32 pageNo = 2;</code>
+     */
+    int getPageNo();
+
+    /**
+     * <code>int32 total = 3;</code>
+     */
+    int getTotal();
+  }
+  /**
+   * <pre>
+   *### 编译只会生成message,service生成需要借助grpc这样的插件
+   * </pre>
+   *
+   * Protobuf type {@code org.apache.dubbo.benchmark.bean.Page}
+   */
+  public  static final class Page extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:org.apache.dubbo.benchmark.bean.Page)
+      PageOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Page.newBuilder() to construct.
+    private Page(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Page() {
+      users_ = java.util.Collections.emptyList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Page(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 10: {
+              if (!((mutable_bitField0_ & 0x00000001) != 0)) {
+                users_ = new java.util.ArrayList<org.apache.dubbo.benchmark.bean.PagePB.User>();
+                mutable_bitField0_ |= 0x00000001;
+              }
+              users_.add(
+                  input.readMessage(org.apache.dubbo.benchmark.bean.PagePB.User.parser(), extensionRegistry));
+              break;
+            }
+            case 16: {
+
+              pageNo_ = input.readInt32();
+              break;
+            }
+            case 24: {
+
+              total_ = input.readInt32();
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000001) != 0)) {
+          users_ = java.util.Collections.unmodifiableList(users_);
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Page_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Page_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.dubbo.benchmark.bean.PagePB.Page.class, org.apache.dubbo.benchmark.bean.PagePB.Page.Builder.class);
+    }
+
+    private int bitField0_;
+    public static final int USERS_FIELD_NUMBER = 1;
+    private java.util.List<org.apache.dubbo.benchmark.bean.PagePB.User> users_;
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    public java.util.List<org.apache.dubbo.benchmark.bean.PagePB.User> getUsersList() {
+      return users_;
+    }
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    public java.util.List<? extends org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> 
+        getUsersOrBuilderList() {
+      return users_;
+    }
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    public int getUsersCount() {
+      return users_.size();
+    }
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.User getUsers(int index) {
+      return users_.get(index);
+    }
+    /**
+     * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUsersOrBuilder(
+        int index) {
+      return users_.get(index);
+    }
+
+    public static final int PAGENO_FIELD_NUMBER = 2;
+    private int pageNo_;
+    /**
+     * <code>int32 pageNo = 2;</code>
+     */
+    public int getPageNo() {
+      return pageNo_;
+    }
+
+    public static final int TOTAL_FIELD_NUMBER = 3;
+    private int total_;
+    /**
+     * <code>int32 total = 3;</code>
+     */
+    public int getTotal() {
+      return total_;
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      for (int i = 0; i < users_.size(); i++) {
+        output.writeMessage(1, users_.get(i));
+      }
+      if (pageNo_ != 0) {
+        output.writeInt32(2, pageNo_);
+      }
+      if (total_ != 0) {
+        output.writeInt32(3, total_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      for (int i = 0; i < users_.size(); i++) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(1, users_.get(i));
+      }
+      if (pageNo_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(2, pageNo_);
+      }
+      if (total_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(3, total_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.dubbo.benchmark.bean.PagePB.Page)) {
+        return super.equals(obj);
+      }
+      org.apache.dubbo.benchmark.bean.PagePB.Page other = (org.apache.dubbo.benchmark.bean.PagePB.Page) obj;
+
+      if (!getUsersList()
+          .equals(other.getUsersList())) return false;
+      if (getPageNo()
+          != other.getPageNo()) return false;
+      if (getTotal()
+          != other.getTotal()) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      if (getUsersCount() > 0) {
+        hash = (37 * hash) + USERS_FIELD_NUMBER;
+        hash = (53 * hash) + getUsersList().hashCode();
+      }
+      hash = (37 * hash) + PAGENO_FIELD_NUMBER;
+      hash = (53 * hash) + getPageNo();
+      hash = (37 * hash) + TOTAL_FIELD_NUMBER;
+      hash = (53 * hash) + getTotal();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.dubbo.benchmark.bean.PagePB.Page prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * <pre>
+     *### 编译只会生成message,service生成需要借助grpc这样的插件
+     * </pre>
+     *
+     * Protobuf type {@code org.apache.dubbo.benchmark.bean.Page}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:org.apache.dubbo.benchmark.bean.Page)
+        org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Page_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Page_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.dubbo.benchmark.bean.PagePB.Page.class, org.apache.dubbo.benchmark.bean.PagePB.Page.Builder.class);
+      }
+
+      // Construct using org.apache.dubbo.benchmark.bean.PagePB.Page.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+          getUsersFieldBuilder();
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        if (usersBuilder_ == null) {
+          users_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+        } else {
+          usersBuilder_.clear();
+        }
+        pageNo_ = 0;
+
+        total_ = 0;
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Page_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Page getDefaultInstanceForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.Page.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Page build() {
+        org.apache.dubbo.benchmark.bean.PagePB.Page result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Page buildPartial() {
+        org.apache.dubbo.benchmark.bean.PagePB.Page result = new org.apache.dubbo.benchmark.bean.PagePB.Page(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        if (usersBuilder_ == null) {
+          if (((bitField0_ & 0x00000001) != 0)) {
+            users_ = java.util.Collections.unmodifiableList(users_);
+            bitField0_ = (bitField0_ & ~0x00000001);
+          }
+          result.users_ = users_;
+        } else {
+          result.users_ = usersBuilder_.build();
+        }
+        result.pageNo_ = pageNo_;
+        result.total_ = total_;
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.dubbo.benchmark.bean.PagePB.Page) {
+          return mergeFrom((org.apache.dubbo.benchmark.bean.PagePB.Page)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.dubbo.benchmark.bean.PagePB.Page other) {
+        if (other == org.apache.dubbo.benchmark.bean.PagePB.Page.getDefaultInstance()) return this;
+        if (usersBuilder_ == null) {
+          if (!other.users_.isEmpty()) {
+            if (users_.isEmpty()) {
+              users_ = other.users_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+            } else {
+              ensureUsersIsMutable();
+              users_.addAll(other.users_);
+            }
+            onChanged();
+          }
+        } else {
+          if (!other.users_.isEmpty()) {
+            if (usersBuilder_.isEmpty()) {
+              usersBuilder_.dispose();
+              usersBuilder_ = null;
+              users_ = other.users_;
+              bitField0_ = (bitField0_ & ~0x00000001);
+              usersBuilder_ = 
+                com.google.protobuf.GeneratedMessageV3.alwaysUseFieldBuilders ?
+                   getUsersFieldBuilder() : null;
+            } else {
+              usersBuilder_.addAllMessages(other.users_);
+            }
+          }
+        }
+        if (other.getPageNo() != 0) {
+          setPageNo(other.getPageNo());
+        }
+        if (other.getTotal() != 0) {
+          setTotal(other.getTotal());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.dubbo.benchmark.bean.PagePB.Page parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.dubbo.benchmark.bean.PagePB.Page) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private java.util.List<org.apache.dubbo.benchmark.bean.PagePB.User> users_ =
+        java.util.Collections.emptyList();
+      private void ensureUsersIsMutable() {
+        if (!((bitField0_ & 0x00000001) != 0)) {
+          users_ = new java.util.ArrayList<org.apache.dubbo.benchmark.bean.PagePB.User>(users_);
+          bitField0_ |= 0x00000001;
+         }
+      }
+
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> usersBuilder_;
+
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public java.util.List<org.apache.dubbo.benchmark.bean.PagePB.User> getUsersList() {
+        if (usersBuilder_ == null) {
+          return java.util.Collections.unmodifiableList(users_);
+        } else {
+          return usersBuilder_.getMessageList();
+        }
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public int getUsersCount() {
+        if (usersBuilder_ == null) {
+          return users_.size();
+        } else {
+          return usersBuilder_.getCount();
+        }
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User getUsers(int index) {
+        if (usersBuilder_ == null) {
+          return users_.get(index);
+        } else {
+          return usersBuilder_.getMessage(index);
+        }
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder setUsers(
+          int index, org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (usersBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUsersIsMutable();
+          users_.set(index, value);
+          onChanged();
+        } else {
+          usersBuilder_.setMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder setUsers(
+          int index, org.apache.dubbo.benchmark.bean.PagePB.User.Builder builderForValue) {
+        if (usersBuilder_ == null) {
+          ensureUsersIsMutable();
+          users_.set(index, builderForValue.build());
+          onChanged();
+        } else {
+          usersBuilder_.setMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder addUsers(org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (usersBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUsersIsMutable();
+          users_.add(value);
+          onChanged();
+        } else {
+          usersBuilder_.addMessage(value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder addUsers(
+          int index, org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (usersBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          ensureUsersIsMutable();
+          users_.add(index, value);
+          onChanged();
+        } else {
+          usersBuilder_.addMessage(index, value);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder addUsers(
+          org.apache.dubbo.benchmark.bean.PagePB.User.Builder builderForValue) {
+        if (usersBuilder_ == null) {
+          ensureUsersIsMutable();
+          users_.add(builderForValue.build());
+          onChanged();
+        } else {
+          usersBuilder_.addMessage(builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder addUsers(
+          int index, org.apache.dubbo.benchmark.bean.PagePB.User.Builder builderForValue) {
+        if (usersBuilder_ == null) {
+          ensureUsersIsMutable();
+          users_.add(index, builderForValue.build());
+          onChanged();
+        } else {
+          usersBuilder_.addMessage(index, builderForValue.build());
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder addAllUsers(
+          java.lang.Iterable<? extends org.apache.dubbo.benchmark.bean.PagePB.User> values) {
+        if (usersBuilder_ == null) {
+          ensureUsersIsMutable();
+          com.google.protobuf.AbstractMessageLite.Builder.addAll(
+              values, users_);
+          onChanged();
+        } else {
+          usersBuilder_.addAllMessages(values);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder clearUsers() {
+        if (usersBuilder_ == null) {
+          users_ = java.util.Collections.emptyList();
+          bitField0_ = (bitField0_ & ~0x00000001);
+          onChanged();
+        } else {
+          usersBuilder_.clear();
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public Builder removeUsers(int index) {
+        if (usersBuilder_ == null) {
+          ensureUsersIsMutable();
+          users_.remove(index);
+          onChanged();
+        } else {
+          usersBuilder_.remove(index);
+        }
+        return this;
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User.Builder getUsersBuilder(
+          int index) {
+        return getUsersFieldBuilder().getBuilder(index);
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUsersOrBuilder(
+          int index) {
+        if (usersBuilder_ == null) {
+          return users_.get(index);  } else {
+          return usersBuilder_.getMessageOrBuilder(index);
+        }
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public java.util.List<? extends org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> 
+           getUsersOrBuilderList() {
+        if (usersBuilder_ != null) {
+          return usersBuilder_.getMessageOrBuilderList();
+        } else {
+          return java.util.Collections.unmodifiableList(users_);
+        }
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User.Builder addUsersBuilder() {
+        return getUsersFieldBuilder().addBuilder(
+            org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User.Builder addUsersBuilder(
+          int index) {
+        return getUsersFieldBuilder().addBuilder(
+            index, org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance());
+      }
+      /**
+       * <code>repeated .org.apache.dubbo.benchmark.bean.User users = 1;</code>
+       */
+      public java.util.List<org.apache.dubbo.benchmark.bean.PagePB.User.Builder> 
+           getUsersBuilderList() {
+        return getUsersFieldBuilder().getBuilderList();
+      }
+      private com.google.protobuf.RepeatedFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> 
+          getUsersFieldBuilder() {
+        if (usersBuilder_ == null) {
+          usersBuilder_ = new com.google.protobuf.RepeatedFieldBuilderV3<
+              org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder>(
+                  users_,
+                  ((bitField0_ & 0x00000001) != 0),
+                  getParentForChildren(),
+                  isClean());
+          users_ = null;
+        }
+        return usersBuilder_;
+      }
+
+      private int pageNo_ ;
+      /**
+       * <code>int32 pageNo = 2;</code>
+       */
+      public int getPageNo() {
+        return pageNo_;
+      }
+      /**
+       * <code>int32 pageNo = 2;</code>
+       */
+      public Builder setPageNo(int value) {
+        
+        pageNo_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int32 pageNo = 2;</code>
+       */
+      public Builder clearPageNo() {
+        
+        pageNo_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private int total_ ;
+      /**
+       * <code>int32 total = 3;</code>
+       */
+      public int getTotal() {
+        return total_;
+      }
+      /**
+       * <code>int32 total = 3;</code>
+       */
+      public Builder setTotal(int value) {
+        
+        total_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int32 total = 3;</code>
+       */
+      public Builder clearTotal() {
+        
+        total_ = 0;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:org.apache.dubbo.benchmark.bean.Page)
+    }
+
+    // @@protoc_insertion_point(class_scope:org.apache.dubbo.benchmark.bean.Page)
+    private static final org.apache.dubbo.benchmark.bean.PagePB.Page DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.dubbo.benchmark.bean.PagePB.Page();
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.Page getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Page>
+        PARSER = new com.google.protobuf.AbstractParser<Page>() {
+      @java.lang.Override
+      public Page parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Page(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<Page> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Page> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.dubbo.benchmark.bean.PagePB.Page getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface UserOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:org.apache.dubbo.benchmark.bean.User)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>int64 id = 1;</code>
+     */
+    long getId();
+
+    /**
+     * <code>string name = 2;</code>
+     */
+    java.lang.String getName();
+    /**
+     * <code>string name = 2;</code>
+     */
+    com.google.protobuf.ByteString
+        getNameBytes();
+
+    /**
+     * <code>int32 sex = 3;</code>
+     */
+    int getSex();
+
+    /**
+     * <code>.google.protobuf.Timestamp birthday = 4;</code>
+     */
+    boolean hasBirthday();
+    /**
+     * <code>.google.protobuf.Timestamp birthday = 4;</code>
+     */
+    com.google.protobuf.Timestamp getBirthday();
+    /**
+     * <code>.google.protobuf.Timestamp birthday = 4;</code>
+     */
+    com.google.protobuf.TimestampOrBuilder getBirthdayOrBuilder();
+
+    /**
+     * <code>string email = 5;</code>
+     */
+    java.lang.String getEmail();
+    /**
+     * <code>string email = 5;</code>
+     */
+    com.google.protobuf.ByteString
+        getEmailBytes();
+
+    /**
+     * <code>string mobile = 6;</code>
+     */
+    java.lang.String getMobile();
+    /**
+     * <code>string mobile = 6;</code>
+     */
+    com.google.protobuf.ByteString
+        getMobileBytes();
+
+    /**
+     * <code>string address = 7;</code>
+     */
+    java.lang.String getAddress();
+    /**
+     * <code>string address = 7;</code>
+     */
+    com.google.protobuf.ByteString
+        getAddressBytes();
+
+    /**
+     * <code>string icon = 8;</code>
+     */
+    java.lang.String getIcon();
+    /**
+     * <code>string icon = 8;</code>
+     */
+    com.google.protobuf.ByteString
+        getIconBytes();
+
+    /**
+     * <code>repeated int32 permissions = 9;</code>
+     */
+    java.util.List<java.lang.Integer> getPermissionsList();
+    /**
+     * <code>repeated int32 permissions = 9;</code>
+     */
+    int getPermissionsCount();
+    /**
+     * <code>repeated int32 permissions = 9;</code>
+     */
+    int getPermissions(int index);
+
+    /**
+     * <code>int32 status = 10;</code>
+     */
+    int getStatus();
+
+    /**
+     * <code>.google.protobuf.Timestamp createTime = 11;</code>
+     */
+    boolean hasCreateTime();
+    /**
+     * <code>.google.protobuf.Timestamp createTime = 11;</code>
+     */
+    com.google.protobuf.Timestamp getCreateTime();
+    /**
+     * <code>.google.protobuf.Timestamp createTime = 11;</code>
+     */
+    com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder();
+
+    /**
+     * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+     */
+    boolean hasUpdateTime();
+    /**
+     * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+     */
+    com.google.protobuf.Timestamp getUpdateTime();
+    /**
+     * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+     */
+    com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder();
+  }
+  /**
+   * Protobuf type {@code org.apache.dubbo.benchmark.bean.User}
+   */
+  public  static final class User extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:org.apache.dubbo.benchmark.bean.User)
+      UserOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use User.newBuilder() to construct.
+    private User(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private User() {
+      name_ = "";
+      email_ = "";
+      mobile_ = "";
+      address_ = "";
+      icon_ = "";
+      permissions_ = emptyIntList();
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private User(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+
+              id_ = input.readInt64();
+              break;
+            }
+            case 18: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              name_ = s;
+              break;
+            }
+            case 24: {
+
+              sex_ = input.readInt32();
+              break;
+            }
+            case 34: {
+              com.google.protobuf.Timestamp.Builder subBuilder = null;
+              if (birthday_ != null) {
+                subBuilder = birthday_.toBuilder();
+              }
+              birthday_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(birthday_);
+                birthday_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 42: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              email_ = s;
+              break;
+            }
+            case 50: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              mobile_ = s;
+              break;
+            }
+            case 58: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              address_ = s;
+              break;
+            }
+            case 66: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              icon_ = s;
+              break;
+            }
+            case 72: {
+              if (!((mutable_bitField0_ & 0x00000100) != 0)) {
+                permissions_ = newIntList();
+                mutable_bitField0_ |= 0x00000100;
+              }
+              permissions_.addInt(input.readInt32());
+              break;
+            }
+            case 74: {
+              int length = input.readRawVarint32();
+              int limit = input.pushLimit(length);
+              if (!((mutable_bitField0_ & 0x00000100) != 0) && input.getBytesUntilLimit() > 0) {
+                permissions_ = newIntList();
+                mutable_bitField0_ |= 0x00000100;
+              }
+              while (input.getBytesUntilLimit() > 0) {
+                permissions_.addInt(input.readInt32());
+              }
+              input.popLimit(limit);
+              break;
+            }
+            case 80: {
+
+              status_ = input.readInt32();
+              break;
+            }
+            case 90: {
+              com.google.protobuf.Timestamp.Builder subBuilder = null;
+              if (createTime_ != null) {
+                subBuilder = createTime_.toBuilder();
+              }
+              createTime_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(createTime_);
+                createTime_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 98: {
+              com.google.protobuf.Timestamp.Builder subBuilder = null;
+              if (updateTime_ != null) {
+                subBuilder = updateTime_.toBuilder();
+              }
+              updateTime_ = input.readMessage(com.google.protobuf.Timestamp.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(updateTime_);
+                updateTime_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        if (((mutable_bitField0_ & 0x00000100) != 0)) {
+          permissions_.makeImmutable(); // C
+        }
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_User_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_User_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.dubbo.benchmark.bean.PagePB.User.class, org.apache.dubbo.benchmark.bean.PagePB.User.Builder.class);
+    }
+
+    private int bitField0_;
+    public static final int ID_FIELD_NUMBER = 1;
+    private long id_;
+    /**
+     * <code>int64 id = 1;</code>
+     */
+    public long getId() {
+      return id_;
+    }
+
+    public static final int NAME_FIELD_NUMBER = 2;
+    private volatile java.lang.Object name_;
+    /**
+     * <code>string name = 2;</code>
+     */
+    public java.lang.String getName() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        name_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string name = 2;</code>
+     */
+    public com.google.protobuf.ByteString
+        getNameBytes() {
+      java.lang.Object ref = name_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        name_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int SEX_FIELD_NUMBER = 3;
+    private int sex_;
+    /**
+     * <code>int32 sex = 3;</code>
+     */
+    public int getSex() {
+      return sex_;
+    }
+
+    public static final int BIRTHDAY_FIELD_NUMBER = 4;
+    private com.google.protobuf.Timestamp birthday_;
+    /**
+     * <code>.google.protobuf.Timestamp birthday = 4;</code>
+     */
+    public boolean hasBirthday() {
+      return birthday_ != null;
+    }
+    /**
+     * <code>.google.protobuf.Timestamp birthday = 4;</code>
+     */
+    public com.google.protobuf.Timestamp getBirthday() {
+      return birthday_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : birthday_;
+    }
+    /**
+     * <code>.google.protobuf.Timestamp birthday = 4;</code>
+     */
+    public com.google.protobuf.TimestampOrBuilder getBirthdayOrBuilder() {
+      return getBirthday();
+    }
+
+    public static final int EMAIL_FIELD_NUMBER = 5;
+    private volatile java.lang.Object email_;
+    /**
+     * <code>string email = 5;</code>
+     */
+    public java.lang.String getEmail() {
+      java.lang.Object ref = email_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        email_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string email = 5;</code>
+     */
+    public com.google.protobuf.ByteString
+        getEmailBytes() {
+      java.lang.Object ref = email_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        email_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int MOBILE_FIELD_NUMBER = 6;
+    private volatile java.lang.Object mobile_;
+    /**
+     * <code>string mobile = 6;</code>
+     */
+    public java.lang.String getMobile() {
+      java.lang.Object ref = mobile_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        mobile_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string mobile = 6;</code>
+     */
+    public com.google.protobuf.ByteString
+        getMobileBytes() {
+      java.lang.Object ref = mobile_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        mobile_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ADDRESS_FIELD_NUMBER = 7;
+    private volatile java.lang.Object address_;
+    /**
+     * <code>string address = 7;</code>
+     */
+    public java.lang.String getAddress() {
+      java.lang.Object ref = address_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        address_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string address = 7;</code>
+     */
+    public com.google.protobuf.ByteString
+        getAddressBytes() {
+      java.lang.Object ref = address_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        address_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int ICON_FIELD_NUMBER = 8;
+    private volatile java.lang.Object icon_;
+    /**
+     * <code>string icon = 8;</code>
+     */
+    public java.lang.String getIcon() {
+      java.lang.Object ref = icon_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        icon_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string icon = 8;</code>
+     */
+    public com.google.protobuf.ByteString
+        getIconBytes() {
+      java.lang.Object ref = icon_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        icon_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    public static final int PERMISSIONS_FIELD_NUMBER = 9;
+    private com.google.protobuf.Internal.IntList permissions_;
+    /**
+     * <code>repeated int32 permissions = 9;</code>
+     */
+    public java.util.List<java.lang.Integer>
+        getPermissionsList() {
+      return permissions_;
+    }
+    /**
+     * <code>repeated int32 permissions = 9;</code>
+     */
+    public int getPermissionsCount() {
+      return permissions_.size();
+    }
+    /**
+     * <code>repeated int32 permissions = 9;</code>
+     */
+    public int getPermissions(int index) {
+      return permissions_.getInt(index);
+    }
+    private int permissionsMemoizedSerializedSize = -1;
+
+    public static final int STATUS_FIELD_NUMBER = 10;
+    private int status_;
+    /**
+     * <code>int32 status = 10;</code>
+     */
+    public int getStatus() {
+      return status_;
+    }
+
+    public static final int CREATETIME_FIELD_NUMBER = 11;
+    private com.google.protobuf.Timestamp createTime_;
+    /**
+     * <code>.google.protobuf.Timestamp createTime = 11;</code>
+     */
+    public boolean hasCreateTime() {
+      return createTime_ != null;
+    }
+    /**
+     * <code>.google.protobuf.Timestamp createTime = 11;</code>
+     */
+    public com.google.protobuf.Timestamp getCreateTime() {
+      return createTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createTime_;
+    }
+    /**
+     * <code>.google.protobuf.Timestamp createTime = 11;</code>
+     */
+    public com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder() {
+      return getCreateTime();
+    }
+
+    public static final int UPDATETIME_FIELD_NUMBER = 12;
+    private com.google.protobuf.Timestamp updateTime_;
+    /**
+     * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+     */
+    public boolean hasUpdateTime() {
+      return updateTime_ != null;
+    }
+    /**
+     * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+     */
+    public com.google.protobuf.Timestamp getUpdateTime() {
+      return updateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_;
+    }
+    /**
+     * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+     */
+    public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() {
+      return getUpdateTime();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      getSerializedSize();
+      if (id_ != 0L) {
+        output.writeInt64(1, id_);
+      }
+      if (!getNameBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 2, name_);
+      }
+      if (sex_ != 0) {
+        output.writeInt32(3, sex_);
+      }
+      if (birthday_ != null) {
+        output.writeMessage(4, getBirthday());
+      }
+      if (!getEmailBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 5, email_);
+      }
+      if (!getMobileBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 6, mobile_);
+      }
+      if (!getAddressBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 7, address_);
+      }
+      if (!getIconBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 8, icon_);
+      }
+      if (getPermissionsList().size() > 0) {
+        output.writeUInt32NoTag(74);
+        output.writeUInt32NoTag(permissionsMemoizedSerializedSize);
+      }
+      for (int i = 0; i < permissions_.size(); i++) {
+        output.writeInt32NoTag(permissions_.getInt(i));
+      }
+      if (status_ != 0) {
+        output.writeInt32(10, status_);
+      }
+      if (createTime_ != null) {
+        output.writeMessage(11, getCreateTime());
+      }
+      if (updateTime_ != null) {
+        output.writeMessage(12, getUpdateTime());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (id_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt64Size(1, id_);
+      }
+      if (!getNameBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, name_);
+      }
+      if (sex_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(3, sex_);
+      }
+      if (birthday_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(4, getBirthday());
+      }
+      if (!getEmailBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(5, email_);
+      }
+      if (!getMobileBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(6, mobile_);
+      }
+      if (!getAddressBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(7, address_);
+      }
+      if (!getIconBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(8, icon_);
+      }
+      {
+        int dataSize = 0;
+        for (int i = 0; i < permissions_.size(); i++) {
+          dataSize += com.google.protobuf.CodedOutputStream
+            .computeInt32SizeNoTag(permissions_.getInt(i));
+        }
+        size += dataSize;
+        if (!getPermissionsList().isEmpty()) {
+          size += 1;
+          size += com.google.protobuf.CodedOutputStream
+              .computeInt32SizeNoTag(dataSize);
+        }
+        permissionsMemoizedSerializedSize = dataSize;
+      }
+      if (status_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(10, status_);
+      }
+      if (createTime_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(11, getCreateTime());
+      }
+      if (updateTime_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(12, getUpdateTime());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.dubbo.benchmark.bean.PagePB.User)) {
+        return super.equals(obj);
+      }
+      org.apache.dubbo.benchmark.bean.PagePB.User other = (org.apache.dubbo.benchmark.bean.PagePB.User) obj;
+
+      if (getId()
+          != other.getId()) return false;
+      if (!getName()
+          .equals(other.getName())) return false;
+      if (getSex()
+          != other.getSex()) return false;
+      if (hasBirthday() != other.hasBirthday()) return false;
+      if (hasBirthday()) {
+        if (!getBirthday()
+            .equals(other.getBirthday())) return false;
+      }
+      if (!getEmail()
+          .equals(other.getEmail())) return false;
+      if (!getMobile()
+          .equals(other.getMobile())) return false;
+      if (!getAddress()
+          .equals(other.getAddress())) return false;
+      if (!getIcon()
+          .equals(other.getIcon())) return false;
+      if (!getPermissionsList()
+          .equals(other.getPermissionsList())) return false;
+      if (getStatus()
+          != other.getStatus()) return false;
+      if (hasCreateTime() != other.hasCreateTime()) return false;
+      if (hasCreateTime()) {
+        if (!getCreateTime()
+            .equals(other.getCreateTime())) return false;
+      }
+      if (hasUpdateTime() != other.hasUpdateTime()) return false;
+      if (hasUpdateTime()) {
+        if (!getUpdateTime()
+            .equals(other.getUpdateTime())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ID_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getId());
+      hash = (37 * hash) + NAME_FIELD_NUMBER;
+      hash = (53 * hash) + getName().hashCode();
+      hash = (37 * hash) + SEX_FIELD_NUMBER;
+      hash = (53 * hash) + getSex();
+      if (hasBirthday()) {
+        hash = (37 * hash) + BIRTHDAY_FIELD_NUMBER;
+        hash = (53 * hash) + getBirthday().hashCode();
+      }
+      hash = (37 * hash) + EMAIL_FIELD_NUMBER;
+      hash = (53 * hash) + getEmail().hashCode();
+      hash = (37 * hash) + MOBILE_FIELD_NUMBER;
+      hash = (53 * hash) + getMobile().hashCode();
+      hash = (37 * hash) + ADDRESS_FIELD_NUMBER;
+      hash = (53 * hash) + getAddress().hashCode();
+      hash = (37 * hash) + ICON_FIELD_NUMBER;
+      hash = (53 * hash) + getIcon().hashCode();
+      if (getPermissionsCount() > 0) {
+        hash = (37 * hash) + PERMISSIONS_FIELD_NUMBER;
+        hash = (53 * hash) + getPermissionsList().hashCode();
+      }
+      hash = (37 * hash) + STATUS_FIELD_NUMBER;
+      hash = (53 * hash) + getStatus();
+      if (hasCreateTime()) {
+        hash = (37 * hash) + CREATETIME_FIELD_NUMBER;
+        hash = (53 * hash) + getCreateTime().hashCode();
+      }
+      if (hasUpdateTime()) {
+        hash = (37 * hash) + UPDATETIME_FIELD_NUMBER;
+        hash = (53 * hash) + getUpdateTime().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.User parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.dubbo.benchmark.bean.PagePB.User prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code org.apache.dubbo.benchmark.bean.User}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:org.apache.dubbo.benchmark.bean.User)
+        org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_User_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_User_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.dubbo.benchmark.bean.PagePB.User.class, org.apache.dubbo.benchmark.bean.PagePB.User.Builder.class);
+      }
+
+      // Construct using org.apache.dubbo.benchmark.bean.PagePB.User.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        id_ = 0L;
+
+        name_ = "";
+
+        sex_ = 0;
+
+        if (birthdayBuilder_ == null) {
+          birthday_ = null;
+        } else {
+          birthday_ = null;
+          birthdayBuilder_ = null;
+        }
+        email_ = "";
+
+        mobile_ = "";
+
+        address_ = "";
+
+        icon_ = "";
+
+        permissions_ = emptyIntList();
+        bitField0_ = (bitField0_ & ~0x00000100);
+        status_ = 0;
+
+        if (createTimeBuilder_ == null) {
+          createTime_ = null;
+        } else {
+          createTime_ = null;
+          createTimeBuilder_ = null;
+        }
+        if (updateTimeBuilder_ == null) {
+          updateTime_ = null;
+        } else {
+          updateTime_ = null;
+          updateTimeBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_User_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.User getDefaultInstanceForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.User build() {
+        org.apache.dubbo.benchmark.bean.PagePB.User result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.User buildPartial() {
+        org.apache.dubbo.benchmark.bean.PagePB.User result = new org.apache.dubbo.benchmark.bean.PagePB.User(this);
+        int from_bitField0_ = bitField0_;
+        int to_bitField0_ = 0;
+        result.id_ = id_;
+        result.name_ = name_;
+        result.sex_ = sex_;
+        if (birthdayBuilder_ == null) {
+          result.birthday_ = birthday_;
+        } else {
+          result.birthday_ = birthdayBuilder_.build();
+        }
+        result.email_ = email_;
+        result.mobile_ = mobile_;
+        result.address_ = address_;
+        result.icon_ = icon_;
+        if (((bitField0_ & 0x00000100) != 0)) {
+          permissions_.makeImmutable();
+          bitField0_ = (bitField0_ & ~0x00000100);
+        }
+        result.permissions_ = permissions_;
+        result.status_ = status_;
+        if (createTimeBuilder_ == null) {
+          result.createTime_ = createTime_;
+        } else {
+          result.createTime_ = createTimeBuilder_.build();
+        }
+        if (updateTimeBuilder_ == null) {
+          result.updateTime_ = updateTime_;
+        } else {
+          result.updateTime_ = updateTimeBuilder_.build();
+        }
+        result.bitField0_ = to_bitField0_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.dubbo.benchmark.bean.PagePB.User) {
+          return mergeFrom((org.apache.dubbo.benchmark.bean.PagePB.User)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.dubbo.benchmark.bean.PagePB.User other) {
+        if (other == org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance()) return this;
+        if (other.getId() != 0L) {
+          setId(other.getId());
+        }
+        if (!other.getName().isEmpty()) {
+          name_ = other.name_;
+          onChanged();
+        }
+        if (other.getSex() != 0) {
+          setSex(other.getSex());
+        }
+        if (other.hasBirthday()) {
+          mergeBirthday(other.getBirthday());
+        }
+        if (!other.getEmail().isEmpty()) {
+          email_ = other.email_;
+          onChanged();
+        }
+        if (!other.getMobile().isEmpty()) {
+          mobile_ = other.mobile_;
+          onChanged();
+        }
+        if (!other.getAddress().isEmpty()) {
+          address_ = other.address_;
+          onChanged();
+        }
+        if (!other.getIcon().isEmpty()) {
+          icon_ = other.icon_;
+          onChanged();
+        }
+        if (!other.permissions_.isEmpty()) {
+          if (permissions_.isEmpty()) {
+            permissions_ = other.permissions_;
+            bitField0_ = (bitField0_ & ~0x00000100);
+          } else {
+            ensurePermissionsIsMutable();
+            permissions_.addAll(other.permissions_);
+          }
+          onChanged();
+        }
+        if (other.getStatus() != 0) {
+          setStatus(other.getStatus());
+        }
+        if (other.hasCreateTime()) {
+          mergeCreateTime(other.getCreateTime());
+        }
+        if (other.hasUpdateTime()) {
+          mergeUpdateTime(other.getUpdateTime());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.dubbo.benchmark.bean.PagePB.User parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.dubbo.benchmark.bean.PagePB.User) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+      private int bitField0_;
+
+      private long id_ ;
+      /**
+       * <code>int64 id = 1;</code>
+       */
+      public long getId() {
+        return id_;
+      }
+      /**
+       * <code>int64 id = 1;</code>
+       */
+      public Builder setId(long value) {
+        
+        id_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int64 id = 1;</code>
+       */
+      public Builder clearId() {
+        
+        id_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object name_ = "";
+      /**
+       * <code>string name = 2;</code>
+       */
+      public java.lang.String getName() {
+        java.lang.Object ref = name_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          name_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       */
+      public com.google.protobuf.ByteString
+          getNameBytes() {
+        java.lang.Object ref = name_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          name_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string name = 2;</code>
+       */
+      public Builder setName(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        name_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       */
+      public Builder clearName() {
+        
+        name_ = getDefaultInstance().getName();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string name = 2;</code>
+       */
+      public Builder setNameBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        name_ = value;
+        onChanged();
+        return this;
+      }
+
+      private int sex_ ;
+      /**
+       * <code>int32 sex = 3;</code>
+       */
+      public int getSex() {
+        return sex_;
+      }
+      /**
+       * <code>int32 sex = 3;</code>
+       */
+      public Builder setSex(int value) {
+        
+        sex_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int32 sex = 3;</code>
+       */
+      public Builder clearSex() {
+        
+        sex_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.Timestamp birthday_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> birthdayBuilder_;
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public boolean hasBirthday() {
+        return birthdayBuilder_ != null || birthday_ != null;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public com.google.protobuf.Timestamp getBirthday() {
+        if (birthdayBuilder_ == null) {
+          return birthday_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : birthday_;
+        } else {
+          return birthdayBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public Builder setBirthday(com.google.protobuf.Timestamp value) {
+        if (birthdayBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          birthday_ = value;
+          onChanged();
+        } else {
+          birthdayBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public Builder setBirthday(
+          com.google.protobuf.Timestamp.Builder builderForValue) {
+        if (birthdayBuilder_ == null) {
+          birthday_ = builderForValue.build();
+          onChanged();
+        } else {
+          birthdayBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public Builder mergeBirthday(com.google.protobuf.Timestamp value) {
+        if (birthdayBuilder_ == null) {
+          if (birthday_ != null) {
+            birthday_ =
+              com.google.protobuf.Timestamp.newBuilder(birthday_).mergeFrom(value).buildPartial();
+          } else {
+            birthday_ = value;
+          }
+          onChanged();
+        } else {
+          birthdayBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public Builder clearBirthday() {
+        if (birthdayBuilder_ == null) {
+          birthday_ = null;
+          onChanged();
+        } else {
+          birthday_ = null;
+          birthdayBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public com.google.protobuf.Timestamp.Builder getBirthdayBuilder() {
+        
+        onChanged();
+        return getBirthdayFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      public com.google.protobuf.TimestampOrBuilder getBirthdayOrBuilder() {
+        if (birthdayBuilder_ != null) {
+          return birthdayBuilder_.getMessageOrBuilder();
+        } else {
+          return birthday_ == null ?
+              com.google.protobuf.Timestamp.getDefaultInstance() : birthday_;
+        }
+      }
+      /**
+       * <code>.google.protobuf.Timestamp birthday = 4;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+          getBirthdayFieldBuilder() {
+        if (birthdayBuilder_ == null) {
+          birthdayBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                  getBirthday(),
+                  getParentForChildren(),
+                  isClean());
+          birthday_ = null;
+        }
+        return birthdayBuilder_;
+      }
+
+      private java.lang.Object email_ = "";
+      /**
+       * <code>string email = 5;</code>
+       */
+      public java.lang.String getEmail() {
+        java.lang.Object ref = email_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          email_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string email = 5;</code>
+       */
+      public com.google.protobuf.ByteString
+          getEmailBytes() {
+        java.lang.Object ref = email_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          email_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string email = 5;</code>
+       */
+      public Builder setEmail(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        email_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string email = 5;</code>
+       */
+      public Builder clearEmail() {
+        
+        email_ = getDefaultInstance().getEmail();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string email = 5;</code>
+       */
+      public Builder setEmailBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        email_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object mobile_ = "";
+      /**
+       * <code>string mobile = 6;</code>
+       */
+      public java.lang.String getMobile() {
+        java.lang.Object ref = mobile_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          mobile_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string mobile = 6;</code>
+       */
+      public com.google.protobuf.ByteString
+          getMobileBytes() {
+        java.lang.Object ref = mobile_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          mobile_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string mobile = 6;</code>
+       */
+      public Builder setMobile(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        mobile_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string mobile = 6;</code>
+       */
+      public Builder clearMobile() {
+        
+        mobile_ = getDefaultInstance().getMobile();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string mobile = 6;</code>
+       */
+      public Builder setMobileBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        mobile_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object address_ = "";
+      /**
+       * <code>string address = 7;</code>
+       */
+      public java.lang.String getAddress() {
+        java.lang.Object ref = address_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          address_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string address = 7;</code>
+       */
+      public com.google.protobuf.ByteString
+          getAddressBytes() {
+        java.lang.Object ref = address_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          address_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string address = 7;</code>
+       */
+      public Builder setAddress(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        address_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string address = 7;</code>
+       */
+      public Builder clearAddress() {
+        
+        address_ = getDefaultInstance().getAddress();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string address = 7;</code>
+       */
+      public Builder setAddressBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        address_ = value;
+        onChanged();
+        return this;
+      }
+
+      private java.lang.Object icon_ = "";
+      /**
+       * <code>string icon = 8;</code>
+       */
+      public java.lang.String getIcon() {
+        java.lang.Object ref = icon_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          icon_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string icon = 8;</code>
+       */
+      public com.google.protobuf.ByteString
+          getIconBytes() {
+        java.lang.Object ref = icon_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          icon_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string icon = 8;</code>
+       */
+      public Builder setIcon(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        icon_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string icon = 8;</code>
+       */
+      public Builder clearIcon() {
+        
+        icon_ = getDefaultInstance().getIcon();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string icon = 8;</code>
+       */
+      public Builder setIconBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        icon_ = value;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.Internal.IntList permissions_ = emptyIntList();
+      private void ensurePermissionsIsMutable() {
+        if (!((bitField0_ & 0x00000100) != 0)) {
+          permissions_ = mutableCopy(permissions_);
+          bitField0_ |= 0x00000100;
+         }
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public java.util.List<java.lang.Integer>
+          getPermissionsList() {
+        return ((bitField0_ & 0x00000100) != 0) ?
+                 java.util.Collections.unmodifiableList(permissions_) : permissions_;
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public int getPermissionsCount() {
+        return permissions_.size();
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public int getPermissions(int index) {
+        return permissions_.getInt(index);
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public Builder setPermissions(
+          int index, int value) {
+        ensurePermissionsIsMutable();
+        permissions_.setInt(index, value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public Builder addPermissions(int value) {
+        ensurePermissionsIsMutable();
+        permissions_.addInt(value);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public Builder addAllPermissions(
+          java.lang.Iterable<? extends java.lang.Integer> values) {
+        ensurePermissionsIsMutable();
+        com.google.protobuf.AbstractMessageLite.Builder.addAll(
+            values, permissions_);
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>repeated int32 permissions = 9;</code>
+       */
+      public Builder clearPermissions() {
+        permissions_ = emptyIntList();
+        bitField0_ = (bitField0_ & ~0x00000100);
+        onChanged();
+        return this;
+      }
+
+      private int status_ ;
+      /**
+       * <code>int32 status = 10;</code>
+       */
+      public int getStatus() {
+        return status_;
+      }
+      /**
+       * <code>int32 status = 10;</code>
+       */
+      public Builder setStatus(int value) {
+        
+        status_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int32 status = 10;</code>
+       */
+      public Builder clearStatus() {
+        
+        status_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private com.google.protobuf.Timestamp createTime_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> createTimeBuilder_;
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public boolean hasCreateTime() {
+        return createTimeBuilder_ != null || createTime_ != null;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public com.google.protobuf.Timestamp getCreateTime() {
+        if (createTimeBuilder_ == null) {
+          return createTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : createTime_;
+        } else {
+          return createTimeBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public Builder setCreateTime(com.google.protobuf.Timestamp value) {
+        if (createTimeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          createTime_ = value;
+          onChanged();
+        } else {
+          createTimeBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public Builder setCreateTime(
+          com.google.protobuf.Timestamp.Builder builderForValue) {
+        if (createTimeBuilder_ == null) {
+          createTime_ = builderForValue.build();
+          onChanged();
+        } else {
+          createTimeBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public Builder mergeCreateTime(com.google.protobuf.Timestamp value) {
+        if (createTimeBuilder_ == null) {
+          if (createTime_ != null) {
+            createTime_ =
+              com.google.protobuf.Timestamp.newBuilder(createTime_).mergeFrom(value).buildPartial();
+          } else {
+            createTime_ = value;
+          }
+          onChanged();
+        } else {
+          createTimeBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public Builder clearCreateTime() {
+        if (createTimeBuilder_ == null) {
+          createTime_ = null;
+          onChanged();
+        } else {
+          createTime_ = null;
+          createTimeBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public com.google.protobuf.Timestamp.Builder getCreateTimeBuilder() {
+        
+        onChanged();
+        return getCreateTimeFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      public com.google.protobuf.TimestampOrBuilder getCreateTimeOrBuilder() {
+        if (createTimeBuilder_ != null) {
+          return createTimeBuilder_.getMessageOrBuilder();
+        } else {
+          return createTime_ == null ?
+              com.google.protobuf.Timestamp.getDefaultInstance() : createTime_;
+        }
+      }
+      /**
+       * <code>.google.protobuf.Timestamp createTime = 11;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+          getCreateTimeFieldBuilder() {
+        if (createTimeBuilder_ == null) {
+          createTimeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                  getCreateTime(),
+                  getParentForChildren(),
+                  isClean());
+          createTime_ = null;
+        }
+        return createTimeBuilder_;
+      }
+
+      private com.google.protobuf.Timestamp updateTime_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> updateTimeBuilder_;
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public boolean hasUpdateTime() {
+        return updateTimeBuilder_ != null || updateTime_ != null;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public com.google.protobuf.Timestamp getUpdateTime() {
+        if (updateTimeBuilder_ == null) {
+          return updateTime_ == null ? com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_;
+        } else {
+          return updateTimeBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public Builder setUpdateTime(com.google.protobuf.Timestamp value) {
+        if (updateTimeBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          updateTime_ = value;
+          onChanged();
+        } else {
+          updateTimeBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public Builder setUpdateTime(
+          com.google.protobuf.Timestamp.Builder builderForValue) {
+        if (updateTimeBuilder_ == null) {
+          updateTime_ = builderForValue.build();
+          onChanged();
+        } else {
+          updateTimeBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public Builder mergeUpdateTime(com.google.protobuf.Timestamp value) {
+        if (updateTimeBuilder_ == null) {
+          if (updateTime_ != null) {
+            updateTime_ =
+              com.google.protobuf.Timestamp.newBuilder(updateTime_).mergeFrom(value).buildPartial();
+          } else {
+            updateTime_ = value;
+          }
+          onChanged();
+        } else {
+          updateTimeBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public Builder clearUpdateTime() {
+        if (updateTimeBuilder_ == null) {
+          updateTime_ = null;
+          onChanged();
+        } else {
+          updateTime_ = null;
+          updateTimeBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public com.google.protobuf.Timestamp.Builder getUpdateTimeBuilder() {
+        
+        onChanged();
+        return getUpdateTimeFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      public com.google.protobuf.TimestampOrBuilder getUpdateTimeOrBuilder() {
+        if (updateTimeBuilder_ != null) {
+          return updateTimeBuilder_.getMessageOrBuilder();
+        } else {
+          return updateTime_ == null ?
+              com.google.protobuf.Timestamp.getDefaultInstance() : updateTime_;
+        }
+      }
+      /**
+       * <code>.google.protobuf.Timestamp updateTime = 12;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder> 
+          getUpdateTimeFieldBuilder() {
+        if (updateTimeBuilder_ == null) {
+          updateTimeBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              com.google.protobuf.Timestamp, com.google.protobuf.Timestamp.Builder, com.google.protobuf.TimestampOrBuilder>(
+                  getUpdateTime(),
+                  getParentForChildren(),
+                  isClean());
+          updateTime_ = null;
+        }
+        return updateTimeBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:org.apache.dubbo.benchmark.bean.User)
+    }
+
+    // @@protoc_insertion_point(class_scope:org.apache.dubbo.benchmark.bean.User)
+    private static final org.apache.dubbo.benchmark.bean.PagePB.User DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.dubbo.benchmark.bean.PagePB.User();
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.User getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<User>
+        PARSER = new com.google.protobuf.AbstractParser<User>() {
+      @java.lang.Override
+      public User parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new User(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<User> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<User> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.dubbo.benchmark.bean.PagePB.User getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface RequestOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:org.apache.dubbo.benchmark.bean.Request)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>int64 id = 1;</code>
+     */
+    long getId();
+
+    /**
+     * <code>int32 page = 2;</code>
+     */
+    int getPage();
+
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+     */
+    boolean hasUser();
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.User getUser();
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUserOrBuilder();
+
+    /**
+     * <code>string email = 4;</code>
+     */
+    java.lang.String getEmail();
+    /**
+     * <code>string email = 4;</code>
+     */
+    com.google.protobuf.ByteString
+        getEmailBytes();
+  }
+  /**
+   * Protobuf type {@code org.apache.dubbo.benchmark.bean.Request}
+   */
+  public  static final class Request extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:org.apache.dubbo.benchmark.bean.Request)
+      RequestOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Request.newBuilder() to construct.
+    private Request(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Request() {
+      email_ = "";
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Request(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+
+              id_ = input.readInt64();
+              break;
+            }
+            case 16: {
+
+              page_ = input.readInt32();
+              break;
+            }
+            case 26: {
+              org.apache.dubbo.benchmark.bean.PagePB.User.Builder subBuilder = null;
+              if (user_ != null) {
+                subBuilder = user_.toBuilder();
+              }
+              user_ = input.readMessage(org.apache.dubbo.benchmark.bean.PagePB.User.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(user_);
+                user_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 34: {
+              java.lang.String s = input.readStringRequireUtf8();
+
+              email_ = s;
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Request_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Request_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.dubbo.benchmark.bean.PagePB.Request.class, org.apache.dubbo.benchmark.bean.PagePB.Request.Builder.class);
+    }
+
+    public static final int ID_FIELD_NUMBER = 1;
+    private long id_;
+    /**
+     * <code>int64 id = 1;</code>
+     */
+    public long getId() {
+      return id_;
+    }
+
+    public static final int PAGE_FIELD_NUMBER = 2;
+    private int page_;
+    /**
+     * <code>int32 page = 2;</code>
+     */
+    public int getPage() {
+      return page_;
+    }
+
+    public static final int USER_FIELD_NUMBER = 3;
+    private org.apache.dubbo.benchmark.bean.PagePB.User user_;
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+     */
+    public boolean hasUser() {
+      return user_ != null;
+    }
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.User getUser() {
+      return user_ == null ? org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance() : user_;
+    }
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUserOrBuilder() {
+      return getUser();
+    }
+
+    public static final int EMAIL_FIELD_NUMBER = 4;
+    private volatile java.lang.Object email_;
+    /**
+     * <code>string email = 4;</code>
+     */
+    public java.lang.String getEmail() {
+      java.lang.Object ref = email_;
+      if (ref instanceof java.lang.String) {
+        return (java.lang.String) ref;
+      } else {
+        com.google.protobuf.ByteString bs = 
+            (com.google.protobuf.ByteString) ref;
+        java.lang.String s = bs.toStringUtf8();
+        email_ = s;
+        return s;
+      }
+    }
+    /**
+     * <code>string email = 4;</code>
+     */
+    public com.google.protobuf.ByteString
+        getEmailBytes() {
+      java.lang.Object ref = email_;
+      if (ref instanceof java.lang.String) {
+        com.google.protobuf.ByteString b = 
+            com.google.protobuf.ByteString.copyFromUtf8(
+                (java.lang.String) ref);
+        email_ = b;
+        return b;
+      } else {
+        return (com.google.protobuf.ByteString) ref;
+      }
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (id_ != 0L) {
+        output.writeInt64(1, id_);
+      }
+      if (page_ != 0) {
+        output.writeInt32(2, page_);
+      }
+      if (user_ != null) {
+        output.writeMessage(3, getUser());
+      }
+      if (!getEmailBytes().isEmpty()) {
+        com.google.protobuf.GeneratedMessageV3.writeString(output, 4, email_);
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (id_ != 0L) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt64Size(1, id_);
+      }
+      if (page_ != 0) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeInt32Size(2, page_);
+      }
+      if (user_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getUser());
+      }
+      if (!getEmailBytes().isEmpty()) {
+        size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, email_);
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.dubbo.benchmark.bean.PagePB.Request)) {
+        return super.equals(obj);
+      }
+      org.apache.dubbo.benchmark.bean.PagePB.Request other = (org.apache.dubbo.benchmark.bean.PagePB.Request) obj;
+
+      if (getId()
+          != other.getId()) return false;
+      if (getPage()
+          != other.getPage()) return false;
+      if (hasUser() != other.hasUser()) return false;
+      if (hasUser()) {
+        if (!getUser()
+            .equals(other.getUser())) return false;
+      }
+      if (!getEmail()
+          .equals(other.getEmail())) return false;
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + ID_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashLong(
+          getId());
+      hash = (37 * hash) + PAGE_FIELD_NUMBER;
+      hash = (53 * hash) + getPage();
+      if (hasUser()) {
+        hash = (37 * hash) + USER_FIELD_NUMBER;
+        hash = (53 * hash) + getUser().hashCode();
+      }
+      hash = (37 * hash) + EMAIL_FIELD_NUMBER;
+      hash = (53 * hash) + getEmail().hashCode();
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.dubbo.benchmark.bean.PagePB.Request prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code org.apache.dubbo.benchmark.bean.Request}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:org.apache.dubbo.benchmark.bean.Request)
+        org.apache.dubbo.benchmark.bean.PagePB.RequestOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Request_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Request_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.dubbo.benchmark.bean.PagePB.Request.class, org.apache.dubbo.benchmark.bean.PagePB.Request.Builder.class);
+      }
+
+      // Construct using org.apache.dubbo.benchmark.bean.PagePB.Request.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        id_ = 0L;
+
+        page_ = 0;
+
+        if (userBuilder_ == null) {
+          user_ = null;
+        } else {
+          user_ = null;
+          userBuilder_ = null;
+        }
+        email_ = "";
+
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Request_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Request getDefaultInstanceForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Request build() {
+        org.apache.dubbo.benchmark.bean.PagePB.Request result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Request buildPartial() {
+        org.apache.dubbo.benchmark.bean.PagePB.Request result = new org.apache.dubbo.benchmark.bean.PagePB.Request(this);
+        result.id_ = id_;
+        result.page_ = page_;
+        if (userBuilder_ == null) {
+          result.user_ = user_;
+        } else {
+          result.user_ = userBuilder_.build();
+        }
+        result.email_ = email_;
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.dubbo.benchmark.bean.PagePB.Request) {
+          return mergeFrom((org.apache.dubbo.benchmark.bean.PagePB.Request)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.dubbo.benchmark.bean.PagePB.Request other) {
+        if (other == org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance()) return this;
+        if (other.getId() != 0L) {
+          setId(other.getId());
+        }
+        if (other.getPage() != 0) {
+          setPage(other.getPage());
+        }
+        if (other.hasUser()) {
+          mergeUser(other.getUser());
+        }
+        if (!other.getEmail().isEmpty()) {
+          email_ = other.email_;
+          onChanged();
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.dubbo.benchmark.bean.PagePB.Request parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.dubbo.benchmark.bean.PagePB.Request) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private long id_ ;
+      /**
+       * <code>int64 id = 1;</code>
+       */
+      public long getId() {
+        return id_;
+      }
+      /**
+       * <code>int64 id = 1;</code>
+       */
+      public Builder setId(long value) {
+        
+        id_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int64 id = 1;</code>
+       */
+      public Builder clearId() {
+        
+        id_ = 0L;
+        onChanged();
+        return this;
+      }
+
+      private int page_ ;
+      /**
+       * <code>int32 page = 2;</code>
+       */
+      public int getPage() {
+        return page_;
+      }
+      /**
+       * <code>int32 page = 2;</code>
+       */
+      public Builder setPage(int value) {
+        
+        page_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>int32 page = 2;</code>
+       */
+      public Builder clearPage() {
+        
+        page_ = 0;
+        onChanged();
+        return this;
+      }
+
+      private org.apache.dubbo.benchmark.bean.PagePB.User user_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> userBuilder_;
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public boolean hasUser() {
+        return userBuilder_ != null || user_ != null;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User getUser() {
+        if (userBuilder_ == null) {
+          return user_ == null ? org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance() : user_;
+        } else {
+          return userBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public Builder setUser(org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (userBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          user_ = value;
+          onChanged();
+        } else {
+          userBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public Builder setUser(
+          org.apache.dubbo.benchmark.bean.PagePB.User.Builder builderForValue) {
+        if (userBuilder_ == null) {
+          user_ = builderForValue.build();
+          onChanged();
+        } else {
+          userBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public Builder mergeUser(org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (userBuilder_ == null) {
+          if (user_ != null) {
+            user_ =
+              org.apache.dubbo.benchmark.bean.PagePB.User.newBuilder(user_).mergeFrom(value).buildPartial();
+          } else {
+            user_ = value;
+          }
+          onChanged();
+        } else {
+          userBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public Builder clearUser() {
+        if (userBuilder_ == null) {
+          user_ = null;
+          onChanged();
+        } else {
+          user_ = null;
+          userBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User.Builder getUserBuilder() {
+        
+        onChanged();
+        return getUserFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUserOrBuilder() {
+        if (userBuilder_ != null) {
+          return userBuilder_.getMessageOrBuilder();
+        } else {
+          return user_ == null ?
+              org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance() : user_;
+        }
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> 
+          getUserFieldBuilder() {
+        if (userBuilder_ == null) {
+          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder>(
+                  getUser(),
+                  getParentForChildren(),
+                  isClean());
+          user_ = null;
+        }
+        return userBuilder_;
+      }
+
+      private java.lang.Object email_ = "";
+      /**
+       * <code>string email = 4;</code>
+       */
+      public java.lang.String getEmail() {
+        java.lang.Object ref = email_;
+        if (!(ref instanceof java.lang.String)) {
+          com.google.protobuf.ByteString bs =
+              (com.google.protobuf.ByteString) ref;
+          java.lang.String s = bs.toStringUtf8();
+          email_ = s;
+          return s;
+        } else {
+          return (java.lang.String) ref;
+        }
+      }
+      /**
+       * <code>string email = 4;</code>
+       */
+      public com.google.protobuf.ByteString
+          getEmailBytes() {
+        java.lang.Object ref = email_;
+        if (ref instanceof String) {
+          com.google.protobuf.ByteString b = 
+              com.google.protobuf.ByteString.copyFromUtf8(
+                  (java.lang.String) ref);
+          email_ = b;
+          return b;
+        } else {
+          return (com.google.protobuf.ByteString) ref;
+        }
+      }
+      /**
+       * <code>string email = 4;</code>
+       */
+      public Builder setEmail(
+          java.lang.String value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  
+        email_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string email = 4;</code>
+       */
+      public Builder clearEmail() {
+        
+        email_ = getDefaultInstance().getEmail();
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>string email = 4;</code>
+       */
+      public Builder setEmailBytes(
+          com.google.protobuf.ByteString value) {
+        if (value == null) {
+    throw new NullPointerException();
+  }
+  checkByteStringIsUtf8(value);
+        
+        email_ = value;
+        onChanged();
+        return this;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:org.apache.dubbo.benchmark.bean.Request)
+    }
+
+    // @@protoc_insertion_point(class_scope:org.apache.dubbo.benchmark.bean.Request)
+    private static final org.apache.dubbo.benchmark.bean.PagePB.Request DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.dubbo.benchmark.bean.PagePB.Request();
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.Request getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Request>
+        PARSER = new com.google.protobuf.AbstractParser<Request>() {
+      @java.lang.Override
+      public Request parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Request(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<Request> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Request> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.dubbo.benchmark.bean.PagePB.Request getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  public interface ResponseOrBuilder extends
+      // @@protoc_insertion_point(interface_extends:org.apache.dubbo.benchmark.bean.Response)
+      com.google.protobuf.MessageOrBuilder {
+
+    /**
+     * <code>bool state = 1;</code>
+     */
+    boolean getState();
+
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+     */
+    boolean hasUser();
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.User getUser();
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUserOrBuilder();
+
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+     */
+    boolean hasPage();
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.Page getPage();
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+     */
+    org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder getPageOrBuilder();
+  }
+  /**
+   * Protobuf type {@code org.apache.dubbo.benchmark.bean.Response}
+   */
+  public  static final class Response extends
+      com.google.protobuf.GeneratedMessageV3 implements
+      // @@protoc_insertion_point(message_implements:org.apache.dubbo.benchmark.bean.Response)
+      ResponseOrBuilder {
+  private static final long serialVersionUID = 0L;
+    // Use Response.newBuilder() to construct.
+    private Response(com.google.protobuf.GeneratedMessageV3.Builder<?> builder) {
+      super(builder);
+    }
+    private Response() {
+    }
+
+    @java.lang.Override
+    public final com.google.protobuf.UnknownFieldSet
+    getUnknownFields() {
+      return this.unknownFields;
+    }
+    private Response(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      this();
+      if (extensionRegistry == null) {
+        throw new java.lang.NullPointerException();
+      }
+      int mutable_bitField0_ = 0;
+      com.google.protobuf.UnknownFieldSet.Builder unknownFields =
+          com.google.protobuf.UnknownFieldSet.newBuilder();
+      try {
+        boolean done = false;
+        while (!done) {
+          int tag = input.readTag();
+          switch (tag) {
+            case 0:
+              done = true;
+              break;
+            case 8: {
+
+              state_ = input.readBool();
+              break;
+            }
+            case 18: {
+              org.apache.dubbo.benchmark.bean.PagePB.User.Builder subBuilder = null;
+              if (user_ != null) {
+                subBuilder = user_.toBuilder();
+              }
+              user_ = input.readMessage(org.apache.dubbo.benchmark.bean.PagePB.User.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(user_);
+                user_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            case 26: {
+              org.apache.dubbo.benchmark.bean.PagePB.Page.Builder subBuilder = null;
+              if (page_ != null) {
+                subBuilder = page_.toBuilder();
+              }
+              page_ = input.readMessage(org.apache.dubbo.benchmark.bean.PagePB.Page.parser(), extensionRegistry);
+              if (subBuilder != null) {
+                subBuilder.mergeFrom(page_);
+                page_ = subBuilder.buildPartial();
+              }
+
+              break;
+            }
+            default: {
+              if (!parseUnknownField(
+                  input, unknownFields, extensionRegistry, tag)) {
+                done = true;
+              }
+              break;
+            }
+          }
+        }
+      } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+        throw e.setUnfinishedMessage(this);
+      } catch (java.io.IOException e) {
+        throw new com.google.protobuf.InvalidProtocolBufferException(
+            e).setUnfinishedMessage(this);
+      } finally {
+        this.unknownFields = unknownFields.build();
+        makeExtensionsImmutable();
+      }
+    }
+    public static final com.google.protobuf.Descriptors.Descriptor
+        getDescriptor() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Response_descriptor;
+    }
+
+    @java.lang.Override
+    protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+        internalGetFieldAccessorTable() {
+      return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Response_fieldAccessorTable
+          .ensureFieldAccessorsInitialized(
+              org.apache.dubbo.benchmark.bean.PagePB.Response.class, org.apache.dubbo.benchmark.bean.PagePB.Response.Builder.class);
+    }
+
+    public static final int STATE_FIELD_NUMBER = 1;
+    private boolean state_;
+    /**
+     * <code>bool state = 1;</code>
+     */
+    public boolean getState() {
+      return state_;
+    }
+
+    public static final int USER_FIELD_NUMBER = 2;
+    private org.apache.dubbo.benchmark.bean.PagePB.User user_;
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+     */
+    public boolean hasUser() {
+      return user_ != null;
+    }
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.User getUser() {
+      return user_ == null ? org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance() : user_;
+    }
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUserOrBuilder() {
+      return getUser();
+    }
+
+    public static final int PAGE_FIELD_NUMBER = 3;
+    private org.apache.dubbo.benchmark.bean.PagePB.Page page_;
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+     */
+    public boolean hasPage() {
+      return page_ != null;
+    }
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.Page getPage() {
+      return page_ == null ? org.apache.dubbo.benchmark.bean.PagePB.Page.getDefaultInstance() : page_;
+    }
+    /**
+     * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder getPageOrBuilder() {
+      return getPage();
+    }
+
+    private byte memoizedIsInitialized = -1;
+    @java.lang.Override
+    public final boolean isInitialized() {
+      byte isInitialized = memoizedIsInitialized;
+      if (isInitialized == 1) return true;
+      if (isInitialized == 0) return false;
+
+      memoizedIsInitialized = 1;
+      return true;
+    }
+
+    @java.lang.Override
+    public void writeTo(com.google.protobuf.CodedOutputStream output)
+                        throws java.io.IOException {
+      if (state_ != false) {
+        output.writeBool(1, state_);
+      }
+      if (user_ != null) {
+        output.writeMessage(2, getUser());
+      }
+      if (page_ != null) {
+        output.writeMessage(3, getPage());
+      }
+      unknownFields.writeTo(output);
+    }
+
+    @java.lang.Override
+    public int getSerializedSize() {
+      int size = memoizedSize;
+      if (size != -1) return size;
+
+      size = 0;
+      if (state_ != false) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeBoolSize(1, state_);
+      }
+      if (user_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(2, getUser());
+      }
+      if (page_ != null) {
+        size += com.google.protobuf.CodedOutputStream
+          .computeMessageSize(3, getPage());
+      }
+      size += unknownFields.getSerializedSize();
+      memoizedSize = size;
+      return size;
+    }
+
+    @java.lang.Override
+    public boolean equals(final java.lang.Object obj) {
+      if (obj == this) {
+       return true;
+      }
+      if (!(obj instanceof org.apache.dubbo.benchmark.bean.PagePB.Response)) {
+        return super.equals(obj);
+      }
+      org.apache.dubbo.benchmark.bean.PagePB.Response other = (org.apache.dubbo.benchmark.bean.PagePB.Response) obj;
+
+      if (getState()
+          != other.getState()) return false;
+      if (hasUser() != other.hasUser()) return false;
+      if (hasUser()) {
+        if (!getUser()
+            .equals(other.getUser())) return false;
+      }
+      if (hasPage() != other.hasPage()) return false;
+      if (hasPage()) {
+        if (!getPage()
+            .equals(other.getPage())) return false;
+      }
+      if (!unknownFields.equals(other.unknownFields)) return false;
+      return true;
+    }
+
+    @java.lang.Override
+    public int hashCode() {
+      if (memoizedHashCode != 0) {
+        return memoizedHashCode;
+      }
+      int hash = 41;
+      hash = (19 * hash) + getDescriptor().hashCode();
+      hash = (37 * hash) + STATE_FIELD_NUMBER;
+      hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean(
+          getState());
+      if (hasUser()) {
+        hash = (37 * hash) + USER_FIELD_NUMBER;
+        hash = (53 * hash) + getUser().hashCode();
+      }
+      if (hasPage()) {
+        hash = (37 * hash) + PAGE_FIELD_NUMBER;
+        hash = (53 * hash) + getPage().hashCode();
+      }
+      hash = (29 * hash) + unknownFields.hashCode();
+      memoizedHashCode = hash;
+      return hash;
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        java.nio.ByteBuffer data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        java.nio.ByteBuffer data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        com.google.protobuf.ByteString data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        com.google.protobuf.ByteString data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(byte[] data)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        byte[] data,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws com.google.protobuf.InvalidProtocolBufferException {
+      return PARSER.parseFrom(data, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseDelimitedFrom(java.io.InputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseDelimitedFrom(
+        java.io.InputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseDelimitedWithIOException(PARSER, input, extensionRegistry);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        com.google.protobuf.CodedInputStream input)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input);
+    }
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response parseFrom(
+        com.google.protobuf.CodedInputStream input,
+        com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+        throws java.io.IOException {
+      return com.google.protobuf.GeneratedMessageV3
+          .parseWithIOException(PARSER, input, extensionRegistry);
+    }
+
+    @java.lang.Override
+    public Builder newBuilderForType() { return newBuilder(); }
+    public static Builder newBuilder() {
+      return DEFAULT_INSTANCE.toBuilder();
+    }
+    public static Builder newBuilder(org.apache.dubbo.benchmark.bean.PagePB.Response prototype) {
+      return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype);
+    }
+    @java.lang.Override
+    public Builder toBuilder() {
+      return this == DEFAULT_INSTANCE
+          ? new Builder() : new Builder().mergeFrom(this);
+    }
+
+    @java.lang.Override
+    protected Builder newBuilderForType(
+        com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+      Builder builder = new Builder(parent);
+      return builder;
+    }
+    /**
+     * Protobuf type {@code org.apache.dubbo.benchmark.bean.Response}
+     */
+    public static final class Builder extends
+        com.google.protobuf.GeneratedMessageV3.Builder<Builder> implements
+        // @@protoc_insertion_point(builder_implements:org.apache.dubbo.benchmark.bean.Response)
+        org.apache.dubbo.benchmark.bean.PagePB.ResponseOrBuilder {
+      public static final com.google.protobuf.Descriptors.Descriptor
+          getDescriptor() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Response_descriptor;
+      }
+
+      @java.lang.Override
+      protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+          internalGetFieldAccessorTable() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Response_fieldAccessorTable
+            .ensureFieldAccessorsInitialized(
+                org.apache.dubbo.benchmark.bean.PagePB.Response.class, org.apache.dubbo.benchmark.bean.PagePB.Response.Builder.class);
+      }
+
+      // Construct using org.apache.dubbo.benchmark.bean.PagePB.Response.newBuilder()
+      private Builder() {
+        maybeForceBuilderInitialization();
+      }
+
+      private Builder(
+          com.google.protobuf.GeneratedMessageV3.BuilderParent parent) {
+        super(parent);
+        maybeForceBuilderInitialization();
+      }
+      private void maybeForceBuilderInitialization() {
+        if (com.google.protobuf.GeneratedMessageV3
+                .alwaysUseFieldBuilders) {
+        }
+      }
+      @java.lang.Override
+      public Builder clear() {
+        super.clear();
+        state_ = false;
+
+        if (userBuilder_ == null) {
+          user_ = null;
+        } else {
+          user_ = null;
+          userBuilder_ = null;
+        }
+        if (pageBuilder_ == null) {
+          page_ = null;
+        } else {
+          page_ = null;
+          pageBuilder_ = null;
+        }
+        return this;
+      }
+
+      @java.lang.Override
+      public com.google.protobuf.Descriptors.Descriptor
+          getDescriptorForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.internal_static_org_apache_dubbo_benchmark_bean_Response_descriptor;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Response getDefaultInstanceForType() {
+        return org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance();
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Response build() {
+        org.apache.dubbo.benchmark.bean.PagePB.Response result = buildPartial();
+        if (!result.isInitialized()) {
+          throw newUninitializedMessageException(result);
+        }
+        return result;
+      }
+
+      @java.lang.Override
+      public org.apache.dubbo.benchmark.bean.PagePB.Response buildPartial() {
+        org.apache.dubbo.benchmark.bean.PagePB.Response result = new org.apache.dubbo.benchmark.bean.PagePB.Response(this);
+        result.state_ = state_;
+        if (userBuilder_ == null) {
+          result.user_ = user_;
+        } else {
+          result.user_ = userBuilder_.build();
+        }
+        if (pageBuilder_ == null) {
+          result.page_ = page_;
+        } else {
+          result.page_ = pageBuilder_.build();
+        }
+        onBuilt();
+        return result;
+      }
+
+      @java.lang.Override
+      public Builder clone() {
+        return super.clone();
+      }
+      @java.lang.Override
+      public Builder setField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.setField(field, value);
+      }
+      @java.lang.Override
+      public Builder clearField(
+          com.google.protobuf.Descriptors.FieldDescriptor field) {
+        return super.clearField(field);
+      }
+      @java.lang.Override
+      public Builder clearOneof(
+          com.google.protobuf.Descriptors.OneofDescriptor oneof) {
+        return super.clearOneof(oneof);
+      }
+      @java.lang.Override
+      public Builder setRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          int index, java.lang.Object value) {
+        return super.setRepeatedField(field, index, value);
+      }
+      @java.lang.Override
+      public Builder addRepeatedField(
+          com.google.protobuf.Descriptors.FieldDescriptor field,
+          java.lang.Object value) {
+        return super.addRepeatedField(field, value);
+      }
+      @java.lang.Override
+      public Builder mergeFrom(com.google.protobuf.Message other) {
+        if (other instanceof org.apache.dubbo.benchmark.bean.PagePB.Response) {
+          return mergeFrom((org.apache.dubbo.benchmark.bean.PagePB.Response)other);
+        } else {
+          super.mergeFrom(other);
+          return this;
+        }
+      }
+
+      public Builder mergeFrom(org.apache.dubbo.benchmark.bean.PagePB.Response other) {
+        if (other == org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance()) return this;
+        if (other.getState() != false) {
+          setState(other.getState());
+        }
+        if (other.hasUser()) {
+          mergeUser(other.getUser());
+        }
+        if (other.hasPage()) {
+          mergePage(other.getPage());
+        }
+        this.mergeUnknownFields(other.unknownFields);
+        onChanged();
+        return this;
+      }
+
+      @java.lang.Override
+      public final boolean isInitialized() {
+        return true;
+      }
+
+      @java.lang.Override
+      public Builder mergeFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws java.io.IOException {
+        org.apache.dubbo.benchmark.bean.PagePB.Response parsedMessage = null;
+        try {
+          parsedMessage = PARSER.parsePartialFrom(input, extensionRegistry);
+        } catch (com.google.protobuf.InvalidProtocolBufferException e) {
+          parsedMessage = (org.apache.dubbo.benchmark.bean.PagePB.Response) e.getUnfinishedMessage();
+          throw e.unwrapIOException();
+        } finally {
+          if (parsedMessage != null) {
+            mergeFrom(parsedMessage);
+          }
+        }
+        return this;
+      }
+
+      private boolean state_ ;
+      /**
+       * <code>bool state = 1;</code>
+       */
+      public boolean getState() {
+        return state_;
+      }
+      /**
+       * <code>bool state = 1;</code>
+       */
+      public Builder setState(boolean value) {
+        
+        state_ = value;
+        onChanged();
+        return this;
+      }
+      /**
+       * <code>bool state = 1;</code>
+       */
+      public Builder clearState() {
+        
+        state_ = false;
+        onChanged();
+        return this;
+      }
+
+      private org.apache.dubbo.benchmark.bean.PagePB.User user_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> userBuilder_;
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public boolean hasUser() {
+        return userBuilder_ != null || user_ != null;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User getUser() {
+        if (userBuilder_ == null) {
+          return user_ == null ? org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance() : user_;
+        } else {
+          return userBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public Builder setUser(org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (userBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          user_ = value;
+          onChanged();
+        } else {
+          userBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public Builder setUser(
+          org.apache.dubbo.benchmark.bean.PagePB.User.Builder builderForValue) {
+        if (userBuilder_ == null) {
+          user_ = builderForValue.build();
+          onChanged();
+        } else {
+          userBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public Builder mergeUser(org.apache.dubbo.benchmark.bean.PagePB.User value) {
+        if (userBuilder_ == null) {
+          if (user_ != null) {
+            user_ =
+              org.apache.dubbo.benchmark.bean.PagePB.User.newBuilder(user_).mergeFrom(value).buildPartial();
+          } else {
+            user_ = value;
+          }
+          onChanged();
+        } else {
+          userBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public Builder clearUser() {
+        if (userBuilder_ == null) {
+          user_ = null;
+          onChanged();
+        } else {
+          user_ = null;
+          userBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.User.Builder getUserBuilder() {
+        
+        onChanged();
+        return getUserFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder getUserOrBuilder() {
+        if (userBuilder_ != null) {
+          return userBuilder_.getMessageOrBuilder();
+        } else {
+          return user_ == null ?
+              org.apache.dubbo.benchmark.bean.PagePB.User.getDefaultInstance() : user_;
+        }
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.User user = 2;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder> 
+          getUserFieldBuilder() {
+        if (userBuilder_ == null) {
+          userBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              org.apache.dubbo.benchmark.bean.PagePB.User, org.apache.dubbo.benchmark.bean.PagePB.User.Builder, org.apache.dubbo.benchmark.bean.PagePB.UserOrBuilder>(
+                  getUser(),
+                  getParentForChildren(),
+                  isClean());
+          user_ = null;
+        }
+        return userBuilder_;
+      }
+
+      private org.apache.dubbo.benchmark.bean.PagePB.Page page_;
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.Page, org.apache.dubbo.benchmark.bean.PagePB.Page.Builder, org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder> pageBuilder_;
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public boolean hasPage() {
+        return pageBuilder_ != null || page_ != null;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.Page getPage() {
+        if (pageBuilder_ == null) {
+          return page_ == null ? org.apache.dubbo.benchmark.bean.PagePB.Page.getDefaultInstance() : page_;
+        } else {
+          return pageBuilder_.getMessage();
+        }
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public Builder setPage(org.apache.dubbo.benchmark.bean.PagePB.Page value) {
+        if (pageBuilder_ == null) {
+          if (value == null) {
+            throw new NullPointerException();
+          }
+          page_ = value;
+          onChanged();
+        } else {
+          pageBuilder_.setMessage(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public Builder setPage(
+          org.apache.dubbo.benchmark.bean.PagePB.Page.Builder builderForValue) {
+        if (pageBuilder_ == null) {
+          page_ = builderForValue.build();
+          onChanged();
+        } else {
+          pageBuilder_.setMessage(builderForValue.build());
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public Builder mergePage(org.apache.dubbo.benchmark.bean.PagePB.Page value) {
+        if (pageBuilder_ == null) {
+          if (page_ != null) {
+            page_ =
+              org.apache.dubbo.benchmark.bean.PagePB.Page.newBuilder(page_).mergeFrom(value).buildPartial();
+          } else {
+            page_ = value;
+          }
+          onChanged();
+        } else {
+          pageBuilder_.mergeFrom(value);
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public Builder clearPage() {
+        if (pageBuilder_ == null) {
+          page_ = null;
+          onChanged();
+        } else {
+          page_ = null;
+          pageBuilder_ = null;
+        }
+
+        return this;
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.Page.Builder getPageBuilder() {
+        
+        onChanged();
+        return getPageFieldBuilder().getBuilder();
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      public org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder getPageOrBuilder() {
+        if (pageBuilder_ != null) {
+          return pageBuilder_.getMessageOrBuilder();
+        } else {
+          return page_ == null ?
+              org.apache.dubbo.benchmark.bean.PagePB.Page.getDefaultInstance() : page_;
+        }
+      }
+      /**
+       * <code>.org.apache.dubbo.benchmark.bean.Page page = 3;</code>
+       */
+      private com.google.protobuf.SingleFieldBuilderV3<
+          org.apache.dubbo.benchmark.bean.PagePB.Page, org.apache.dubbo.benchmark.bean.PagePB.Page.Builder, org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder> 
+          getPageFieldBuilder() {
+        if (pageBuilder_ == null) {
+          pageBuilder_ = new com.google.protobuf.SingleFieldBuilderV3<
+              org.apache.dubbo.benchmark.bean.PagePB.Page, org.apache.dubbo.benchmark.bean.PagePB.Page.Builder, org.apache.dubbo.benchmark.bean.PagePB.PageOrBuilder>(
+                  getPage(),
+                  getParentForChildren(),
+                  isClean());
+          page_ = null;
+        }
+        return pageBuilder_;
+      }
+      @java.lang.Override
+      public final Builder setUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.setUnknownFields(unknownFields);
+      }
+
+      @java.lang.Override
+      public final Builder mergeUnknownFields(
+          final com.google.protobuf.UnknownFieldSet unknownFields) {
+        return super.mergeUnknownFields(unknownFields);
+      }
+
+
+      // @@protoc_insertion_point(builder_scope:org.apache.dubbo.benchmark.bean.Response)
+    }
+
+    // @@protoc_insertion_point(class_scope:org.apache.dubbo.benchmark.bean.Response)
+    private static final org.apache.dubbo.benchmark.bean.PagePB.Response DEFAULT_INSTANCE;
+    static {
+      DEFAULT_INSTANCE = new org.apache.dubbo.benchmark.bean.PagePB.Response();
+    }
+
+    public static org.apache.dubbo.benchmark.bean.PagePB.Response getDefaultInstance() {
+      return DEFAULT_INSTANCE;
+    }
+
+    private static final com.google.protobuf.Parser<Response>
+        PARSER = new com.google.protobuf.AbstractParser<Response>() {
+      @java.lang.Override
+      public Response parsePartialFrom(
+          com.google.protobuf.CodedInputStream input,
+          com.google.protobuf.ExtensionRegistryLite extensionRegistry)
+          throws com.google.protobuf.InvalidProtocolBufferException {
+        return new Response(input, extensionRegistry);
+      }
+    };
+
+    public static com.google.protobuf.Parser<Response> parser() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Parser<Response> getParserForType() {
+      return PARSER;
+    }
+
+    @java.lang.Override
+    public org.apache.dubbo.benchmark.bean.PagePB.Response getDefaultInstanceForType() {
+      return DEFAULT_INSTANCE;
+    }
+
+  }
+
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_org_apache_dubbo_benchmark_bean_Page_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_dubbo_benchmark_bean_Page_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_org_apache_dubbo_benchmark_bean_User_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_dubbo_benchmark_bean_User_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_org_apache_dubbo_benchmark_bean_Request_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_dubbo_benchmark_bean_Request_fieldAccessorTable;
+  private static final com.google.protobuf.Descriptors.Descriptor
+    internal_static_org_apache_dubbo_benchmark_bean_Response_descriptor;
+  private static final 
+    com.google.protobuf.GeneratedMessageV3.FieldAccessorTable
+      internal_static_org_apache_dubbo_benchmark_bean_Response_fieldAccessorTable;
+
+  public static com.google.protobuf.Descriptors.FileDescriptor
+      getDescriptor() {
+    return descriptor;
+  }
+  private static  com.google.protobuf.Descriptors.FileDescriptor
+      descriptor;
+  static {
+    java.lang.String[] descriptorData = {
+      "\n\nPage.proto\022\037org.apache.dubbo.benchmark" +
+      ".bean\032\037google/protobuf/timestamp.proto\"[" +
+      "\n\004Page\0224\n\005users\030\001 \003(\0132%.org.apache.dubbo" +
+      ".benchmark.bean.User\022\016\n\006pageNo\030\002 \001(\005\022\r\n\005" +
+      "total\030\003 \001(\005\"\236\002\n\004User\022\n\n\002id\030\001 \001(\003\022\014\n\004name" +
+      "\030\002 \001(\t\022\013\n\003sex\030\003 \001(\005\022,\n\010birthday\030\004 \001(\0132\032." +
+      "google.protobuf.Timestamp\022\r\n\005email\030\005 \001(\t" +
+      "\022\016\n\006mobile\030\006 \001(\t\022\017\n\007address\030\007 \001(\t\022\014\n\004ico" +
+      "n\030\010 \001(\t\022\023\n\013permissions\030\t \003(\005\022\016\n\006status\030\n" +
+      " \001(\005\022.\n\ncreateTime\030\013 \001(\0132\032.google.protob" +
+      "uf.Timestamp\022.\n\nupdateTime\030\014 \001(\0132\032.googl" +
+      "e.protobuf.Timestamp\"g\n\007Request\022\n\n\002id\030\001 " +
+      "\001(\003\022\014\n\004page\030\002 \001(\005\0223\n\004user\030\003 \001(\0132%.org.ap" +
+      "ache.dubbo.benchmark.bean.User\022\r\n\005email\030" +
+      "\004 \001(\t\"\203\001\n\010Response\022\r\n\005state\030\001 \001(\010\0223\n\004use" +
+      "r\030\002 \001(\0132%.org.apache.dubbo.benchmark.bea" +
+      "n.User\0223\n\004page\030\003 \001(\0132%.org.apache.dubbo." +
+      "benchmark.bean.Page2\223\003\n\013UserService\022`\n\te" +
+      "xistUser\022(.org.apache.dubbo.benchmark.be" +
+      "an.Request\032).org.apache.dubbo.benchmark." +
+      "bean.Response\022a\n\ncreateUser\022(.org.apache" +
+      ".dubbo.benchmark.bean.Request\032).org.apac" +
+      "he.dubbo.benchmark.bean.Response\022^\n\007getU" +
+      "ser\022(.org.apache.dubbo.benchmark.bean.Re" +
+      "quest\032).org.apache.dubbo.benchmark.bean." +
+      "Response\022_\n\010listUser\022(.org.apache.dubbo." +
+      "benchmark.bean.Request\032).org.apache.dubb" +
+      "o.benchmark.bean.ResponseB)\n\037org.apache." +
+      "dubbo.benchmark.beanB\006PagePBP\000b\006proto3"
+    };
+    com.google.protobuf.Descriptors.FileDescriptor.InternalDescriptorAssigner assigner =
+        new com.google.protobuf.Descriptors.FileDescriptor.    InternalDescriptorAssigner() {
+          public com.google.protobuf.ExtensionRegistry assignDescriptors(
+              com.google.protobuf.Descriptors.FileDescriptor root) {
+            descriptor = root;
+            return null;
+          }
+        };
+    com.google.protobuf.Descriptors.FileDescriptor
+      .internalBuildGeneratedFileFrom(descriptorData,
+        new com.google.protobuf.Descriptors.FileDescriptor[] {
+          com.google.protobuf.TimestampProto.getDescriptor(),
+        }, assigner);
+    internal_static_org_apache_dubbo_benchmark_bean_Page_descriptor =
+      getDescriptor().getMessageTypes().get(0);
+    internal_static_org_apache_dubbo_benchmark_bean_Page_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_dubbo_benchmark_bean_Page_descriptor,
+        new java.lang.String[] { "Users", "PageNo", "Total", });
+    internal_static_org_apache_dubbo_benchmark_bean_User_descriptor =
+      getDescriptor().getMessageTypes().get(1);
+    internal_static_org_apache_dubbo_benchmark_bean_User_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_dubbo_benchmark_bean_User_descriptor,
+        new java.lang.String[] { "Id", "Name", "Sex", "Birthday", "Email", "Mobile", "Address", "Icon", "Permissions", "Status", "CreateTime", "UpdateTime", });
+    internal_static_org_apache_dubbo_benchmark_bean_Request_descriptor =
+      getDescriptor().getMessageTypes().get(2);
+    internal_static_org_apache_dubbo_benchmark_bean_Request_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_dubbo_benchmark_bean_Request_descriptor,
+        new java.lang.String[] { "Id", "Page", "User", "Email", });
+    internal_static_org_apache_dubbo_benchmark_bean_Response_descriptor =
+      getDescriptor().getMessageTypes().get(3);
+    internal_static_org_apache_dubbo_benchmark_bean_Response_fieldAccessorTable = new
+      com.google.protobuf.GeneratedMessageV3.FieldAccessorTable(
+        internal_static_org_apache_dubbo_benchmark_bean_Response_descriptor,
+        new java.lang.String[] { "State", "User", "Page", });
+    com.google.protobuf.TimestampProto.getDescriptor();
+  }
+
+  // @@protoc_insertion_point(outer_class_scope)
+}
diff --git a/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceDubbo.java b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceDubbo.java
new file mode 100644
index 0000000..4ac53f0
--- /dev/null
+++ b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceDubbo.java
@@ -0,0 +1,59 @@
+
+    package org.apache.dubbo.benchmark.bean;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+@javax.annotation.Generated(
+value = "by Dubbo generator",
+comments = "Source: Page.proto")
+public final class UserServiceDubbo {
+private static final AtomicBoolean registered = new AtomicBoolean();
+
+private static Class<?> init() {
+Class<?> clazz = null;
+try {
+clazz = Class.forName(UserServiceDubbo.class.getName());
+if (registered.compareAndSet(false, true)) {
+    org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller(
+    org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance());
+    org.apache.dubbo.common.serialize.protobuf.support.ProtobufUtils.marshaller(
+    org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance());
+}
+} catch (ClassNotFoundException e) {
+// ignore
+}
+return clazz;
+}
+
+private UserServiceDubbo() {}
+
+public static final String SERVICE_NAME = "org.apache.dubbo.benchmark.bean.UserService";
+
+/**
+* Code generated for Dubbo
+*/
+public interface IUserService {
+
+static Class<?> clazz = init();
+
+    org.apache.dubbo.benchmark.bean.PagePB.Response existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    CompletableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> existUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    org.apache.dubbo.benchmark.bean.PagePB.Response createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    CompletableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> createUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    org.apache.dubbo.benchmark.bean.PagePB.Response getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    CompletableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> getUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    org.apache.dubbo.benchmark.bean.PagePB.Response listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+    CompletableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> listUserAsync(org.apache.dubbo.benchmark.bean.PagePB.Request request);
+
+
+}
+
+}
diff --git a/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceGrpc.java b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceGrpc.java
new file mode 100644
index 0000000..8eacd6c
--- /dev/null
+++ b/benchmark-base/build/generated/source/proto/main/java/org/apache/dubbo/benchmark/bean/UserServiceGrpc.java
@@ -0,0 +1,505 @@
+package org.apache.dubbo.benchmark.bean;
+
+import static io.grpc.MethodDescriptor.generateFullMethodName;
+import static io.grpc.stub.ClientCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ClientCalls.asyncUnaryCall;
+import static io.grpc.stub.ClientCalls.blockingServerStreamingCall;
+import static io.grpc.stub.ClientCalls.blockingUnaryCall;
+import static io.grpc.stub.ClientCalls.futureUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncBidiStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncClientStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncServerStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnaryCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall;
+import static io.grpc.stub.ServerCalls.asyncUnimplementedUnaryCall;
+
+/**
+ */
+@javax.annotation.Generated(
+    value = "by gRPC proto compiler (version 1.19.0)",
+    comments = "Source: Page.proto")
+public final class UserServiceGrpc {
+
+  private UserServiceGrpc() {}
+
+  public static final String SERVICE_NAME = "org.apache.dubbo.benchmark.bean.UserService";
+
+  // Static method descriptors that strictly reflect the proto.
+  private static volatile io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getExistUserMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "existUser",
+      requestType = org.apache.dubbo.benchmark.bean.PagePB.Request.class,
+      responseType = org.apache.dubbo.benchmark.bean.PagePB.Response.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getExistUserMethod() {
+    io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response> getExistUserMethod;
+    if ((getExistUserMethod = UserServiceGrpc.getExistUserMethod) == null) {
+      synchronized (UserServiceGrpc.class) {
+        if ((getExistUserMethod = UserServiceGrpc.getExistUserMethod) == null) {
+          UserServiceGrpc.getExistUserMethod = getExistUserMethod = 
+              io.grpc.MethodDescriptor.<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(
+                  "org.apache.dubbo.benchmark.bean.UserService", "existUser"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance()))
+                  .setSchemaDescriptor(new UserServiceMethodDescriptorSupplier("existUser"))
+                  .build();
+          }
+        }
+     }
+     return getExistUserMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getCreateUserMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "createUser",
+      requestType = org.apache.dubbo.benchmark.bean.PagePB.Request.class,
+      responseType = org.apache.dubbo.benchmark.bean.PagePB.Response.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getCreateUserMethod() {
+    io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response> getCreateUserMethod;
+    if ((getCreateUserMethod = UserServiceGrpc.getCreateUserMethod) == null) {
+      synchronized (UserServiceGrpc.class) {
+        if ((getCreateUserMethod = UserServiceGrpc.getCreateUserMethod) == null) {
+          UserServiceGrpc.getCreateUserMethod = getCreateUserMethod = 
+              io.grpc.MethodDescriptor.<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(
+                  "org.apache.dubbo.benchmark.bean.UserService", "createUser"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance()))
+                  .setSchemaDescriptor(new UserServiceMethodDescriptorSupplier("createUser"))
+                  .build();
+          }
+        }
+     }
+     return getCreateUserMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getGetUserMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "getUser",
+      requestType = org.apache.dubbo.benchmark.bean.PagePB.Request.class,
+      responseType = org.apache.dubbo.benchmark.bean.PagePB.Response.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getGetUserMethod() {
+    io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response> getGetUserMethod;
+    if ((getGetUserMethod = UserServiceGrpc.getGetUserMethod) == null) {
+      synchronized (UserServiceGrpc.class) {
+        if ((getGetUserMethod = UserServiceGrpc.getGetUserMethod) == null) {
+          UserServiceGrpc.getGetUserMethod = getGetUserMethod = 
+              io.grpc.MethodDescriptor.<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(
+                  "org.apache.dubbo.benchmark.bean.UserService", "getUser"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance()))
+                  .setSchemaDescriptor(new UserServiceMethodDescriptorSupplier("getUser"))
+                  .build();
+          }
+        }
+     }
+     return getGetUserMethod;
+  }
+
+  private static volatile io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getListUserMethod;
+
+  @io.grpc.stub.annotations.RpcMethod(
+      fullMethodName = SERVICE_NAME + '/' + "listUser",
+      requestType = org.apache.dubbo.benchmark.bean.PagePB.Request.class,
+      responseType = org.apache.dubbo.benchmark.bean.PagePB.Response.class,
+      methodType = io.grpc.MethodDescriptor.MethodType.UNARY)
+  public static io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request,
+      org.apache.dubbo.benchmark.bean.PagePB.Response> getListUserMethod() {
+    io.grpc.MethodDescriptor<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response> getListUserMethod;
+    if ((getListUserMethod = UserServiceGrpc.getListUserMethod) == null) {
+      synchronized (UserServiceGrpc.class) {
+        if ((getListUserMethod = UserServiceGrpc.getListUserMethod) == null) {
+          UserServiceGrpc.getListUserMethod = getListUserMethod = 
+              io.grpc.MethodDescriptor.<org.apache.dubbo.benchmark.bean.PagePB.Request, org.apache.dubbo.benchmark.bean.PagePB.Response>newBuilder()
+              .setType(io.grpc.MethodDescriptor.MethodType.UNARY)
+              .setFullMethodName(generateFullMethodName(
+                  "org.apache.dubbo.benchmark.bean.UserService", "listUser"))
+              .setSampledToLocalTracing(true)
+              .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Request.getDefaultInstance()))
+              .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller(
+                  org.apache.dubbo.benchmark.bean.PagePB.Response.getDefaultInstance()))
+                  .setSchemaDescriptor(new UserServiceMethodDescriptorSupplier("listUser"))
+                  .build();
+          }
+        }
+     }
+     return getListUserMethod;
+  }
+
+  /**
+   * Creates a new async stub that supports all call types for the service
+   */
+  public static UserServiceStub newStub(io.grpc.Channel channel) {
+    return new UserServiceStub(channel);
+  }
+
+  /**
+   * Creates a new blocking-style stub that supports unary and streaming output calls on the service
+   */
+  public static UserServiceBlockingStub newBlockingStub(
+      io.grpc.Channel channel) {
+    return new UserServiceBlockingStub(channel);
+  }
+
+  /**
+   * Creates a new ListenableFuture-style stub that supports unary calls on the service
+   */
+  public static UserServiceFutureStub newFutureStub(
+      io.grpc.Channel channel) {
+    return new UserServiceFutureStub(channel);
+  }
+
+  /**
+   */
+  public static abstract class UserServiceImplBase implements io.grpc.BindableService {
+
+    /**
+     */
+    public void existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnimplementedUnaryCall(getExistUserMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnimplementedUnaryCall(getCreateUserMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnimplementedUnaryCall(getGetUserMethod(), responseObserver);
+    }
+
+    /**
+     */
+    public void listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnimplementedUnaryCall(getListUserMethod(), responseObserver);
+    }
+
+    @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() {
+      return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor())
+          .addMethod(
+            getExistUserMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                org.apache.dubbo.benchmark.bean.PagePB.Request,
+                org.apache.dubbo.benchmark.bean.PagePB.Response>(
+                  this, METHODID_EXIST_USER)))
+          .addMethod(
+            getCreateUserMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                org.apache.dubbo.benchmark.bean.PagePB.Request,
+                org.apache.dubbo.benchmark.bean.PagePB.Response>(
+                  this, METHODID_CREATE_USER)))
+          .addMethod(
+            getGetUserMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                org.apache.dubbo.benchmark.bean.PagePB.Request,
+                org.apache.dubbo.benchmark.bean.PagePB.Response>(
+                  this, METHODID_GET_USER)))
+          .addMethod(
+            getListUserMethod(),
+            asyncUnaryCall(
+              new MethodHandlers<
+                org.apache.dubbo.benchmark.bean.PagePB.Request,
+                org.apache.dubbo.benchmark.bean.PagePB.Response>(
+                  this, METHODID_LIST_USER)))
+          .build();
+    }
+  }
+
+  /**
+   */
+  public static final class UserServiceStub extends io.grpc.stub.AbstractStub<UserServiceStub> {
+    private UserServiceStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private UserServiceStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected UserServiceStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new UserServiceStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public void existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getExistUserMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getCreateUserMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getGetUserMethod(), getCallOptions()), request, responseObserver);
+    }
+
+    /**
+     */
+    public void listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request,
+        io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response> responseObserver) {
+      asyncUnaryCall(
+          getChannel().newCall(getListUserMethod(), getCallOptions()), request, responseObserver);
+    }
+  }
+
+  /**
+   */
+  public static final class UserServiceBlockingStub extends io.grpc.stub.AbstractStub<UserServiceBlockingStub> {
+    private UserServiceBlockingStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private UserServiceBlockingStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected UserServiceBlockingStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new UserServiceBlockingStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.Response existUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return blockingUnaryCall(
+          getChannel(), getExistUserMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.Response createUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return blockingUnaryCall(
+          getChannel(), getCreateUserMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.Response getUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return blockingUnaryCall(
+          getChannel(), getGetUserMethod(), getCallOptions(), request);
+    }
+
+    /**
+     */
+    public org.apache.dubbo.benchmark.bean.PagePB.Response listUser(org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return blockingUnaryCall(
+          getChannel(), getListUserMethod(), getCallOptions(), request);
+    }
+  }
+
+  /**
+   */
+  public static final class UserServiceFutureStub extends io.grpc.stub.AbstractStub<UserServiceFutureStub> {
+    private UserServiceFutureStub(io.grpc.Channel channel) {
+      super(channel);
+    }
+
+    private UserServiceFutureStub(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      super(channel, callOptions);
+    }
+
+    @java.lang.Override
+    protected UserServiceFutureStub build(io.grpc.Channel channel,
+        io.grpc.CallOptions callOptions) {
+      return new UserServiceFutureStub(channel, callOptions);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> existUser(
+        org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return futureUnaryCall(
+          getChannel().newCall(getExistUserMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> createUser(
+        org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return futureUnaryCall(
+          getChannel().newCall(getCreateUserMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> getUser(
+        org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return futureUnaryCall(
+          getChannel().newCall(getGetUserMethod(), getCallOptions()), request);
+    }
+
+    /**
+     */
+    public com.google.common.util.concurrent.ListenableFuture<org.apache.dubbo.benchmark.bean.PagePB.Response> listUser(
+        org.apache.dubbo.benchmark.bean.PagePB.Request request) {
+      return futureUnaryCall(
+          getChannel().newCall(getListUserMethod(), getCallOptions()), request);
+    }
+  }
+
+  private static final int METHODID_EXIST_USER = 0;
+  private static final int METHODID_CREATE_USER = 1;
+  private static final int METHODID_GET_USER = 2;
+  private static final int METHODID_LIST_USER = 3;
+
+  private static final class MethodHandlers<Req, Resp> implements
+      io.grpc.stub.ServerCalls.UnaryMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ServerStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.ClientStreamingMethod<Req, Resp>,
+      io.grpc.stub.ServerCalls.BidiStreamingMethod<Req, Resp> {
+    private final UserServiceImplBase serviceImpl;
+    private final int methodId;
+
+    MethodHandlers(UserServiceImplBase serviceImpl, int methodId) {
+      this.serviceImpl = serviceImpl;
+      this.methodId = methodId;
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public void invoke(Req request, io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        case METHODID_EXIST_USER:
+          serviceImpl.existUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+              (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+          break;
+        case METHODID_CREATE_USER:
+          serviceImpl.createUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+              (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+          break;
+        case METHODID_GET_USER:
+          serviceImpl.getUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+              (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+          break;
+        case METHODID_LIST_USER:
+          serviceImpl.listUser((org.apache.dubbo.benchmark.bean.PagePB.Request) request,
+              (io.grpc.stub.StreamObserver<org.apache.dubbo.benchmark.bean.PagePB.Response>) responseObserver);
+          break;
+        default:
+          throw new AssertionError();
+      }
+    }
+
+    @java.lang.Override
+    @java.lang.SuppressWarnings("unchecked")
+    public io.grpc.stub.StreamObserver<Req> invoke(
+        io.grpc.stub.StreamObserver<Resp> responseObserver) {
+      switch (methodId) {
+        default:
+          throw new AssertionError();
+      }
+    }
+  }
+
+  private static abstract class UserServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier {
+    UserServiceBaseDescriptorSupplier() {}
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() {
+      return org.apache.dubbo.benchmark.bean.PagePB.getDescriptor();
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() {
+      return getFileDescriptor().findServiceByName("UserService");
+    }
+  }
+
+  private static final class UserServiceFileDescriptorSupplier
+      extends UserServiceBaseDescriptorSupplier {
+    UserServiceFileDescriptorSupplier() {}
+  }
+
+  private static final class UserServiceMethodDescriptorSupplier
+      extends UserServiceBaseDescriptorSupplier
+      implements io.grpc.protobuf.ProtoMethodDescriptorSupplier {
+    private final String methodName;
+
+    UserServiceMethodDescriptorSupplier(String methodName) {
+      this.methodName = methodName;
+    }
+
+    @java.lang.Override
+    public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() {
+      return getServiceDescriptor().findMethodByName(methodName);
+    }
+  }
+
+  private static volatile io.grpc.ServiceDescriptor serviceDescriptor;
+
+  public static io.grpc.ServiceDescriptor getServiceDescriptor() {
+    io.grpc.ServiceDescriptor result = serviceDescriptor;
+    if (result == null) {
+      synchronized (UserServiceGrpc.class) {
+        result = serviceDescriptor;
+        if (result == null) {
+          serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME)
+              .setSchemaDescriptor(new UserServiceFileDescriptorSupplier())
+              .addMethod(getExistUserMethod())
+              .addMethod(getCreateUserMethod())
+              .addMethod(getGetUserMethod())
+              .addMethod(getListUserMethod())
+              .build();
+        }
+      }
+    }
+    return result;
+  }
+}
diff --git a/benchmark-base/pom.xml b/benchmark-base/pom.xml
index 88cd301..0f9d365 100644
--- a/benchmark-base/pom.xml
+++ b/benchmark-base/pom.xml
@@ -11,5 +11,129 @@
 
     <artifactId>benchmark-base</artifactId>
 
+    <properties>
+        <dubbo.compiler.version>0.0.1</dubbo.compiler.version>
+        <grpc.version>1.19.0</grpc.version>
+    </properties>
 
+    <dependencies>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-netty-shaded</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-protobuf</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>io.grpc</groupId>
+            <artifactId>grpc-stub</artifactId>
+            <version>${grpc.version}</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <extensions>
+            <extension>
+                <groupId>kr.motd.maven</groupId>
+                <artifactId>os-maven-plugin</artifactId>
+                <version>1.6.1</version>
+            </extension>
+        </extensions>
+        <plugins>
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>0.5.1</version>
+                <configuration>
+                    <protocArtifact>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}</protocArtifact>
+                    <outputDirectory>build/generated/source/proto/main/java</outputDirectory>
+                    <clearOutputDirectory>false</clearOutputDirectory>
+                    <protocPlugins>
+                        <protocPlugin>
+                            <id>dubbo</id>
+                            <groupId>org.apache.dubbo</groupId>
+                            <artifactId>dubbo-compiler</artifactId>
+                            <version>${dubbo.compiler.version}</version>
+                            <mainClass>org.apache.dubbo.gen.dubbo.DubboGenerator</mainClass>
+                        </protocPlugin>
+                    </protocPlugins>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>test-compile</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+
+            <plugin>
+                <groupId>org.xolstice.maven.plugins</groupId>
+                <artifactId>protobuf-maven-plugin</artifactId>
+                <version>0.5.1</version>
+                <configuration>
+                    <protocArtifact>com.google.protobuf:protoc:3.7.1:exe:${os.detected.classifier}</protocArtifact>
+                    <pluginId>grpc-java</pluginId>
+                    <pluginArtifact>io.grpc:protoc-gen-grpc-java:${grpc.version}:exe:${os.detected.classifier}</pluginArtifact>
+                    <outputDirectory>build/generated/source/proto/main/java</outputDirectory>
+                    <clearOutputDirectory>false</clearOutputDirectory>
+                    <protocPlugins>
+                        <protocPlugin>
+                            <id>dubbo-grpc</id>
+                            <groupId>org.apache.dubbo</groupId>
+                            <artifactId>dubbo-compiler</artifactId>
+                            <version>${dubbo.compiler.version}</version>
+                            <mainClass>org.apache.dubbo.gen.grpc.DubboGrpcGenerator</mainClass>
+                        </protocPlugin>
+                    </protocPlugins>
+                </configuration>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>compile</goal>
+                            <goal>compile-custom</goal>
+                            <goal>test-compile</goal>
+                            <goal>test-compile-custom</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>build-helper-maven-plugin</artifactId>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>add-source</goal>
+                        </goals>
+                        <configuration>
+                            <sources>
+                                <source>build/generated/source/proto/main/java</source>
+                            </sources>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+        </plugins>
+    </build>
 </project>
\ No newline at end of file
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
index cecb779..dd86d3f 100644
--- 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
@@ -6,6 +6,7 @@ import java.time.LocalDateTime;
 import java.util.List;
 
 public class User implements Serializable {
+
     private static final long serialVersionUID = 2566816725396650300L;
 
     private long id;
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
index 505e1ee..a3ea369 100644
--- 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
@@ -10,7 +10,7 @@ import java.util.Collection;
 
 public class SerializationOptimizerImpl implements SerializationOptimizer {
     @Override
-    public Collection<Class> getSerializableClasses() {
+    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/GrpcUserServiceImpl.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/GrpcUserServiceImpl.java
new file mode 100644
index 0000000..8eee596
--- /dev/null
+++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/GrpcUserServiceImpl.java
@@ -0,0 +1,103 @@
+package org.apache.dubbo.benchmark.service;
+
+import com.google.protobuf.util.Timestamps;
+import io.grpc.stub.StreamObserver;
+import org.apache.dubbo.benchmark.bean.DubboUserServiceGrpc;
+import org.apache.dubbo.benchmark.bean.PagePB;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author zhengzechao
+ * @date 2020-03-06
+ * Email ooczzoo@gmail.com
+ */
+public class GrpcUserServiceImpl extends DubboUserServiceGrpc.UserServiceImplBase {
+
+    @Override
+    public void existUser(PagePB.Request request, StreamObserver<PagePB.Response> responseObserver) {
+        String email = request.getEmail();
+        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
+        if (email == null || email.isEmpty()) {
+            builder.setState(true);
+        } else if (email.charAt(email.length() - 1) < '5') {
+            builder.setState(false);
+        }
+        builder.setState(true);
+        PagePB.Response response = builder.build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void createUser(PagePB.Request request, StreamObserver<PagePB.Response> responseObserver) {
+        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
+        if (request.getUser() == null) {
+            builder.setState(false);
+        } else {
+            builder.setState(true);
+        }
+        PagePB.Response response = builder.build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void getUser(PagePB.Request request, StreamObserver<PagePB.Response> responseObserver) {
+        final long id = request.getId();
+        final PagePB.User.Builder user = PagePB.User.newBuilder();
+        user.setId(id);
+        user.setName(new String("Doug Lea"));
+        user.setSex(1);
+        user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+        user.setEmail(new String("dong.lea@gmail.com"));
+        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(Timestamps.fromMillis(System.currentTimeMillis()));
+        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.addAllPermissions(permissions);
+        PagePB.Response response = PagePB.Response.newBuilder().setUser(user.build()).build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
+
+    @Override
+    public void listUser(PagePB.Request request, StreamObserver<PagePB.Response> responseObserver) {
+        final PagePB.Page.Builder page = PagePB.Page.newBuilder();
+        List<PagePB.User> userList = new ArrayList<>(15);
+
+        for (int i = 0; i < 15; i++) {
+            final PagePB.User.Builder user = PagePB.User.newBuilder();
+
+            user.setId(i);
+            user.setName(new String("Doug Lea"));
+            user.setSex(1);
+            user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+            user.setEmail(new String("dong.lea@gmail.com"));
+            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(Timestamps.fromMillis(System.currentTimeMillis()));
+            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.addAllPermissions(permissions);
+            userList.add(user.build());
+        }
+
+        page.setPageNo(request.getPage());
+        page.setTotal(1000);
+        page.addAllUsers(userList);
+
+        PagePB.Response response = PagePB.Response.newBuilder().setPage(page.build()).build();
+        responseObserver.onNext(response);
+        responseObserver.onCompleted();
+    }
+}
diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/PBUserServiceImpl.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/PBUserServiceImpl.java
new file mode 100644
index 0000000..2bc3f93
--- /dev/null
+++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/PBUserServiceImpl.java
@@ -0,0 +1,119 @@
+package org.apache.dubbo.benchmark.service;
+
+import com.google.protobuf.util.Timestamps;
+import org.apache.dubbo.benchmark.bean.PagePB;
+import org.apache.dubbo.benchmark.bean.UserServiceDubbo;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * @author zhengzechao
+ * @date 2020-03-06
+ * Email ooczzoo@gmail.com
+ */
+public class PBUserServiceImpl implements UserServiceDubbo.IUserService {
+
+    @Override
+    public PagePB.Response createUser(PagePB.Request request) {
+        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
+        if (request.getUser() == null) {
+            builder.setState(false);
+        } else {
+            builder.setState(true);
+        }
+        return builder.build();
+    }
+
+    @Override
+    public CompletableFuture<PagePB.Response> createUserAsync(PagePB.Request request) {
+        return null;
+    }
+
+    @Override
+    public PagePB.Response existUser(PagePB.Request request) {
+        String email = request.getEmail();
+        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
+        if (email == null || email.isEmpty()) {
+            builder.setState(true);
+        }else if (email.charAt(email.length() - 1) < '5') {
+            builder.setState(false);
+        }
+
+        builder.setState(true);
+        return builder.build();
+    }
+
+    @Override
+    public CompletableFuture<PagePB.Response> existUserAsync(PagePB.Request request) {
+        return null;
+    }
+
+    @Override
+    public PagePB.Response listUser(PagePB.Request request) {
+
+        final PagePB.Page.Builder page = PagePB.Page.newBuilder();
+        List<PagePB.User> userList = new ArrayList<>(15);
+
+        for (int i = 0; i < 15; i++) {
+            final PagePB.User.Builder user = PagePB.User.newBuilder();
+
+            user.setId(i);
+            user.setName(new String("Doug Lea"));
+            user.setSex(1);
+            user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+            user.setEmail(new String("dong.lea@gmail.com"));
+            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(Timestamps.fromMillis(System.currentTimeMillis()));
+            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.addAllPermissions(permissions);
+            userList.add(user.build());
+        }
+
+        page.setPageNo(request.getPage());
+        page.setTotal(1000);
+        page.addAllUsers(userList);
+
+        return PagePB.Response.newBuilder().setPage(page.build()).build();
+    }
+
+    @Override
+    public CompletableFuture<PagePB.Response> listUserAsync(PagePB.Request request) {
+        return null;
+    }
+
+    @Override
+    public PagePB.Response getUser(PagePB.Request request) {
+        final long id = request.getId();
+        final PagePB.User.Builder user = PagePB.User.newBuilder();
+        user.setId(id);
+        user.setName(new String("Doug Lea"));
+        user.setSex(1);
+        user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+        user.setEmail(new String("dong.lea@gmail.com"));
+        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(Timestamps.fromMillis(System.currentTimeMillis()));
+        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.addAllPermissions(permissions);
+
+        return PagePB.Response.newBuilder().setUser(user.build()).build();
+    }
+
+    @Override
+    public CompletableFuture<PagePB.Response> getUserAsync(PagePB.Request request) {
+        return null;
+    }
+
+}
diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceImplPb.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceImplPb.java
new file mode 100644
index 0000000..8090c0c
--- /dev/null
+++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServiceImplPb.java
@@ -0,0 +1,91 @@
+//package org.apache.dubbo.benchmark.service;
+//
+//import com.google.protobuf.util.Timestamps;
+//import org.apache.dubbo.benchmark.bean.PagePB;
+//
+//import java.util.ArrayList;
+//import java.util.Arrays;
+//import java.util.List;
+//
+//
+//public class UserServiceImplPb implements UserServicePb {
+//    @Override
+//    public PagePB.Response createUser(PagePB.Request request) {
+//        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
+//        if (request.getUser() == null) {
+//            builder.setState(false);
+//        } else {
+//            builder.setState(true);
+//        }
+//        return builder.build();
+//    }
+//
+//    @Override
+//    public PagePB.Response existUser(PagePB.Request request) {
+//        String email = request.getEmail();
+//        final PagePB.Response.Builder builder = PagePB.Response.newBuilder();
+//        if (email == null || email.isEmpty()) {
+//            builder.setState(true);
+//        }else if (email.charAt(email.length() - 1) < '5') {
+//            builder.setState(false);
+//        }
+//
+//        builder.setState(true);
+//        return builder.build();
+//    }
+//
+//    @Override
+//    public PagePB.Response listUser(PagePB.Request request) {
+//
+//        final PagePB.Page.Builder page = PagePB.Page.newBuilder();
+//        List<PagePB.User> userList = new ArrayList<>(15);
+//
+//        for (int i = 0; i < 15; i++) {
+//            final PagePB.User.Builder user = PagePB.User.newBuilder();
+//
+//            user.setId(i);
+//            user.setName(new String("Doug Lea"));
+//            user.setSex(1);
+//            user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+//            user.setEmail(new String("dong.lea@gmail.com"));
+//            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(Timestamps.fromMillis(System.currentTimeMillis()));
+//            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.addAllPermissions(permissions);
+//            userList.add(user.build());
+//        }
+//
+//        page.setPageNo(request.getPage());
+//        page.setTotal(1000);
+//        page.addAllUsers(userList);
+//
+//        return PagePB.Response.newBuilder().setPage(page.build()).build();
+//    }
+//
+//    @Override
+//    public PagePB.Response getUser(PagePB.Request request) {
+//        final long id = request.getId();
+//        final PagePB.User.Builder user = PagePB.User.newBuilder();
+//        user.setId(id);
+//        user.setName(new String("Doug Lea"));
+//        user.setSex(1);
+//        user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+//        user.setEmail(new String("dong.lea@gmail.com"));
+//        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(Timestamps.fromMillis(System.currentTimeMillis()));
+//        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.addAllPermissions(permissions);
+//
+//        return PagePB.Response.newBuilder().setUser(user.build()).build();
+//    }
+//}
diff --git a/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServicePb.java b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServicePb.java
new file mode 100644
index 0000000..fb91063
--- /dev/null
+++ b/benchmark-base/src/main/java/org/apache/dubbo/benchmark/service/UserServicePb.java
@@ -0,0 +1,16 @@
+//package org.apache.dubbo.benchmark.service;
+//
+//import org.apache.dubbo.benchmark.bean.PagePB;
+//
+///**
+// * @author zhengzechao
+// * @date 2019/7/22
+// * Email ooczzoo@gmail.com
+// */
+//public interface UserServicePb {
+//    PagePB.Response createUser(PagePB.Request request);
+//    PagePB.Response existUser(PagePB.Request request);
+//    PagePB.Response listUser(PagePB.Request request);
+//    PagePB.Response getUser(PagePB.Request request);
+//
+//}
diff --git a/benchmark-base/src/main/proto/Page.proto b/benchmark-base/src/main/proto/Page.proto
new file mode 100644
index 0000000..89250eb
--- /dev/null
+++ b/benchmark-base/src/main/proto/Page.proto
@@ -0,0 +1,52 @@
+syntax = "proto3";
+package org.apache.dubbo.benchmark.bean;
+
+import public "google/protobuf/timestamp.proto";
+option java_package = "org.apache.dubbo.benchmark.bean";
+
+// PagePB是最外层的类,其中的message都变成了该类的内部类
+option java_outer_classname = "PagePB";
+
+//### 编译只会生成message,service生成需要借助grpc这样的插件
+message Page {
+    repeated User users = 1;
+    int32 pageNo = 2;
+    int32 total = 3;
+}
+
+message User {
+    int64 id = 1;
+    string name = 2;
+    int32 sex = 3;
+    google.protobuf.Timestamp birthday = 4;
+    string email = 5;
+    string mobile = 6;
+    string address = 7;
+    string icon = 8;
+    repeated int32 permissions = 9;
+    int32 status = 10;
+    google.protobuf.Timestamp createTime = 11;
+    google.protobuf.Timestamp updateTime = 12;
+
+}
+message Request {
+    int64 id = 1;
+    int32 page = 2;
+    User user = 3;
+    string email = 4;
+
+}
+
+message Response {
+    bool state = 1;
+    User user = 2;
+    Page page = 3;
+}
+
+service UserService {
+    rpc existUser (Request) returns (Response);
+    rpc createUser (Request) returns (Response);
+    rpc getUser (Request) returns (Response);
+    rpc listUser (Request) returns (Response);
+
+}
\ No newline at end of file
diff --git a/benchmark.sh b/benchmark.sh
index 4f83b75..ba1d83e 100755
--- a/benchmark.sh
+++ b/benchmark.sh
@@ -12,12 +12,6 @@ usage() {
 }
 
 build() {
-    if [ ! -d dubbo-serialization-native-hessian ] && [[ ${PROJECT_DIR} = *native-hessian* ]]; then
-        git clone https://github.com/dubbo/dubbo-serialization-native-hessian.git
-        pushd dubbo-serialization-native-hessian
-        mvn clean install
-        popd
-    fi
     mvn --projects benchmark-base,client-base,server-base,${PROJECT_DIR} clean package
 }
 
diff --git a/client-base/src/main/java/org/apache/dubbo/Client.java b/client-base/src/main/java/org/apache/dubbo/Client.java
deleted file mode 100644
index ac457fc..0000000
--- a/client-base/src/main/java/org/apache/dubbo/Client.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.apache.dubbo;
-
-import org.apache.dubbo.benchmark.service.UserService;
-import org.springframework.context.support.ClassPathXmlApplicationContext;
-
-public class Client {
-    public static void main(String[] args) {
-        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
-        context.start();
-        UserService userService = (UserService) context.getBean("userService");
-        System.out.println("existUser: " + userService.existUser("user@acme.com"));
-        System.out.println("getUser: " + userService.getUser(1));
-        System.out.println("createUser: " + userService.createUser(userService.getUser(2)));
-        System.out.println("listUser: " + userService.listUser(1));
-    }
-}
diff --git a/client-base/src/main/java/org/apache/dubbo/benchmark/ClientGrpc.java b/client-base/src/main/java/org/apache/dubbo/benchmark/ClientGrpc.java
new file mode 100644
index 0000000..0e342b0
--- /dev/null
+++ b/client-base/src/main/java/org/apache/dubbo/benchmark/ClientGrpc.java
@@ -0,0 +1,121 @@
+package org.apache.dubbo.benchmark;
+
+import com.google.protobuf.util.Timestamps;
+import org.apache.dubbo.benchmark.bean.DubboUserServiceGrpc;
+import org.apache.dubbo.benchmark.bean.PagePB;
+import org.apache.dubbo.benchmark.bean.UserServiceDubbo;
+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.runner.Runner;
+import org.openjdk.jmh.runner.options.ChainedOptionsBuilder;
+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.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@State(Scope.Benchmark)
+public class ClientGrpc {
+    private static final int CONCURRENCY = 32;
+
+    private final ClassPathXmlApplicationContext context;
+    private final DubboUserServiceGrpc.IUserService userService;
+    private final AtomicInteger counter = new AtomicInteger(0);
+
+    public ClientGrpc() {
+        context = new ClassPathXmlApplicationContext("consumer.xml");
+        context.start();
+        userService = (DubboUserServiceGrpc.IUserService) context.getBean("userService");
+    }
+
+
+    @TearDown
+    public void close() throws IOException {
+        context.close();
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public boolean existUser() throws Exception {
+        final int count = counter.getAndIncrement();
+        return userService.existUser(PagePB.Request.newBuilder().setEmail(String.valueOf(count)).build())
+                .getState();
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public boolean createUser() throws Exception {
+        final int count = counter.getAndIncrement();
+
+        final PagePB.User.Builder user = PagePB.User.newBuilder();
+        user.setId(count);
+        user.setName(new String("Doug Lea"));
+        user.setSex(1);
+        user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+        user.setEmail(new String("dong.lea@gmail.com"));
+        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(Timestamps.fromMillis(System.currentTimeMillis()));
+        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.addAllPermissions(permissions);
+        final PagePB.Request.Builder builder = PagePB.Request.newBuilder();
+        return userService.createUser(builder.setUser(user.build()).build()).getState();
+
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public PagePB.User getUser() throws Exception {
+        final int count = counter.getAndIncrement();
+        return userService.getUser(PagePB.Request.newBuilder().setId(count).build()).getUser();
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public PagePB.Page listUser() throws Exception {
+        final int count = counter.getAndIncrement();
+        return userService.listUser(PagePB.Request.newBuilder().setPage(count).build()).getPage();
+    }
+
+    public static void main(String[] args) throws Exception {
+        Options opt;
+        ChainedOptionsBuilder optBuilder = new OptionsBuilder()
+                .include(ClientGrpc.class.getSimpleName())
+                .warmupIterations(3)
+                .warmupTime(TimeValue.seconds(10))
+                .measurementIterations(3)
+                .measurementTime(TimeValue.seconds(10))
+                .threads(CONCURRENCY)
+                .forks(1);
+
+        opt = doOptions(optBuilder).build();
+        new Runner(opt).run();
+    }
+
+    private static ChainedOptionsBuilder doOptions(ChainedOptionsBuilder optBuilder) {
+        String output = System.getProperty("benchmark.output");
+        if (output != null && !output.trim().isEmpty()) {
+            optBuilder.output(output);
+        }
+        return optBuilder;
+    }
+}
diff --git a/client-base/src/main/java/org/apache/dubbo/benchmark/ClientPb.java b/client-base/src/main/java/org/apache/dubbo/benchmark/ClientPb.java
new file mode 100644
index 0000000..4341a75
--- /dev/null
+++ b/client-base/src/main/java/org/apache/dubbo/benchmark/ClientPb.java
@@ -0,0 +1,122 @@
+package org.apache.dubbo.benchmark;
+
+import com.google.protobuf.util.Timestamps;
+import org.apache.dubbo.benchmark.bean.PagePB;
+import org.apache.dubbo.benchmark.bean.UserServiceDubbo;
+import org.apache.dubbo.config.ProtocolConfig;
+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.runner.Runner;
+import org.openjdk.jmh.runner.options.ChainedOptionsBuilder;
+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.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+
+@State(Scope.Benchmark)
+public class ClientPb {
+    private static final int CONCURRENCY = 32;
+
+    private final ClassPathXmlApplicationContext context;
+    private final UserServiceDubbo.IUserService userService;
+    private final AtomicInteger counter = new AtomicInteger(0);
+
+    public ClientPb() {
+        context = new ClassPathXmlApplicationContext("consumer.xml");
+        context.start();
+        userService = (UserServiceDubbo.IUserService) context.getBean("userService");
+    }
+
+
+    @TearDown
+    public void close() throws IOException {
+        context.close();
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public boolean existUser() throws Exception {
+        final int count = counter.getAndIncrement();
+        return userService.existUser(PagePB.Request.newBuilder().setEmail(String.valueOf(count)).build())
+                .getState();
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public boolean createUser() throws Exception {
+        final int count = counter.getAndIncrement();
+
+        final PagePB.User.Builder user = PagePB.User.newBuilder();
+        user.setId(count);
+        user.setName(new String("Doug Lea"));
+        user.setSex(1);
+        user.setBirthday(Timestamps.fromMillis(System.currentTimeMillis()));
+        user.setEmail(new String("dong.lea@gmail.com"));
+        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(Timestamps.fromMillis(System.currentTimeMillis()));
+        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.addAllPermissions(permissions);
+        final PagePB.Request.Builder builder = PagePB.Request.newBuilder();
+        return userService.createUser(builder.setUser(user.build()).build()).getState();
+
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public PagePB.User getUser() throws Exception {
+        final int count = counter.getAndIncrement();
+        return userService.getUser(PagePB.Request.newBuilder().setId(count).build()).getUser();
+    }
+
+    @Benchmark
+    @BenchmarkMode({Mode.Throughput, Mode.AverageTime, Mode.SampleTime})
+    @OutputTimeUnit(TimeUnit.MILLISECONDS)
+    public PagePB.Page listUser() throws Exception {
+        final int count = counter.getAndIncrement();
+        return userService.listUser(PagePB.Request.newBuilder().setPage(count).build()).getPage();
+    }
+
+    public static void main(String[] args) throws Exception {
+        Options opt;
+        ChainedOptionsBuilder optBuilder = new OptionsBuilder()
+                .include(ClientPb.class.getSimpleName())
+                .warmupIterations(3)
+                .warmupTime(TimeValue.seconds(10))
+                .measurementIterations(3)
+                .measurementTime(TimeValue.seconds(10))
+                .threads(CONCURRENCY)
+                .forks(1);
+
+        opt = doOptions(optBuilder).build();
+
+        new Runner(opt).run();
+    }
+
+    private static ChainedOptionsBuilder doOptions(ChainedOptionsBuilder optBuilder) {
+        String output = System.getProperty("benchmark.output");
+        if (output != null && !output.trim().isEmpty()) {
+            optBuilder.output(output);
+        }
+        return optBuilder;
+    }
+}
diff --git a/dubbo-avro-client/pom.xml b/dubbo-avro-client/pom.xml
index ea76927..845dd35 100644
--- a/dubbo-avro-client/pom.xml
+++ b/dubbo-avro-client/pom.xml
@@ -12,6 +12,11 @@
     <artifactId>dubbo-avro-client</artifactId>
     <dependencies>
         <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.avro</groupId>
             <artifactId>avro</artifactId>
         </dependency>
@@ -19,6 +24,31 @@
     <build>
         <plugins>
             <plugin>
+                <groupId>org.apache.avro</groupId>
+                <artifactId>avro-maven-plugin</artifactId>
+                <version>1.9.0</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>schema</goal>
+                        </goals>
+                        <configuration>
+                            <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
+                            <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
                 <inherited>true</inherited>
diff --git a/dubbo-avro-server/pom.xml b/dubbo-avro-server/pom.xml
index ba3e693..969c310 100644
--- a/dubbo-avro-server/pom.xml
+++ b/dubbo-avro-server/pom.xml
@@ -13,6 +13,11 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>server-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>org.apache.avro</groupId>
             <artifactId>avro</artifactId>
         </dependency>
@@ -20,6 +25,31 @@
     <build>
         <plugins>
             <plugin>
+                <groupId>org.apache.avro</groupId>
+                <artifactId>avro-maven-plugin</artifactId>
+                <version>1.9.0</version>
+                <executions>
+                    <execution>
+                        <phase>generate-sources</phase>
+                        <goals>
+                            <goal>schema</goal>
+                        </goals>
+                        <configuration>
+                            <sourceDirectory>${project.basedir}/src/main/avro/</sourceDirectory>
+                            <outputDirectory>${project.basedir}/src/main/java/</outputDirectory>
+                        </configuration>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>1.8</source>
+                    <target>1.8</target>
+                </configuration>
+            </plugin>
+            <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
             </plugin>
diff --git a/dubbo-fastjson-client/pom.xml b/dubbo-fastjson-client/pom.xml
index 8846b59..ff70c44 100644
--- a/dubbo-fastjson-client/pom.xml
+++ b/dubbo-fastjson-client/pom.xml
@@ -13,6 +13,11 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <version>1.2.58</version>
@@ -31,7 +36,7 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
diff --git a/dubbo-fastjson-server/pom.xml b/dubbo-fastjson-server/pom.xml
index 5654d8d..f98d491 100644
--- a/dubbo-fastjson-server/pom.xml
+++ b/dubbo-fastjson-server/pom.xml
@@ -13,6 +13,11 @@
 
     <dependencies>
         <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>server-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
             <groupId>com.alibaba</groupId>
             <artifactId>fastjson</artifactId>
             <version>1.2.58</version>
diff --git a/dubbo-native-hessian-client/pom.xml b/dubbo-grpc-client/pom.xml
similarity index 77%
copy from dubbo-native-hessian-client/pom.xml
copy to dubbo-grpc-client/pom.xml
index f172c50..df490e7 100644
--- a/dubbo-native-hessian-client/pom.xml
+++ b/dubbo-grpc-client/pom.xml
@@ -9,19 +9,23 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-client</artifactId>
+    <artifactId>dubbo-grpc-client</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>client-base</artifactId>
-            <version>${project.version}</version>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
         </dependency>
-
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
-            <version>${dubbo.version}</version>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
@@ -30,23 +34,19 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <inherited>true</inherited>
             </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
-                <inherited>true</inherited>
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.ClientGrpc</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
-
 </project>
\ No newline at end of file
diff --git a/dubbo-grpc-client/src/main/resources/consumer.xml b/dubbo-grpc-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..d6a42d5
--- /dev/null
+++ b/dubbo-grpc-client/src/main/resources/consumer.xml
@@ -0,0 +1,11 @@
+<?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-grpc-client"/>
+    <dubbo:reference scope="remote" id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.bean.DubboUserServiceGrpc$IUserService"
+                     url="grpc://${server.host}:${server.port}" protocol="grpc"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-grpc-server/pom.xml
similarity index 78%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-grpc-server/pom.xml
index c1421b8..80e3a3f 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-grpc-server/pom.xml
@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-grpc-server</artifactId>
 
     <dependencies>
         <dependency>
@@ -17,10 +17,15 @@
             <artifactId>server-base</artifactId>
             <version>${project.version}</version>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
         </dependency>
     </dependencies>
 
@@ -44,5 +49,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-grpc-server/src/main/resources/provider.xml b/dubbo-grpc-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..c797e6a
--- /dev/null
+++ b/dubbo-grpc-server/src/main/resources/provider.xml
@@ -0,0 +1,12 @@
+<?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-pb-server"/>
+    <dubbo:protocol name="grpc" host="${server.host}" server="netty4" port="${server.port}"/>
+    <dubbo:registry address="N/A"/>
+    <dubbo:service interface="org.apache.dubbo.benchmark.bean.DubboUserServiceGrpc$IUserService" ref="userService" filter="-default" serialization="protobuf"/>
+    <bean id="userService" class="org.apache.dubbo.benchmark.service.GrpcUserServiceImpl"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-gson-client/pom.xml b/dubbo-gson-client/pom.xml
index 98d29bd..d342f06 100644
--- a/dubbo-gson-client/pom.xml
+++ b/dubbo-gson-client/pom.xml
@@ -11,6 +11,13 @@
 
     <artifactId>dubbo-gson-client</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
     <build>
         <plugins>
             <plugin>
diff --git a/dubbo-gson-server/pom.xml b/dubbo-gson-server/pom.xml
index 09a58f9..1fd31e1 100644
--- a/dubbo-gson-server/pom.xml
+++ b/dubbo-gson-server/pom.xml
@@ -10,6 +10,13 @@
     <modelVersion>4.0.0</modelVersion>
 
     <artifactId>dubbo-gson-server</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>server-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+    </dependencies>
 
     <build>
         <plugins>
@@ -24,7 +31,7 @@
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
diff --git a/dubbo-native-hessian-client/pom.xml b/dubbo-native-hessian-client/pom.xml
index f172c50..6a43d3d 100644
--- a/dubbo-native-hessian-client/pom.xml
+++ b/dubbo-native-hessian-client/pom.xml
@@ -17,12 +17,14 @@
             <artifactId>client-base</artifactId>
             <version>${project.version}</version>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
-            <version>${dubbo.version}</version>
+            <groupId>com.caucho</groupId>
+            <artifactId>hessian</artifactId>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.dubbo</groupId>-->
+<!--            <artifactId>dubbo-serialization-native-hession</artifactId>-->
+<!--        </dependency>-->
     </dependencies>
 
     <build>
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-native-hessian-server/pom.xml
index c1421b8..9d9a8cb 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-native-hessian-server/pom.xml
@@ -18,10 +18,15 @@
             <version>${project.version}</version>
         </dependency>
 
+
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <groupId>com.caucho</groupId>
+            <artifactId>hessian</artifactId>
         </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.apache.dubbo</groupId>-->
+<!--            <artifactId>dubbo-serialization-native-hession</artifactId>-->
+<!--        </dependency>-->
     </dependencies>
 
     <build>
diff --git a/dubbo-native-hessian-client/pom.xml b/dubbo-pb-client/pom.xml
similarity index 77%
copy from dubbo-native-hessian-client/pom.xml
copy to dubbo-pb-client/pom.xml
index f172c50..fc6ee5e 100644
--- a/dubbo-native-hessian-client/pom.xml
+++ b/dubbo-pb-client/pom.xml
@@ -9,19 +9,23 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-client</artifactId>
+    <artifactId>dubbo-pb-client</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>client-base</artifactId>
-            <version>${project.version}</version>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
         </dependency>
-
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
-            <version>${dubbo.version}</version>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
 
@@ -30,23 +34,19 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <inherited>true</inherited>
             </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
-                <inherited>true</inherited>
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.ClientPb</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
-
 </project>
\ No newline at end of file
diff --git a/dubbo-pb-client/src/main/resources/consumer.xml b/dubbo-pb-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..bd5a848
--- /dev/null
+++ b/dubbo-pb-client/src/main/resources/consumer.xml
@@ -0,0 +1,12 @@
+<?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-pb-client"/>
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.bean.UserServiceDubbo$IUserService"
+                     url="dubbo://${server.host}:${server.port}"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-pb-server/pom.xml
similarity index 78%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-pb-server/pom.xml
index c1421b8..3b9f4cc 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-pb-server/pom.xml
@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-pb-server</artifactId>
 
     <dependencies>
         <dependency>
@@ -17,10 +17,15 @@
             <artifactId>server-base</artifactId>
             <version>${project.version}</version>
         </dependency>
-
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
         </dependency>
     </dependencies>
 
@@ -44,5 +49,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-pb-server/src/main/resources/provider.xml b/dubbo-pb-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..0d4f790
--- /dev/null
+++ b/dubbo-pb-server/src/main/resources/provider.xml
@@ -0,0 +1,12 @@
+<?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-pb-server"/>
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}"/>
+    <dubbo:registry address="N/A"/>
+    <dubbo:service interface="org.apache.dubbo.benchmark.bean.UserServiceDubbo$IUserService" ref="userService" filter="-default" serialization="protobuf"/>
+    <bean id="userService" class="org.apache.dubbo.benchmark.service.PBUserServiceImpl"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-client/pom.xml b/dubbo-protobuf-json-client/pom.xml
similarity index 76%
copy from dubbo-native-hessian-client/pom.xml
copy to dubbo-protobuf-json-client/pom.xml
index f172c50..cfccef4 100644
--- a/dubbo-native-hessian-client/pom.xml
+++ b/dubbo-protobuf-json-client/pom.xml
@@ -9,44 +9,43 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-client</artifactId>
+    <artifactId>dubbo-protobuf-json-client</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>client-base</artifactId>
-            <version>${project.version}</version>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
         </dependency>
-
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
-            <version>${dubbo.version}</version>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <inherited>true</inherited>
             </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
-                <inherited>true</inherited>
                 <configuration>
                     <archive>
                         <manifest>
-                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
+                            <mainClass>org.apache.dubbo.benchmark.ClientPb</mainClass>
                         </manifest>
                     </archive>
                 </configuration>
             </plugin>
         </plugins>
     </build>
-
-
 </project>
\ No newline at end of file
diff --git a/dubbo-protobuf-json-client/src/main/resources/consumer.xml b/dubbo-protobuf-json-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..10342d5
--- /dev/null
+++ b/dubbo-protobuf-json-client/src/main/resources/consumer.xml
@@ -0,0 +1,12 @@
+<?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-protostuff-client"/>
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.bean.UserServiceDubbo$IUserService"
+                     url="dubbo://${server.host}:${server.port}?serialization=protobuf-json"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-protobuf-json-server/pom.xml
similarity index 78%
copy from dubbo-native-hessian-server/pom.xml
copy to dubbo-protobuf-json-server/pom.xml
index c1421b8..c8b0601 100644
--- a/dubbo-native-hessian-server/pom.xml
+++ b/dubbo-protobuf-json-server/pom.xml
@@ -9,21 +9,25 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-native-hessian-server</artifactId>
+    <artifactId>dubbo-protobuf-json-server</artifactId>
 
     <dependencies>
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>server-base</artifactId>
-            <version>${project.version}</version>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java</artifactId>
+            <version>3.7.1</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.protobuf</groupId>
+            <artifactId>protobuf-java-util</artifactId>
+            <version>3.7.1</version>
         </dependency>
-
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <artifactId>server-base</artifactId>
+            <version>${project.version}</version>
         </dependency>
     </dependencies>
-
     <build>
         <plugins>
             <plugin>
@@ -44,5 +48,4 @@
             </plugin>
         </plugins>
     </build>
-
 </project>
\ No newline at end of file
diff --git a/dubbo-protobuf-json-server/src/main/resources/provider.xml b/dubbo-protobuf-json-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..7b426d5
--- /dev/null
+++ b/dubbo-protobuf-json-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-protostuff-server"/>
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}"
+                    serialization="protobuf-json"/>
+    <dubbo:registry address="N/A"/>
+    <dubbo:service interface="org.apache.dubbo.benchmark.bean.UserServiceDubbo$IUserService" ref="userService" filter="-default"/>
+    <bean id="userService" class="org.apache.dubbo.benchmark.service.PBUserServiceImpl"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-protostuff-client/pom.xml b/dubbo-protostuff-client/pom.xml
index 55b0c95..0480b8c 100644
--- a/dubbo-protostuff-client/pom.xml
+++ b/dubbo-protostuff-client/pom.xml
@@ -12,6 +12,11 @@
     <artifactId>dubbo-protostuff-client</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <!-- Protostuff -->
         <dependency>
             <groupId>io.protostuff</groupId>
diff --git a/dubbo-protostuff-server/pom.xml b/dubbo-protostuff-server/pom.xml
index 2ff8a28..dd0d37a 100644
--- a/dubbo-protostuff-server/pom.xml
+++ b/dubbo-protostuff-server/pom.xml
@@ -12,6 +12,11 @@
     <artifactId>dubbo-protostuff-server</artifactId>
 
     <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>server-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
         <!-- Protostuff -->
         <dependency>
             <groupId>io.protostuff</groupId>
diff --git a/pom.xml b/pom.xml
index 783d373..447b85a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,7 +12,7 @@
     <properties>
         <java.source>1.8</java.source>
         <java.target>1.8</java.target>
-        <dubbo.version>2.7.2</dubbo.version>
+        <dubbo.version>2.7.6</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>
@@ -21,6 +21,7 @@
         <slf4j.version>1.7.25</slf4j.version>
         <logback.version>1.2.3</logback.version>
         <junit.version>4.12</junit.version>
+        <cli.version>1.4</cli.version>
     </properties>
 
     <modules>
@@ -43,6 +44,13 @@
         <module>dubbo-protostuff-client</module>
         <module>dubbo-gson-server</module>
         <module>dubbo-gson-client</module>
+        <module>dubbo-protobuf-json-server</module>
+        <module>dubbo-protobuf-json-client</module>
+        <module>dubbo-pb-server</module>
+        <module>dubbo-pb-client</module>
+        <module>dubbo-grpc-server</module>
+        <module>dubbo-grpc-client</module>
+
     </modules>
 
     <dependencies>
@@ -67,6 +75,11 @@
             <groupId>ch.qos.logback</groupId>
             <artifactId>logback-classic</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+        </dependency>
     </dependencies>
 
     <dependencyManagement>
@@ -76,21 +89,24 @@
                 <groupId>org.apache.dubbo</groupId>
                 <artifactId>dubbo-dependencies-bom</artifactId>
                 <version>${dubbo.version}</version>
-               <type>pom</type>
+                <type>pom</type>
                 <scope>import</scope>
             </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>org.apache.dubbo</groupId>
+                <artifactId>dubbo-protobuf-json-server</artifactId>
+                <version>${dubbo.version}</version>
+            </dependency>
 
             <dependency>
                 <groupId>com.esotericsoftware</groupId>
@@ -139,6 +155,12 @@
                 <artifactId>dubbo-serialization-native-hession</artifactId>
                 <version>${dubbo.version}</version>
             </dependency>
+
+            <dependency>
+                <groupId>commons-cli</groupId>
+                <artifactId>commons-cli</artifactId>
+                <version>${cli.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 


[dubbo-benchmark] 06/16: remove useless logback.xml

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 26e86b5c5f5e8bb92bf75a5816ce3433299b4615
Author: beiwei30 <ia...@gmail.com>
AuthorDate: Fri May 25 15:10:43 2018 +0800

    remove useless logback.xml
---
 dubbo-fst-client/src/main/resources/logback.xml    | 26 ----------------------
 .../src/main/resources/logback.xml                 | 26 ----------------------
 dubbo-kryo-client/src/main/resources/logback.xml   | 26 ----------------------
 3 files changed, 78 deletions(-)

diff --git a/dubbo-fst-client/src/main/resources/logback.xml b/dubbo-fst-client/src/main/resources/logback.xml
deleted file mode 100644
index a9b8f56..0000000
--- a/dubbo-fst-client/src/main/resources/logback.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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-fst-client.log</file>
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/dubbo-fst-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>
-
-    <root level="DEBUG">
-         <appender-ref ref="CONSOLE" />
-        <appender-ref ref="FILE"/>
-    </root>
-</configuration>
diff --git a/dubbo-hessianlite-client/src/main/resources/logback.xml b/dubbo-hessianlite-client/src/main/resources/logback.xml
deleted file mode 100644
index cf75589..0000000
--- a/dubbo-hessianlite-client/src/main/resources/logback.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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-hessianlite-client.log</file>
-        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/dubbo-hessianlite-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>
-
-    <root level="INFO">
-        <appender-ref ref="CONSOLE"/>
-        <appender-ref ref="FILE"/>
-    </root>
-</configuration>
diff --git a/dubbo-kryo-client/src/main/resources/logback.xml b/dubbo-kryo-client/src/main/resources/logback.xml
deleted file mode 100644
index 359128e..0000000
--- a/dubbo-kryo-client/src/main/resources/logback.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?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/dubbo-kryo-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>
-
-    <root level="INFO">
-         <appender-ref ref="CONSOLE" />
-        <appender-ref ref="FILE"/>
-    </root>
-</configuration>


[dubbo-benchmark] 05/16: add fst support, simplify project structure

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 1f21438105c964d15b5d202c1b405807539f154c
Author: beiwei30 <ia...@gmail.com>
AuthorDate: Thu May 24 16:04:36 2018 +0800

    add fst support, simplify project structure
---
 .gitignore                                         |  4 +
 benchmark.sh                                       |  4 +-
 client-base/pom.xml                                | 51 ++++++++++++
 .../src/main/java/org/apache/dubbo/Client.java     | 15 ++++
 .../java/org/apache/dubbo/benchmark/Client.java    |  2 +-
 .../src/main/resources/benchmark.properties        |  0
 .../src/main/resources/logback.xml                 |  8 +-
 .../pom.xml                                        | 37 ++-------
 .../src/main/resources/consumer.xml                |  8 +-
 .../src/main/resources/logback.xml                 | 10 +--
 .../pom.xml                                        | 37 ++-------
 .../src/main/resources/provider.xml                | 14 ++--
 dubbo-hessianlite-client/pom.xml                   | 33 +-------
 .../java/org/apache/dubbo/benchmark/Client.java    | 95 ----------------------
 .../src/main/resources/benchmark.properties        |  2 -
 dubbo-hessianlite-server/pom.xml                   | 50 +-----------
 .../java/org/apache/dubbo/benchmark/Server.java    | 14 ----
 .../src/main/resources/benchmark.properties        |  2 -
 dubbo-kryo-client/pom.xml                          | 30 +------
 dubbo-kryo-client/src/main/resources/consumer.xml  |  2 +-
 dubbo-kryo-server/pom.xml                          | 56 +------------
 pom.xml                                            | 49 +++++++++++
 server-base/pom.xml                                | 41 ++++++++++
 .../java/org/apache/dubbo/benchmark/Server.java    |  0
 .../src/main/resources/benchmark.properties        |  0
 .../src/main/resources/logback.xml                 |  4 +-
 26 files changed, 205 insertions(+), 363 deletions(-)

diff --git a/.gitignore b/.gitignore
index 2d74208..82665a0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@ target/
 
 # Log file
 *.log
+logs/
 
 # BlueJ files
 *.ctxt
@@ -29,3 +30,6 @@ hs_err_pid*
 
 # preflight record result
 *.jfr
+
+# jmh output
+*.json
diff --git a/benchmark.sh b/benchmark.sh
index 90c9fe4..0a015fe 100755
--- a/benchmark.sh
+++ b/benchmark.sh
@@ -5,7 +5,7 @@ usage() {
 }
 
 build() {
-    mvn -Dserver.host=${SERVER} -Dserver.port=${PORT} --projects benchmark-base,${PROJECT_DIR} clean package
+    mvn --projects benchmark-base,client-base,server-base,${PROJECT_DIR} clean package
 }
 
 java_options() {
@@ -24,7 +24,7 @@ run() {
         JAR=`find ${PROJECT_DIR}/target/*.jar | head -n 1`
         echo
         echo "RUN ${PROJECT_DIR} IN ${MODE:-benchmark} MODE"
-        CMD="java ${JAVA_OPTIONS} -jar ${JAR}"
+        CMD="java ${JAVA_OPTIONS} -Dserver.host=${SERVER} -Dserver.port=${PORT} -jar ${JAR}"
         echo "command is: ${CMD}"
         echo
         ${CMD}
diff --git a/client-base/pom.xml b/client-base/pom.xml
new file mode 100644
index 0000000..3f279f1
--- /dev/null
+++ b/client-base/pom.xml
@@ -0,0 +1,51 @@
+<?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>client-base</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>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</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>
+</project>
\ No newline at end of file
diff --git a/client-base/src/main/java/org/apache/dubbo/Client.java b/client-base/src/main/java/org/apache/dubbo/Client.java
new file mode 100644
index 0000000..c2f81f7
--- /dev/null
+++ b/client-base/src/main/java/org/apache/dubbo/Client.java
@@ -0,0 +1,15 @@
+package org.apache.dubbo;
+
+import org.apache.dubbo.benchmark.bean.User;
+import org.apache.dubbo.benchmark.service.UserService;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class Client {
+    public static void main(String[] args) {
+        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
+        context.start();
+        UserService userService = (UserService) context.getBean("userService");
+        User user = userService.getUser(1);
+        System.out.println("user: " + user);
+    }
+}
diff --git a/dubbo-kryo-client/src/main/java/org/apache/dubbo/benchmark/Client.java b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
similarity index 98%
rename from dubbo-kryo-client/src/main/java/org/apache/dubbo/benchmark/Client.java
rename to client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
index 08fe221..e6f9051 100644
--- a/dubbo-kryo-client/src/main/java/org/apache/dubbo/benchmark/Client.java
+++ b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
@@ -86,7 +86,7 @@ public class Client extends AbstractClient {
                 .measurementIterations(3)
                 .measurementTime(TimeValue.seconds(10))
                 .threads(CONCURRENCY)
-                .resultFormat(ResultFormatType.JSON)
+//                .resultFormat(ResultFormatType.JSON)
                 .forks(1)
                 .build();
 
diff --git a/dubbo-kryo-server/src/main/resources/benchmark.properties b/client-base/src/main/resources/benchmark.properties
similarity index 100%
rename from dubbo-kryo-server/src/main/resources/benchmark.properties
rename to client-base/src/main/resources/benchmark.properties
diff --git a/dubbo-hessianlite-server/src/main/resources/logback.xml b/client-base/src/main/resources/logback.xml
similarity index 76%
rename from dubbo-hessianlite-server/src/main/resources/logback.xml
rename to client-base/src/main/resources/logback.xml
index 033bde0..202a8f4 100644
--- a/dubbo-hessianlite-server/src/main/resources/logback.xml
+++ b/client-base/src/main/resources/logback.xml
@@ -10,17 +10,17 @@
     </appender>
 
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>logs/dubbo-hessianlite-server.log</file>
+        <file>logs/client-benchmark.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/dubbo-hessianlite-server.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <fileNamePattern>logs/client-benchmark.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
         </rollingPolicy>
         <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <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="CONSOLE" />
         <appender-ref ref="FILE"/>
     </root>
 </configuration>
diff --git a/dubbo-hessianlite-client/pom.xml b/dubbo-fst-client/pom.xml
similarity index 53%
copy from dubbo-hessianlite-client/pom.xml
copy to dubbo-fst-client/pom.xml
index fd24a64..d00e9a8 100644
--- a/dubbo-hessianlite-client/pom.xml
+++ b/dubbo-fst-client/pom.xml
@@ -9,23 +9,17 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-hessianlite-client</artifactId>
-
+    <artifactId>dubbo-fst-client</artifactId>
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>benchmark-base</artifactId>
+            <artifactId>client-base</artifactId>
             <version>${project.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>
+            <groupId>de.ruedigermoeller</groupId>
+            <artifactId>fst</artifactId>
         </dependency>
     </dependencies>
 
@@ -34,32 +28,16 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.0</version>
-                <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>
+                <inherited>true</inherited>
             </plugin>
 
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
-                <version>3.1.0</version>
+                <inherited>true</inherited>
                 <configuration>
                     <archive>
                         <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>libs/</classpathPrefix>
                             <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
@@ -67,7 +45,4 @@
             </plugin>
         </plugins>
     </build>
-
-
-
 </project>
\ No newline at end of file
diff --git a/dubbo-kryo-client/src/main/resources/consumer.xml b/dubbo-fst-client/src/main/resources/consumer.xml
similarity index 63%
copy from dubbo-kryo-client/src/main/resources/consumer.xml
copy to dubbo-fst-client/src/main/resources/consumer.xml
index e87fbda..59fd942 100644
--- a/dubbo-kryo-client/src/main/resources/consumer.xml
+++ b/dubbo-fst-client/src/main/resources/consumer.xml
@@ -4,9 +4,13 @@
        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-kyro-client"/>
+    <dubbo:application name="dubbo-fst-client"/>
+    <!-- FIXME: need to investigate why serialization optimizer doesn't work -->
+    <!--<dubbo:reference id="userService" check="false"-->
+                     <!--interface="org.apache.dubbo.benchmark.service.UserService"-->
+                     <!--url="dubbo://${server.host}:${server.port}?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=fst"/>-->
     <dubbo:reference id="userService" check="false"
                      interface="org.apache.dubbo.benchmark.service.UserService"
-                     url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=kryo"/>
+                     url="dubbo://${server.host}:${server.port}?serialization=fst"/>
     <dubbo:consumer client="netty4" filter="-default"/>
 </beans>
\ No newline at end of file
diff --git a/dubbo-kryo-server/src/main/resources/logback.xml b/dubbo-fst-client/src/main/resources/logback.xml
similarity index 74%
copy from dubbo-kryo-server/src/main/resources/logback.xml
copy to dubbo-fst-client/src/main/resources/logback.xml
index 6b20820..a9b8f56 100644
--- a/dubbo-kryo-server/src/main/resources/logback.xml
+++ b/dubbo-fst-client/src/main/resources/logback.xml
@@ -10,17 +10,17 @@
     </appender>
 
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>logs/dubbo-kryo-server.log</file>
+        <file>logs/dubbo-fst-client.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/dubbo-kryo-server.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <fileNamePattern>logs/dubbo-fst-client.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
         </rollingPolicy>
         <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
+            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern>
         </encoder>
     </appender>
 
-    <root level="INFO">
-        <appender-ref ref="CONSOLE"/>
+    <root level="DEBUG">
+         <appender-ref ref="CONSOLE" />
         <appender-ref ref="FILE"/>
     </root>
 </configuration>
diff --git a/dubbo-hessianlite-client/pom.xml b/dubbo-fst-server/pom.xml
similarity index 52%
copy from dubbo-hessianlite-client/pom.xml
copy to dubbo-fst-server/pom.xml
index fd24a64..ee45cfa 100644
--- a/dubbo-hessianlite-client/pom.xml
+++ b/dubbo-fst-server/pom.xml
@@ -9,23 +9,17 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-hessianlite-client</artifactId>
-
+    <artifactId>dubbo-fst-server</artifactId>
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>benchmark-base</artifactId>
+            <artifactId>server-base</artifactId>
             <version>${project.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>
+            <groupId>de.ruedigermoeller</groupId>
+            <artifactId>fst</artifactId>
         </dependency>
     </dependencies>
 
@@ -34,40 +28,19 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.0</version>
-                <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>
-                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>libs/</classpathPrefix>
-                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
+                            <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-client/src/main/resources/consumer.xml b/dubbo-fst-server/src/main/resources/provider.xml
similarity index 50%
copy from dubbo-kryo-client/src/main/resources/consumer.xml
copy to dubbo-fst-server/src/main/resources/provider.xml
index e87fbda..df2df05 100644
--- a/dubbo-kryo-client/src/main/resources/consumer.xml
+++ b/dubbo-fst-server/src/main/resources/provider.xml
@@ -4,9 +4,13 @@
        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-kyro-client"/>
-    <dubbo:reference id="userService" check="false"
-                     interface="org.apache.dubbo.benchmark.service.UserService"
-                     url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=kryo"/>
-    <dubbo:consumer client="netty4" filter="-default"/>
+    <dubbo:application name="dubbo-fst-server"/>
+
+    <!-- FIXME: need to investigate why serialization optimizer doesn't work -->
+    <!--<dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="fst"-->
+                    <!--optimizer="org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl"/>-->
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}" serialization="fst"/>
+    <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-hessianlite-client/pom.xml b/dubbo-hessianlite-client/pom.xml
index fd24a64..03f40ee 100644
--- a/dubbo-hessianlite-client/pom.xml
+++ b/dubbo-hessianlite-client/pom.xml
@@ -14,19 +14,9 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>benchmark-base</artifactId>
+            <artifactId>client-base</artifactId>
             <version>${project.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>
     </dependencies>
 
     <build>
@@ -34,32 +24,14 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.0</version>
-                <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>
-                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>libs/</classpathPrefix>
                             <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
@@ -67,7 +39,4 @@
             </plugin>
         </plugins>
     </build>
-
-
-
 </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
deleted file mode 100644
index 08fe221..0000000
--- a/dubbo-hessianlite-client/src/main/java/org/apache/dubbo/benchmark/Client.java
+++ /dev/null
@@ -1,95 +0,0 @@
-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
deleted file mode 100644
index 9d276bf..0000000
--- a/dubbo-hessianlite-client/src/main/resources/benchmark.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-server.host=localhost
-server.port=8080
\ No newline at end of file
diff --git a/dubbo-hessianlite-server/pom.xml b/dubbo-hessianlite-server/pom.xml
index 3cf144a..7955249 100644
--- a/dubbo-hessianlite-server/pom.xml
+++ b/dubbo-hessianlite-server/pom.xml
@@ -14,39 +14,9 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>benchmark-base</artifactId>
+            <artifactId>server-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>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>
@@ -54,32 +24,14 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.0</version>
-                <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>
-                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>libs/</classpathPrefix>
                             <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
                         </manifest>
                     </archive>
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
deleted file mode 100644
index 6787d36..0000000
--- a/dubbo-hessianlite-server/src/main/java/org/apache/dubbo/benchmark/Server.java
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 9d276bf..0000000
--- a/dubbo-hessianlite-server/src/main/resources/benchmark.properties
+++ /dev/null
@@ -1,2 +0,0 @@
-server.host=localhost
-server.port=8080
\ No newline at end of file
diff --git a/dubbo-kryo-client/pom.xml b/dubbo-kryo-client/pom.xml
index 4c1e8e8..cb62297 100644
--- a/dubbo-kryo-client/pom.xml
+++ b/dubbo-kryo-client/pom.xml
@@ -14,7 +14,7 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>benchmark-base</artifactId>
+            <artifactId>client-base</artifactId>
             <version>${project.version}</version>
         </dependency>
 
@@ -27,16 +27,6 @@
             <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>
@@ -44,32 +34,14 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.0</version>
-                <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>
-                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>libs/</classpathPrefix>
                             <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
                         </manifest>
                     </archive>
diff --git a/dubbo-kryo-client/src/main/resources/consumer.xml b/dubbo-kryo-client/src/main/resources/consumer.xml
index e87fbda..78cfd28 100644
--- a/dubbo-kryo-client/src/main/resources/consumer.xml
+++ b/dubbo-kryo-client/src/main/resources/consumer.xml
@@ -7,6 +7,6 @@
     <dubbo:application name="dubbo-kyro-client"/>
     <dubbo:reference id="userService" check="false"
                      interface="org.apache.dubbo.benchmark.service.UserService"
-                     url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=kryo"/>
+                     url="dubbo://${server.host}:${server.port}?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=kryo"/>
     <dubbo:consumer client="netty4" filter="-default"/>
 </beans>
\ No newline at end of file
diff --git a/dubbo-kryo-server/pom.xml b/dubbo-kryo-server/pom.xml
index 44415ee..67f2f1a 100644
--- a/dubbo-kryo-server/pom.xml
+++ b/dubbo-kryo-server/pom.xml
@@ -14,50 +14,14 @@
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>benchmark-base</artifactId>
+            <artifactId>server-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>
@@ -65,32 +29,14 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
-                <version>3.1.0</version>
-                <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>
-                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
-                            <addClasspath>true</addClasspath>
-                            <classpathPrefix>libs/</classpathPrefix>
                             <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
                         </manifest>
                     </archive>
diff --git a/pom.xml b/pom.xml
index 4f37b2d..bd9695d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -16,6 +16,7 @@
         <netty.version>4.1.25.Final</netty.version>
         <kryo.version>4.0.2</kryo.version>
         <kryo-serializers.version>0.42</kryo-serializers.version>
+        <fst.version>2.48-jdk-6</fst.version>
         <jmh.version>1.21</jmh.version>
         <slf4j.version>1.7.25</slf4j.version>
         <logback.version>1.2.3</logback.version>
@@ -24,10 +25,14 @@
 
     <modules>
         <module>benchmark-base</module>
+        <module>client-base</module>
         <module>dubbo-kryo-client</module>
         <module>dubbo-kryo-server</module>
         <module>dubbo-hessianlite-client</module>
         <module>dubbo-hessianlite-server</module>
+        <module>dubbo-fst-client</module>
+        <module>dubbo-fst-server</module>
+        <module>server-base</module>
     </modules>
 
     <dependencies>
@@ -86,6 +91,12 @@
             </dependency>
 
             <dependency>
+                <groupId>de.ruedigermoeller</groupId>
+                <artifactId>fst</artifactId>
+                <version>${fst.version}</version>
+            </dependency>
+
+            <dependency>
                 <groupId>org.openjdk.jmh</groupId>
                 <artifactId>jmh-core</artifactId>
                 <version>${jmh.version}</version>
@@ -119,6 +130,44 @@
     </dependencyManagement>
 
     <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-dependency-plugin</artifactId>
+                    <version>3.1.0</version>
+                    <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>
+                    <version>3.1.0</version>
+                    <configuration>
+                        <archive>
+                            <manifest>
+                                <addClasspath>true</addClasspath>
+                                <classpathPrefix>libs/</classpathPrefix>
+                            </manifest>
+                        </archive>
+                    </configuration>
+                </plugin>
+            </plugins>
+
+        </pluginManagement>
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/server-base/pom.xml b/server-base/pom.xml
new file mode 100644
index 0000000..2a11cf2
--- /dev/null
+++ b/server-base/pom.xml
@@ -0,0 +1,41 @@
+<?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>server-base</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>org.slf4j</groupId>
+            <artifactId>slf4j-api</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>ch.qos.logback</groupId>
+            <artifactId>logback-classic</artifactId>
+        </dependency>
+    </dependencies>
+</project>
\ No newline at end of file
diff --git a/dubbo-kryo-server/src/main/java/org/apache/dubbo/benchmark/Server.java b/server-base/src/main/java/org/apache/dubbo/benchmark/Server.java
similarity index 100%
rename from dubbo-kryo-server/src/main/java/org/apache/dubbo/benchmark/Server.java
rename to server-base/src/main/java/org/apache/dubbo/benchmark/Server.java
diff --git a/dubbo-kryo-client/src/main/resources/benchmark.properties b/server-base/src/main/resources/benchmark.properties
similarity index 100%
rename from dubbo-kryo-client/src/main/resources/benchmark.properties
rename to server-base/src/main/resources/benchmark.properties
diff --git a/dubbo-kryo-server/src/main/resources/logback.xml b/server-base/src/main/resources/logback.xml
similarity index 84%
rename from dubbo-kryo-server/src/main/resources/logback.xml
rename to server-base/src/main/resources/logback.xml
index 6b20820..12b8926 100644
--- a/dubbo-kryo-server/src/main/resources/logback.xml
+++ b/server-base/src/main/resources/logback.xml
@@ -10,9 +10,9 @@
     </appender>
 
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>logs/dubbo-kryo-server.log</file>
+        <file>logs/server-benchmark.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/dubbo-kryo-server.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <fileNamePattern>logs/server-benchmark.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
         </rollingPolicy>
         <encoder>
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>


[dubbo-benchmark] 08/16: Support -f output to file

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 5aaf493e5453cd99f3d4af30b51f1f1cfb25257d
Author: zonghaishang <yi...@apache.org>
AuthorDate: Mon Sep 17 13:13:28 2018 +0800

    Support -f output to file
---
 README.md                                          |  4 +--
 benchmark.sh                                       | 32 ++++++++++++++--------
 .../java/org/apache/dubbo/benchmark/Client.java    | 22 +++++++++++----
 3 files changed, 39 insertions(+), 19 deletions(-)

diff --git a/README.md b/README.md
index b91ade0..8d9d2b6 100644
--- a/README.md
+++ b/README.md
@@ -28,8 +28,8 @@ Clone this project onto your desktop, then
 ./benchmark.sh dubbo-kryo-client
 ```
 
-## Specify hostname and port for service
+## Specify hostname, port and output file for service
 
 ```bash
-./benchmark.sh -s [hostname|ip address] -p port
+./benchmark.sh -s [hostname|ip address] -p port -f output
 ```
\ No newline at end of file
diff --git a/benchmark.sh b/benchmark.sh
index e4b1c3c..af5f2ff 100755
--- a/benchmark.sh
+++ b/benchmark.sh
@@ -1,7 +1,13 @@
 #!/usr/bin/env bash
 
 usage() {
-    echo "Usage: ${PROGRAM_NAME} -m {profiling|benchmark} -s hostname -p port dirname"
+    echo "Usage: ${PROGRAM_NAME} command dirname"
+    echo "command: [m|s|p|f]"
+    echo "         -m [profiling|benchmark], specify benchmark mode"
+    echo "         -s hostname, host name"
+    echo "         -p port, port number"
+    echo "         -f output file path"
+    echo "dirname: test module name"
 }
 
 build() {
@@ -18,10 +24,10 @@ java_options() {
     JAVA_OPTIONS="-server -Xmx1g -Xms1g -XX:MaxDirectMemorySize=1g -XX:+UseG1GC"
     if [ "x${MODE}" = "xprofiling" ]; then
         JAVA_OPTIONS="${JAVA_OPTIONS} \
--XX:+UnlockCommercialFeatures \
--XX:+FlightRecorder \
--XX:StartFlightRecording=duration=30s,filename=${PROJECT_DIR}.jfr \
--XX:FlightRecorderOptions=stackdepth=256"
+            -XX:+UnlockCommercialFeatures \
+            -XX:+FlightRecorder \
+            -XX:StartFlightRecording=duration=30s,filename=${PROJECT_DIR}.jfr \
+            -XX:FlightRecorderOptions=stackdepth=256"
     fi
 }
 
@@ -30,7 +36,7 @@ run() {
         JAR=`find ${PROJECT_DIR}/target/*.jar | head -n 1`
         echo
         echo "RUN ${PROJECT_DIR} IN ${MODE:-benchmark} MODE"
-        CMD="java ${JAVA_OPTIONS} -Dserver.host=${SERVER} -Dserver.port=${PORT} -jar ${JAR}"
+        CMD="java ${JAVA_OPTIONS} -Dserver.host=${SERVER} -Dserver.port=${PORT} -Dbenchmark.output=${OUTPUT} -jar ${JAR}"
         echo "command is: ${CMD}"
         echo
         ${CMD}
@@ -41,14 +47,11 @@ PROGRAM_NAME=$0
 MODE="benchmark"
 SERVER="localhost"
 PORT="8080"
+OUTPUT=""
 OPTIND=1
 
-while getopts "h?m:s:p:" opt; do
+while getopts "m:s:p:f:" opt; do
     case "$opt" in
-        h|\?)
-            usage
-            exit 0
-            ;;
         m)
             MODE=${OPTARG}
             ;;
@@ -58,6 +61,13 @@ while getopts "h?m:s:p:" opt; do
         p)
             PORT=${OPTARG}
             ;;
+        f)
+            OUTPUT=${OPTARG}
+            ;;
+        ?)
+            usage
+            exit 0
+            ;;
     esac
 done
 
diff --git a/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
index e6f9051..8b52142 100644
--- a/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
+++ b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
@@ -1,6 +1,7 @@
 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;
@@ -12,8 +13,8 @@ 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.ChainedOptionsBuilder;
 import org.openjdk.jmh.runner.options.Options;
 import org.openjdk.jmh.runner.options.OptionsBuilder;
 import org.openjdk.jmh.runner.options.TimeValue;
@@ -42,8 +43,8 @@ public class Client extends AbstractClient {
 
     @TearDown
     public void close() throws IOException {
-        context.close();
         ProtocolConfig.destroyAll();
+        context.close();
     }
 
     @Benchmark
@@ -79,17 +80,26 @@ public class Client extends AbstractClient {
     }
 
     public static void main(String[] args) throws Exception {
-        Options opt = new OptionsBuilder()
+        Options opt;
+        ChainedOptionsBuilder optBuilder = 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();
+                .forks(1);
+
+        opt = doOptions(optBuilder).build();
 
         new Runner(opt).run();
     }
+
+    private static ChainedOptionsBuilder doOptions(ChainedOptionsBuilder optBuilder) {
+        String output = System.getProperty("benchmark.output");
+        if (output != null && !output.trim().isEmpty()) {
+            optBuilder.output(output);
+        }
+        return optBuilder;
+    }
 }


[dubbo-benchmark] 01/16: Initial commit

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 907a69268c686a805dca0a44d46ad78f3d6769d2
Author: Ian Luo <ia...@gmail.com>
AuthorDate: Thu May 17 17:42:12 2018 +0800

    Initial commit
---
 .gitignore |  23 +++++++
 LICENSE    | 201 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 README.md  |   1 +
 3 files changed, 225 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..a1c2a23
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,23 @@
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..261eeb9
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..91b601e
--- /dev/null
+++ b/README.md
@@ -0,0 +1 @@
+# dubbo-benchmark
\ No newline at end of file


[dubbo-benchmark] 12/16: Update README.md

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 6c12d531d8d95d024e8b7f7bb0e48013d1c1b9e7
Author: Xin Wang <xi...@gmail.com>
AuthorDate: Thu Nov 28 21:07:31 2019 +0800

    Update README.md
---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index df209f7..4aad488 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
 
 This project focuses on benchmarking and profiling dubbo framework with the combination of different serialization and transporter options. The code and the idea behinds it is inspired by [RPC Benchmark](https://github.com/hank-whu/rpc-benchmark). 
 
-## How To Run Benchmark
+## How To Run Benchmark 
 
 Clone this project onto your desktop, then
 
@@ -34,4 +34,4 @@ Clone this project onto your desktop, then
 
 ```bash
 ./benchmark.sh -s [hostname|ip address] -p port -f output
-```
\ No newline at end of file
+```


[dubbo-benchmark] 11/16: Add ci integration (#5)

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 4fad6cba66d45385969c33472cac84de4040b9c3
Author: Huang YunKun <ht...@gmail.com>
AuthorDate: Thu Jul 18 22:51:31 2019 +0800

    Add ci integration (#5)
    
    * add args to change config for jmh
    
    * add travis file
    
    * skip default install
    
    * kill server in background
    
    * add travis status in readme
    
    * add travis status in readme
---
 .travis.yml                                        | 12 +++++++++
 README.md                                          |  2 ++
 benchmark.sh                                       |  9 +++++--
 client-base/pom.xml                                |  6 +++++
 .../java/org/apache/dubbo/benchmark/Client.java    | 30 +++++++++++++++++++---
 5 files changed, 53 insertions(+), 6 deletions(-)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..e287f3e
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,12 @@
+language: java
+
+jdk:
+  - openjdk8
+
+install: true
+
+script:
+  - mvn clean package -DskipTests=true -pl benchmark-base,client-base,server-base
+  - ./benchmark.sh dubbo-kryo-server &
+  - sleep 20
+  - ./benchmark.sh -a "--warmupIterations=1 --warmupTime=1 --measurementIterations=1 --measurementTime=3" dubbo-kryo-client
\ No newline at end of file
diff --git a/README.md b/README.md
index 8d9d2b6..df209f7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
 # Dubbo Benchmark
 
+[![Build Status](https://travis-ci.org/apache/dubbo-benchmark.svg?branch=master)](https://travis-ci.org/apache/dubbo-benchmark)
+
 This project focuses on benchmarking and profiling dubbo framework with the combination of different serialization and transporter options. The code and the idea behinds it is inspired by [RPC Benchmark](https://github.com/hank-whu/rpc-benchmark). 
 
 ## How To Run Benchmark
diff --git a/benchmark.sh b/benchmark.sh
index af5f2ff..4f83b75 100755
--- a/benchmark.sh
+++ b/benchmark.sh
@@ -7,6 +7,7 @@ usage() {
     echo "         -s hostname, host name"
     echo "         -p port, port number"
     echo "         -f output file path"
+    echo "         -a other args"
     echo "dirname: test module name"
 }
 
@@ -36,7 +37,7 @@ run() {
         JAR=`find ${PROJECT_DIR}/target/*.jar | head -n 1`
         echo
         echo "RUN ${PROJECT_DIR} IN ${MODE:-benchmark} MODE"
-        CMD="java ${JAVA_OPTIONS} -Dserver.host=${SERVER} -Dserver.port=${PORT} -Dbenchmark.output=${OUTPUT} -jar ${JAR}"
+        CMD="java ${JAVA_OPTIONS} -Dserver.host=${SERVER} -Dserver.port=${PORT} -Dbenchmark.output=${OUTPUT} -jar ${JAR} ${OTHERARGS}"
         echo "command is: ${CMD}"
         echo
         ${CMD}
@@ -49,8 +50,9 @@ SERVER="localhost"
 PORT="8080"
 OUTPUT=""
 OPTIND=1
+OTHERARGS=""
 
-while getopts "m:s:p:f:" opt; do
+while getopts "m:s:p:f:a:" opt; do
     case "$opt" in
         m)
             MODE=${OPTARG}
@@ -64,6 +66,9 @@ while getopts "m:s:p:f:" opt; do
         f)
             OUTPUT=${OPTARG}
             ;;
+        a)
+            OTHERARGS=${OPTARG}
+            ;;
         ?)
             usage
             exit 0
diff --git a/client-base/pom.xml b/client-base/pom.xml
index d4adb21..9607e04 100644
--- a/client-base/pom.xml
+++ b/client-base/pom.xml
@@ -47,5 +47,11 @@
             <groupId>org.openjdk.jmh</groupId>
             <artifactId>jmh-generator-annprocess</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>commons-cli</groupId>
+            <artifactId>commons-cli</artifactId>
+            <version>1.4</version>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
index bb57bd7..174abfb 100644
--- a/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
+++ b/client-base/src/main/java/org/apache/dubbo/benchmark/Client.java
@@ -1,5 +1,9 @@
 package org.apache.dubbo.benchmark;
 
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.DefaultParser;
+import org.apache.commons.cli.Option;
 import org.apache.dubbo.benchmark.bean.Page;
 import org.apache.dubbo.benchmark.bean.User;
 import org.apache.dubbo.benchmark.rpc.AbstractClient;
@@ -77,19 +81,37 @@ public class Client extends AbstractClient {
     }
 
     public static void main(String[] args) throws Exception {
+        System.out.println(args);
+        org.apache.commons.cli.Options options = new org.apache.commons.cli.Options();
+
+        options.addOption(Option.builder().longOpt("warmupIterations").hasArg().build());
+        options.addOption(Option.builder().longOpt("warmupTime").hasArg().build());
+        options.addOption(Option.builder().longOpt("measurementIterations").hasArg().build());
+        options.addOption(Option.builder().longOpt("measurementTime").hasArg().build());
+
+        CommandLineParser parser = new DefaultParser();
+
+        CommandLine line = parser.parse(options, args);
+
+        int warmupIterations = Integer.valueOf(line.getOptionValue("warmupIterations", "3"));
+        int warmupTime = Integer.valueOf(line.getOptionValue("warmupTime", "10"));
+        int measurementIterations = Integer.valueOf(line.getOptionValue("measurementIterations", "3"));
+        int measurementTime = Integer.valueOf(line.getOptionValue("measurementTime", "10"));
+
         Options opt;
         ChainedOptionsBuilder optBuilder = new OptionsBuilder()
                 .include(Client.class.getSimpleName())
-                .warmupIterations(3)
-                .warmupTime(TimeValue.seconds(10))
-                .measurementIterations(3)
-                .measurementTime(TimeValue.seconds(10))
+                .warmupIterations(warmupIterations)
+                .warmupTime(TimeValue.seconds(warmupTime))
+                .measurementIterations(measurementIterations)
+                .measurementTime(TimeValue.seconds(measurementTime))
                 .threads(CONCURRENCY)
                 .forks(1);
 
         opt = doOptions(optBuilder).build();
 
         new Runner(opt).run();
+
     }
 
     private static ChainedOptionsBuilder doOptions(ChainedOptionsBuilder optBuilder) {


[dubbo-benchmark] 02/16: initial checkin for dubbo benchmark and profile

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 62ce23b1d6059aee9c23b230543672091d5ea46a
Author: beiwei30 <ia...@gmail.com>
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("dong.lea@gmail.com"));
+        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("dong.lea@gmail.com" + 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&amp;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&amp;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


[dubbo-benchmark] 16/16: Merge pull request #8 from CodingSinger/opensource

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 9e919c97f39ae361819925ed0f7772832534d42b
Merge: 6c12d53 2a25884
Author: zechao zheng <oo...@gmail.com>
AuthorDate: Fri Apr 17 08:47:17 2020 +0800

    Merge pull request #8 from CodingSinger/opensource
    
    add pb、grpc、gson、pbstuff、arvo benchmark and upgrade version to 2.7.6

 .../dubbo/benchmark/bean/DubboUserServiceGrpc.java |  324 ++
 .../org/apache/dubbo/benchmark/bean/PagePB.java    | 4808 ++++++++++++++++++++
 .../dubbo/benchmark/bean/UserServiceDubbo.java     |   59 +
 .../dubbo/benchmark/bean/UserServiceGrpc.java      |  505 ++
 benchmark-base/pom.xml                             |  124 +
 .../java/org/apache/dubbo/benchmark/bean/User.java |    1 +
 .../serialize/SerializationOptimizerImpl.java      |    2 +-
 .../benchmark/service/GrpcUserServiceImpl.java     |  103 +
 .../dubbo/benchmark/service/PBUserServiceImpl.java |  119 +
 .../dubbo/benchmark/service/UserServiceImplPb.java |   91 +
 .../dubbo/benchmark/service/UserServicePb.java     |   16 +
 benchmark-base/src/main/proto/Page.proto           |   52 +
 benchmark.sh                                       |    6 -
 client-base/pom.xml                                |   11 -
 .../src/main/java/org/apache/dubbo/Client.java     |   16 -
 .../org/apache/dubbo/benchmark/ClientGrpc.java     |  121 +
 .../java/org/apache/dubbo/benchmark/ClientPb.java  |  122 +
 .../pom.xml                                        |   36 +-
 dubbo-avro-client/src/main/resources/consumer.xml  |   16 +
 .../pom.xml                                        |   34 +-
 dubbo-avro-server/src/main/resources/provider.xml  |   16 +
 .../pom.xml                                        |   14 +-
 .../src/main/resources/consumer.xml                |   16 +
 .../pom.xml                                        |   10 +-
 .../src/main/resources/provider.xml                |   16 +
 .../pom.xml                                        |   23 +-
 dubbo-grpc-client/src/main/resources/consumer.xml  |   11 +
 .../pom.xml                                        |   14 +-
 dubbo-grpc-server/src/main/resources/provider.xml  |   12 +
 .../pom.xml                                        |   13 +-
 dubbo-gson-client/src/main/resources/consumer.xml  |   12 +
 .../pom.xml                                        |    9 +-
 dubbo-gson-server/src/main/resources/provider.xml  |   12 +
 dubbo-native-hessian-client/pom.xml                |    9 +-
 dubbo-native-hessian-server/pom.xml                |    9 +-
 .../pom.xml                                        |   23 +-
 dubbo-pb-client/src/main/resources/consumer.xml    |   12 +
 .../pom.xml                                        |   14 +-
 dubbo-pb-server/src/main/resources/provider.xml    |   12 +
 .../pom.xml                                        |   24 +-
 .../src/main/resources/consumer.xml                |   12 +
 .../pom.xml                                        |   19 +-
 .../src/main/resources/provider.xml                |   13 +
 .../pom.xml                                        |   23 +-
 .../src/main/resources/consumer.xml                |   12 +
 .../pom.xml                                        |   22 +-
 .../src/main/resources/provider.xml                |   13 +
 pom.xml                                            |   60 +-
 server-base/pom.xml                                |    5 -
 49 files changed, 6851 insertions(+), 175 deletions(-)


[dubbo-benchmark] 03/16: update

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 5077901640b680dda08e0d4f799d48f5b23ee091
Author: beiwei30 <ia...@gmail.com>
AuthorDate: Mon May 21 18:04:56 2018 +0800

    update
---
 README.md                                          | 36 ++++++++++-
 benchmark.sh                                       | 60 +++++++++++------
 dubbo-hessianlite-client/pom.xml                   | 58 +++++++++++++++++
 .../src/main/resources/consumer.xml                |  8 ++-
 .../src/main/resources/logback.xml                 | 10 ++-
 dubbo-hessianlite-server/pom.xml                   | 75 ++++++++++++++++++++++
 .../src/main/resources/logback.xml                 |  4 +-
 .../src/main/resources/provider.xml                |  5 +-
 dubbo-kryo-client/pom.xml                          |  7 +-
 dubbo-kryo-client/src/main/resources/consumer.xml  |  6 +-
 dubbo-kryo-client/src/main/resources/logback.xml   |  4 +-
 dubbo-kryo-server/pom.xml                          |  2 +
 dubbo-kryo-server/src/main/resources/logback.xml   |  8 +--
 dubbo-kryo-server/src/main/resources/provider.xml  |  2 +-
 pom.xml                                            |  2 +
 15 files changed, 237 insertions(+), 50 deletions(-)

diff --git a/README.md b/README.md
index 91b601e..b91ade0 100644
--- a/README.md
+++ b/README.md
@@ -1 +1,35 @@
-# dubbo-benchmark
\ No newline at end of file
+# Dubbo Benchmark
+
+This project focuses on benchmarking and profiling dubbo framework with the combination of different serialization and transporter options. The code and the idea behinds it is inspired by [RPC Benchmark](https://github.com/hank-whu/rpc-benchmark). 
+
+## How To Run Benchmark
+
+Clone this project onto your desktop, then
+
+* Start the target server first, for example:
+```bash
+./benchmark.sh dubbo-kryo-server
+```
+
+* Start the corresponding client, for example:
+```bash
+./benchmark.sh dubbo-kryo-client
+```
+
+## How to Run Profiling
+
+* Start the target server in profiling mode, for example:
+```bash
+./benchmark.sh -m profiling dubbo-kryo-server
+```
+
+* Start the corresponding client, for example:
+```bash
+./benchmark.sh dubbo-kryo-client
+```
+
+## Specify hostname and port for service
+
+```bash
+./benchmark.sh -s [hostname|ip address] -p port
+```
\ No newline at end of file
diff --git a/benchmark.sh b/benchmark.sh
index 1959c92..90c9fe4 100755
--- a/benchmark.sh
+++ b/benchmark.sh
@@ -1,39 +1,29 @@
 #!/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
+    echo "Usage: ${PROGRAM_NAME} -m {profiling|benchmark} -s hostname -p port dirname"
 }
 
 build() {
-    mvn clean package
+    mvn -Dserver.host=${SERVER} -Dserver.port=${PORT} --projects benchmark-base,${PROJECT_DIR} clean package
 }
 
-options() {
+java_options() {
     JAVA_OPTIONS="-server -Xmx1g -Xms1g -XX:MaxDirectMemorySize=1g -XX:+UseG1GC"
-    if [ "x${PROFILE}" = "xprofiling" ]; then
+    if [ "x${MODE}" = "xprofiling" ]; then
         JAVA_OPTIONS="${JAVA_OPTIONS} \
 -XX:+UnlockCommercialFeatures \
 -XX:+FlightRecorder \
--XX:StartFlightRecording=duration=30s,filename=${TASK}.jfr \
+-XX:StartFlightRecording=duration=30s,filename=${PROJECT_DIR}.jfr \
 -XX:FlightRecorderOptions=stackdepth=256"
     fi
 }
 
 run() {
-    if [ -d "${TASK}/target" ]; then
-        JAR=`find ${TASK}/target/*.jar | head -n 1`
+    if [ -d "${PROJECT_DIR}/target" ]; then
+        JAR=`find ${PROJECT_DIR}/target/*.jar | head -n 1`
         echo
-        echo "RUN ${TASK} IN ${PROFILE:-benchmark} MODE"
+        echo "RUN ${PROJECT_DIR} IN ${MODE:-benchmark} MODE"
         CMD="java ${JAVA_OPTIONS} -jar ${JAR}"
         echo "command is: ${CMD}"
         echo
@@ -41,8 +31,40 @@ run() {
     fi
 }
 
+PROGRAM_NAME=$0
+MODE="benchmark"
+SERVER="localhost"
+PORT="8080"
+OPTIND=1
+
+while getopts "h?m:s:p:" opt; do
+    case "$opt" in
+        h|\?)
+            usage
+            exit 0
+            ;;
+        m)
+            MODE=${OPTARG}
+            ;;
+        s)
+            SERVER=${OPTARG}
+            ;;
+        p)
+            PORT=${OPTARG}
+            ;;
+    esac
+done
+
+shift $((OPTIND-1))
+PROJECT_DIR=$1
+
+if [ ! -d "${PROJECT_DIR}" ]; then
+    usage
+    exit 0
+fi
+
 build
-options
+java_options
 run
 
 
diff --git a/dubbo-hessianlite-client/pom.xml b/dubbo-hessianlite-client/pom.xml
index 36640db..fd24a64 100644
--- a/dubbo-hessianlite-client/pom.xml
+++ b/dubbo-hessianlite-client/pom.xml
@@ -11,5 +11,63 @@
 
     <artifactId>dubbo-hessianlite-client</artifactId>
 
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>benchmark-base</artifactId>
+            <version>${project.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>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.1.0</version>
+                <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>
+                <version>3.1.0</version>
+                <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-hessianlite-client/src/main/resources/consumer.xml b/dubbo-hessianlite-client/src/main/resources/consumer.xml
index 22c89f9..e036f94 100644
--- a/dubbo-hessianlite-client/src/main/resources/consumer.xml
+++ b/dubbo-hessianlite-client/src/main/resources/consumer.xml
@@ -1,10 +1,12 @@
 <?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"/>
+       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-hessianlite-client"/>
     <dubbo:reference id="userService" check="false"
                      interface="org.apache.dubbo.benchmark.service.UserService"
-                     url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=kryo"/>
+                     url="dubbo://${server.host}:${server.port}"/>
     <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
index cb8c9fd..cf75589 100644
--- a/dubbo-hessianlite-client/src/main/resources/logback.xml
+++ b/dubbo-hessianlite-client/src/main/resources/logback.xml
@@ -10,19 +10,17 @@
     </appender>
 
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>logs/dubbo-kyro-client.log</file>
+        <file>logs/dubbo-hessianlite-client.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/benchmark-rpc-client.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <fileNamePattern>logs/dubbo-hessianlite-client.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
         </rollingPolicy>
         <encoder>
-            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n </pattern>
+            <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="CONSOLE"/>
         <appender-ref ref="FILE"/>
     </root>
 </configuration>
diff --git a/dubbo-hessianlite-server/pom.xml b/dubbo-hessianlite-server/pom.xml
index 7b095f2..3cf144a 100644
--- a/dubbo-hessianlite-server/pom.xml
+++ b/dubbo-hessianlite-server/pom.xml
@@ -11,5 +11,80 @@
 
     <artifactId>dubbo-hessianlite-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>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>
+                <version>3.1.0</version>
+                <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>
+                <version>3.1.0</version>
+                <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-hessianlite-server/src/main/resources/logback.xml b/dubbo-hessianlite-server/src/main/resources/logback.xml
index 6b20820..033bde0 100644
--- a/dubbo-hessianlite-server/src/main/resources/logback.xml
+++ b/dubbo-hessianlite-server/src/main/resources/logback.xml
@@ -10,9 +10,9 @@
     </appender>
 
     <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
-        <file>logs/dubbo-kryo-server.log</file>
+        <file>logs/dubbo-hessianlite-server.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
-            <fileNamePattern>logs/dubbo-kryo-server.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
+            <fileNamePattern>logs/dubbo-hessianlite-server.%d{yyyy-MM-dd}.log.gz</fileNamePattern>
         </rollingPolicy>
         <encoder>
             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
diff --git a/dubbo-hessianlite-server/src/main/resources/provider.xml b/dubbo-hessianlite-server/src/main/resources/provider.xml
index c0ba8cd..937ecf5 100644
--- a/dubbo-hessianlite-server/src/main/resources/provider.xml
+++ b/dubbo-hessianlite-server/src/main/resources/provider.xml
@@ -4,9 +4,8 @@
        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:application name="dubbo-hessianlite-server"/>
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}"/>
     <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"/>
diff --git a/dubbo-kryo-client/pom.xml b/dubbo-kryo-client/pom.xml
index eeee860..d79c37f 100644
--- a/dubbo-kryo-client/pom.xml
+++ b/dubbo-kryo-client/pom.xml
@@ -19,11 +19,6 @@
         </dependency>
 
         <dependency>
-            <groupId>com.esotericsoftware</groupId>
-            <artifactId>kryo</artifactId>
-        </dependency>
-
-        <dependency>
             <groupId>de.javakaffee</groupId>
             <artifactId>kryo-serializers</artifactId>
         </dependency>
@@ -49,6 +44,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.1.0</version>
                 <executions>
                     <execution>
                         <id>copy-dependencies</id>
@@ -68,6 +64,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
+                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
diff --git a/dubbo-kryo-client/src/main/resources/consumer.xml b/dubbo-kryo-client/src/main/resources/consumer.xml
index 22c89f9..e87fbda 100644
--- a/dubbo-kryo-client/src/main/resources/consumer.xml
+++ b/dubbo-kryo-client/src/main/resources/consumer.xml
@@ -1,8 +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"/>
+       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-kyro-client"/>
     <dubbo:reference id="userService" check="false"
                      interface="org.apache.dubbo.benchmark.service.UserService"
                      url="dubbo://localhost:8080?optimizer=org.apache.dubbo.benchmark.serialize.SerializationOptimizerImpl&amp;serialization=kryo"/>
diff --git a/dubbo-kryo-client/src/main/resources/logback.xml b/dubbo-kryo-client/src/main/resources/logback.xml
index cb8c9fd..359128e 100644
--- a/dubbo-kryo-client/src/main/resources/logback.xml
+++ b/dubbo-kryo-client/src/main/resources/logback.xml
@@ -12,15 +12,13 @@
     <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>
+            <fileNamePattern>logs/dubbo-kryo-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"/>
diff --git a/dubbo-kryo-server/pom.xml b/dubbo-kryo-server/pom.xml
index 4d5f6bd..44415ee 100644
--- a/dubbo-kryo-server/pom.xml
+++ b/dubbo-kryo-server/pom.xml
@@ -65,6 +65,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
+                <version>3.1.0</version>
                 <executions>
                     <execution>
                         <id>copy-dependencies</id>
@@ -84,6 +85,7 @@
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-jar-plugin</artifactId>
+                <version>3.1.0</version>
                 <configuration>
                     <archive>
                         <manifest>
diff --git a/dubbo-kryo-server/src/main/resources/logback.xml b/dubbo-kryo-server/src/main/resources/logback.xml
index 3ba87e6..6b20820 100644
--- a/dubbo-kryo-server/src/main/resources/logback.xml
+++ b/dubbo-kryo-server/src/main/resources/logback.xml
@@ -12,17 +12,15 @@
     <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>
+            <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>
+            <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="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
index 3666e87..c0ba8cd 100644
--- a/dubbo-kryo-server/src/main/resources/provider.xml
+++ b/dubbo-kryo-server/src/main/resources/provider.xml
@@ -4,7 +4,7 @@
        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: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"/>
diff --git a/pom.xml b/pom.xml
index 20bea57..4f37b2d 100644
--- a/pom.xml
+++ b/pom.xml
@@ -26,6 +26,8 @@
         <module>benchmark-base</module>
         <module>dubbo-kryo-client</module>
         <module>dubbo-kryo-server</module>
+        <module>dubbo-hessianlite-client</module>
+        <module>dubbo-hessianlite-server</module>
     </modules>
 
     <dependencies>


[dubbo-benchmark] 04/16: rename artifact id

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 3b8c20bd84666e90526db5a4f4f58799471b7e90
Author: beiwei30 <ia...@gmail.com>
AuthorDate: Thu May 24 12:01:13 2018 +0800

    rename artifact id
---
 dubbo-kryo-client/pom.xml | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/dubbo-kryo-client/pom.xml b/dubbo-kryo-client/pom.xml
index d79c37f..4c1e8e8 100644
--- a/dubbo-kryo-client/pom.xml
+++ b/dubbo-kryo-client/pom.xml
@@ -9,7 +9,7 @@
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-client-kryo</artifactId>
+    <artifactId>dubbo-kryo-client</artifactId>
 
     <dependencies>
         <dependency>


[dubbo-benchmark] 07/16: native hessian

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit c1e29216b4bb391cbd3259719a90c30b94e6e9e1
Author: beiwei30 <ia...@gmail.com>
AuthorDate: Tue May 29 11:08:15 2018 +0800

    native hessian
---
 .gitignore                                         |  3 ++
 benchmark.sh                                       |  6 +++
 .../src/main/java/org/apache/dubbo/Client.java     |  7 +--
 dubbo-native-hessian-client/pom.xml                | 51 ++++++++++++++++++++++
 .../src/main/resources/consumer.xml                | 12 +++++
 dubbo-native-hessian-server/pom.xml                | 48 ++++++++++++++++++++
 .../src/main/resources/provider.xml                | 13 ++++++
 pom.xml                                            | 11 ++++-
 8 files changed, 147 insertions(+), 4 deletions(-)

diff --git a/.gitignore b/.gitignore
index 82665a0..0a0a76b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -33,3 +33,6 @@ hs_err_pid*
 
 # jmh output
 *.json
+
+# dubbo-serialization-native-hessian git repo
+dubbo-serialization-native-hessian/
diff --git a/benchmark.sh b/benchmark.sh
index 0a015fe..e4b1c3c 100755
--- a/benchmark.sh
+++ b/benchmark.sh
@@ -5,6 +5,12 @@ usage() {
 }
 
 build() {
+    if [ ! -d dubbo-serialization-native-hessian ] && [[ ${PROJECT_DIR} = *native-hessian* ]]; then
+        git clone https://github.com/dubbo/dubbo-serialization-native-hessian.git
+        pushd dubbo-serialization-native-hessian
+        mvn clean install
+        popd
+    fi
     mvn --projects benchmark-base,client-base,server-base,${PROJECT_DIR} clean package
 }
 
diff --git a/client-base/src/main/java/org/apache/dubbo/Client.java b/client-base/src/main/java/org/apache/dubbo/Client.java
index c2f81f7..ac457fc 100644
--- a/client-base/src/main/java/org/apache/dubbo/Client.java
+++ b/client-base/src/main/java/org/apache/dubbo/Client.java
@@ -1,6 +1,5 @@
 package org.apache.dubbo;
 
-import org.apache.dubbo.benchmark.bean.User;
 import org.apache.dubbo.benchmark.service.UserService;
 import org.springframework.context.support.ClassPathXmlApplicationContext;
 
@@ -9,7 +8,9 @@ public class Client {
         ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");
         context.start();
         UserService userService = (UserService) context.getBean("userService");
-        User user = userService.getUser(1);
-        System.out.println("user: " + user);
+        System.out.println("existUser: " + userService.existUser("user@acme.com"));
+        System.out.println("getUser: " + userService.getUser(1));
+        System.out.println("createUser: " + userService.createUser(userService.getUser(2)));
+        System.out.println("listUser: " + userService.listUser(1));
     }
 }
diff --git a/dubbo-native-hessian-client/pom.xml b/dubbo-native-hessian-client/pom.xml
new file mode 100644
index 0000000..d2c19b8
--- /dev/null
+++ b/dubbo-native-hessian-client/pom.xml
@@ -0,0 +1,51 @@
+<?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-native-hessian-client</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>client-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-native-hessian</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+                <inherited>true</inherited>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <inherited>true</inherited>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>org.apache.dubbo.benchmark.Client</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+
+</project>
\ No newline at end of file
diff --git a/dubbo-native-hessian-client/src/main/resources/consumer.xml b/dubbo-native-hessian-client/src/main/resources/consumer.xml
new file mode 100644
index 0000000..63651c7
--- /dev/null
+++ b/dubbo-native-hessian-client/src/main/resources/consumer.xml
@@ -0,0 +1,12 @@
+<?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-native-hessian-client"/>
+    <dubbo:reference id="userService" check="false"
+                     interface="org.apache.dubbo.benchmark.service.UserService"
+                     url="dubbo://${server.host}:${server.port}?serialization=native-hessian"/>
+    <dubbo:consumer client="netty4" filter="-default"/>
+</beans>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/pom.xml b/dubbo-native-hessian-server/pom.xml
new file mode 100644
index 0000000..5e7cbd4
--- /dev/null
+++ b/dubbo-native-hessian-server/pom.xml
@@ -0,0 +1,48 @@
+<?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-native-hessian-server</artifactId>
+
+    <dependencies>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>server-base</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-native-hessian</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-dependency-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-jar-plugin</artifactId>
+                <configuration>
+                    <archive>
+                        <manifest>
+                            <mainClass>org.apache.dubbo.benchmark.Server</mainClass>
+                        </manifest>
+                    </archive>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>
\ No newline at end of file
diff --git a/dubbo-native-hessian-server/src/main/resources/provider.xml b/dubbo-native-hessian-server/src/main/resources/provider.xml
new file mode 100644
index 0000000..1aa66c0
--- /dev/null
+++ b/dubbo-native-hessian-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-native-hessian-server"/>
+    <dubbo:protocol name="dubbo" host="${server.host}" server="netty4" port="${server.port}"
+                    serialization="native-hessian"/>
+    <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
index bd9695d..ea0d6c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
         <kryo.version>4.0.2</kryo.version>
         <kryo-serializers.version>0.42</kryo-serializers.version>
         <fst.version>2.48-jdk-6</fst.version>
+        <native-hessian.version>1.0-SNAPSHOT</native-hessian.version>
         <jmh.version>1.21</jmh.version>
         <slf4j.version>1.7.25</slf4j.version>
         <logback.version>1.2.3</logback.version>
@@ -25,6 +26,7 @@
 
     <modules>
         <module>benchmark-base</module>
+        <module>server-base</module>
         <module>client-base</module>
         <module>dubbo-kryo-client</module>
         <module>dubbo-kryo-server</module>
@@ -32,7 +34,8 @@
         <module>dubbo-hessianlite-server</module>
         <module>dubbo-fst-client</module>
         <module>dubbo-fst-server</module>
-        <module>server-base</module>
+        <module>dubbo-native-hessian-client</module>
+        <module>dubbo-native-hessian-server</module>
     </modules>
 
     <dependencies>
@@ -97,6 +100,12 @@
             </dependency>
 
             <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-native-hessian</artifactId>
+                <version>${native-hessian.version}</version>
+            </dependency>
+
+            <dependency>
                 <groupId>org.openjdk.jmh</groupId>
                 <artifactId>jmh-core</artifactId>
                 <version>${jmh.version}</version>


[dubbo-benchmark] 13/16: upgrade to dubbo 2.7.2

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

codingsinger pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/dubbo-benchmark.git

commit 7e5abfd875f71a15b017c5b4a93b13aaad6106ac
Author: CodingSinger <oo...@gmail.com>
AuthorDate: Mon Jul 22 09:42:02 2019 +0800

    upgrade to dubbo 2.7.2
---
 client-base/pom.xml                 | 11 -----------
 dubbo-native-hessian-client/pom.xml |  3 ++-
 pom.xml                             | 24 ++++++++++--------------
 server-base/pom.xml                 |  5 -----
 4 files changed, 12 insertions(+), 31 deletions(-)

diff --git a/client-base/pom.xml b/client-base/pom.xml
index 9607e04..24c648f 100644
--- a/client-base/pom.xml
+++ b/client-base/pom.xml
@@ -19,11 +19,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-        </dependency>
-
-        <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>
         </dependency>
@@ -47,11 +42,5 @@
             <groupId>org.openjdk.jmh</groupId>
             <artifactId>jmh-generator-annprocess</artifactId>
         </dependency>
-
-        <dependency>
-            <groupId>commons-cli</groupId>
-            <artifactId>commons-cli</artifactId>
-            <version>1.4</version>
-        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
diff --git a/dubbo-native-hessian-client/pom.xml b/dubbo-native-hessian-client/pom.xml
index d2c19b8..f172c50 100644
--- a/dubbo-native-hessian-client/pom.xml
+++ b/dubbo-native-hessian-client/pom.xml
@@ -20,7 +20,8 @@
 
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-serialization-native-hessian</artifactId>
+            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <version>${dubbo.version}</version>
         </dependency>
     </dependencies>
 
diff --git a/pom.xml b/pom.xml
index 94af7a0..408e17f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,7 +17,6 @@
         <kryo.version>4.0.2</kryo.version>
         <kryo-serializers.version>0.42</kryo-serializers.version>
         <fst.version>2.48-jdk-6</fst.version>
-        <native-hessian.version>1.0-SNAPSHOT</native-hessian.version>
         <jmh.version>1.21</jmh.version>
         <slf4j.version>1.7.25</slf4j.version>
         <logback.version>1.2.3</logback.version>
@@ -39,9 +38,11 @@
     </modules>
 
     <dependencies>
+
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
+            <version>${dubbo.version}</version>
         </dependency>
 
         <dependency>
@@ -65,14 +66,10 @@
             <!-- use netty 4 by default -->
             <dependency>
                 <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo</artifactId>
+                <artifactId>dubbo-dependencies-bom</artifactId>
                 <version>${dubbo.version}</version>
-                <exclusions>
-                    <exclusion>
-                        <groupId>org.jboss.netty</groupId>
-                        <artifactId>netty</artifactId>
-                    </exclusion>
-                </exclusions>
+               <type>pom</type>
+                <scope>import</scope>
             </dependency>
 
             <dependency>
@@ -100,12 +97,6 @@
             </dependency>
 
             <dependency>
-                <groupId>org.apache.dubbo</groupId>
-                <artifactId>dubbo-serialization-native-hessian</artifactId>
-                <version>${native-hessian.version}</version>
-            </dependency>
-
-            <dependency>
                 <groupId>org.openjdk.jmh</groupId>
                 <artifactId>jmh-core</artifactId>
                 <version>${jmh.version}</version>
@@ -135,6 +126,11 @@
                 <artifactId>logback-classic</artifactId>
                 <version>${logback.version}</version>
             </dependency>
+            <dependency>
+                <groupId>org.apache.dubbo</groupId>
+                <artifactId>dubbo-serialization-native-hessian</artifactId>
+                <version>${dubbo.version}</version>
+            </dependency>
         </dependencies>
     </dependencyManagement>
 
diff --git a/server-base/pom.xml b/server-base/pom.xml
index e6392a9..f2289af 100644
--- a/server-base/pom.xml
+++ b/server-base/pom.xml
@@ -19,11 +19,6 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-        </dependency>
-
-        <dependency>
             <groupId>io.netty</groupId>
             <artifactId>netty-all</artifactId>
         </dependency>