You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2022/07/13 09:58:33 UTC

[dubbo-spi-extensions] branch master updated: Add rpc and serialization implmentations (#125)

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

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


The following commit(s) were added to refs/heads/master by this push:
     new 7f02821  Add rpc and serialization implmentations (#125)
7f02821 is described below

commit 7f028210e4315f8dea9dfc17849bd7446984b232
Author: Albumen Kevin <jh...@gmail.com>
AuthorDate: Wed Jul 13 17:58:28 2022 +0800

    Add rpc and serialization implmentations (#125)
    
    * add hessian protocol
    
    * add memcached protocol
    
    * add redis protocol
    
    * add msgpack serialization
    
    * add native hessian serialization
    
    * fix pom
    
    * fix pom
    
    * fix pom
    
    * fix pom
    
    * fix pom
    
    * fix pom
    
    * fix hessian protocol
    
    * add asf
    
    * fix redis
    
    * fix pom
    
    * fix set
---
 dubbo-extensions-dependencies-bom/pom.xml          | 153 ++++++++++++
 .../dubbo-registry-dns/pom.xml                     |   2 +-
 .../dns/ReflectionBasedServiceDiscovery.java       |   2 +-
 .../dubbo-registry-kubernetes/pom.xml              |   6 +-
 .../dubbo-rpc-hessian}/pom.xml                     |  69 +++---
 .../dubbo/rpc/protocol/hessian/Constants.java      |  35 +++
 .../hessian/DubboHessianURLConnectionFactory.java  |  41 ++++
 .../rpc/protocol/hessian/HessianProtocol.java      | 206 ++++++++++++++++
 .../hessian/HessianProtocolClientFilter.java       |  51 ++++
 .../protocol/hessian/HessianProtocolFilter.java    |  46 ++++
 .../rpc/protocol/hessian/HttpClientConnection.java |  99 ++++++++
 .../hessian/HttpClientConnectionFactory.java       |  57 +++++
 .../dubbo/internal/org.apache.dubbo.rpc.Filter     |   2 +
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |   1 +
 .../rpc/protocol/hessian/HessianProtocolTest.java  | 264 ++++++++++++++++++++
 .../dubbo/rpc/protocol/hessian/HessianService.java |  37 +++
 .../rpc/protocol/hessian/HessianServiceImpl.java   |  75 ++++++
 .../dubbo-rpc-memcached}/pom.xml                   |  26 +-
 .../rpc/protocol/memcached/MemcachedProtocol.java  | 122 +++++++++
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |   1 +
 .../protocol/memcached/MemcachedProtocolTest.java  |  21 ++
 .../dubbo-rpc-redis}/pom.xml                       |  41 ++--
 .../dubbo/rpc/protocol/redis/RedisProtocol.java    | 186 ++++++++++++++
 .../dubbo/internal/org.apache.dubbo.rpc.Protocol   |   1 +
 .../dubbo/rpc/protocol/redis/IDemoService.java     |  29 +++
 .../rpc/protocol/redis/RedisProtocolTest.java      | 254 +++++++++++++++++++
 ...org.apache.dubbo.common.serialize.Serialization |   1 +
 dubbo-rpc-extensions/pom.xml                       |   3 +
 .../dubbo-serialization-kryo/pom.xml               |   2 +-
 .../dubbo-serialization-msgpack}/pom.xml           |  32 ++-
 .../serialize/msgpack/MsgpackObjectInput.java      | 114 +++++++++
 .../serialize/msgpack/MsgpackObjectOutput.java     | 110 +++++++++
 .../serialize/msgpack/MsgpackSerialization.java    |  52 ++++
 ...org.apache.dubbo.common.serialize.Serialization |   1 +
 .../serialize/msgpack/MsgpackObjectOutputTest.java | 273 +++++++++++++++++++++
 .../pom.xml                                        |  28 +--
 .../serialize/hessian/Hessian2ObjectInput.java     | 100 ++++++++
 .../serialize/hessian/Hessian2ObjectOutput.java    |  97 ++++++++
 .../serialize/hessian/Hessian2Serialization.java   |  53 ++++
 .../hessian/Hessian2SerializerFactory.java         | 107 ++++++++
 .../dubbo/AbstractHessian2FactoryInitializer.java  |  36 +++
 .../dubbo/DefaultHessian2FactoryInitializer.java   |  28 +++
 .../hessian/dubbo/Hessian2FactoryInitializer.java  |  43 ++++
 .../dubbo/WhitelistHessian2FactoryInitializer.java |  50 ++++
 .../hessian/serializer/java8/DurationHandle.java   |  53 ++++
 .../hessian/serializer/java8/InstantHandle.java    |  54 ++++
 .../serializer/java8/Java8TimeSerializer.java      |  57 +++++
 .../hessian/serializer/java8/LocalDateHandle.java  |  55 +++++
 .../serializer/java8/LocalDateTimeHandle.java      |  55 +++++
 .../hessian/serializer/java8/LocalTimeHandle.java  |  57 +++++
 .../hessian/serializer/java8/MonthDayHandle.java   |  53 ++++
 .../serializer/java8/OffsetDateTimeHandle.java     |  55 +++++
 .../hessian/serializer/java8/OffsetTimeHandle.java |  55 +++++
 .../hessian/serializer/java8/PeriodHandle.java     |  56 +++++
 .../hessian/serializer/java8/YearHandle.java       |  52 ++++
 .../hessian/serializer/java8/YearMonthHandle.java  |  53 ++++
 .../hessian/serializer/java8/ZoneIdHandle.java     |  52 ++++
 .../hessian/serializer/java8/ZoneIdSerializer.java |  43 ++++
 .../hessian/serializer/java8/ZoneOffsetHandle.java |  51 ++++
 .../serializer/java8/ZonedDateTimeHandle.java      |  62 +++++
 ...org.apache.dubbo.common.serialize.Serialization |   1 +
 ...ialize.hessian.dubbo.Hessian2FactoryInitializer |   2 +
 .../serialize/hessian/Java8TimeSerializerTest.java | 152 ++++++++++++
 dubbo-serialization-extensions/pom.xml             |   2 +
 64 files changed, 3871 insertions(+), 106 deletions(-)

diff --git a/dubbo-extensions-dependencies-bom/pom.xml b/dubbo-extensions-dependencies-bom/pom.xml
index 42315dd..f756bde 100644
--- a/dubbo-extensions-dependencies-bom/pom.xml
+++ b/dubbo-extensions-dependencies-bom/pom.xml
@@ -96,6 +96,26 @@
 
         <!-- Fabric8 for Kubernetes -->
         <fabric8_kubernetes_version>5.3.0</fabric8_kubernetes_version>
+        <hessian_version>4.0.51</hessian_version>
+        <httpclient_version>4.5.13</httpclient_version>
+        <jsonrpc_version>1.2.0</jsonrpc_version>
+        <portlet_version>2.0</portlet_version>
+        <xmemcached_version>1.3.6</xmemcached_version>
+        <thrift_version>0.12.0</thrift_version>
+        <jedis_version>3.7.0</jedis_version>
+        <embedded_redis_version>0.10.0</embedded_redis_version>
+        <commons_lang3_version>3.8.1</commons_lang3_version>
+        <jaxb_version>2.2.7</jaxb_version>
+        <activation_version>1.2.0</activation_version>
+        <cxf_version>3.1.15</cxf_version>
+        <avro_version>1.8.2</avro_version>
+        <fastjson_version>1.2.83</fastjson_version>
+        <fst_version>2.48-jdk-6</fst_version>
+        <gson_version>2.8.5</gson_version>
+        <kryo_version>4.0.2</kryo_version>
+        <kryo_serializers_version>0.42</kryo_serializers_version>
+        <msgpack_version>0.8.22</msgpack_version>
+        <protostuff_version>1.5.9</protostuff_version>
 
         <maven_flatten_version>1.2.5</maven_flatten_version>
     </properties>
@@ -161,6 +181,139 @@
                     </exclusion>
                 </exclusions>
             </dependency>
+
+            <dependency>
+                <groupId>com.caucho</groupId>
+                <artifactId>hessian</artifactId>
+                <version>${hessian_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.httpcomponents</groupId>
+                <artifactId>httpclient</artifactId>
+                <version>${httpclient_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.briandilley.jsonrpc4j</groupId>
+                <artifactId>jsonrpc4j</artifactId>
+                <version>${jsonrpc_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.portlet</groupId>
+                <artifactId>portlet-api</artifactId>
+                <version>${portlet_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.googlecode.xmemcached</groupId>
+                <artifactId>xmemcached</artifactId>
+                <version>${xmemcached_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.thrift</groupId>
+                <artifactId>libthrift</artifactId>
+                <version>${thrift_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>redis.clients</groupId>
+                <artifactId>jedis</artifactId>
+                <version>${jedis_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.github.codemonstur</groupId>
+                <artifactId>embedded-redis</artifactId>
+                <version>${embedded_redis_version}</version>
+                <scope>test</scope>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.commons</groupId>
+                <artifactId>commons-lang3</artifactId>
+                <version>${commons_lang3_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.xml.bind</groupId>
+                <artifactId>jaxb-api</artifactId>
+                <version>${jaxb_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.xml.bind</groupId>
+                <artifactId>jaxb-impl</artifactId>
+                <version>${jaxb_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.xml.bind</groupId>
+                <artifactId>jaxb-core</artifactId>
+                <version>${jaxb_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>javax.activation</groupId>
+                <artifactId>javax.activation-api</artifactId>
+                <version>${activation_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.sun.activation</groupId>
+                <artifactId>javax.activation</artifactId>
+                <version>${activation_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.cxf</groupId>
+                <artifactId>cxf-rt-frontend-simple</artifactId>
+                <version>${cxf_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.cxf</groupId>
+                <artifactId>cxf-rt-transports-http</artifactId>
+                <version>${cxf_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.avro</groupId>
+                <artifactId>avro</artifactId>
+                <version>${avro_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.alibaba</groupId>
+                <artifactId>fastjson</artifactId>
+                <version>${fastjson_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>de.ruedigermoeller</groupId>
+                <artifactId>fst</artifactId>
+                <version>${fst_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.google.code.gson</groupId>
+                <artifactId>gson</artifactId>
+                <version>${gson_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>com.esotericsoftware</groupId>
+                <artifactId>kryo</artifactId>
+                <version>${kryo_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>de.javakaffee</groupId>
+                <artifactId>kryo-serializers</artifactId>
+                <version>${kryo_serializers_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.msgpack</groupId>
+                <artifactId>msgpack-core</artifactId>
+                <version>${msgpack_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.msgpack</groupId>
+                <artifactId>jackson-dataformat-msgpack</artifactId>
+                <version>${msgpack_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.protostuff</groupId>
+                <artifactId>protostuff-core</artifactId>
+                <version>${protostuff_version}</version>
+            </dependency>
+            <dependency>
+                <groupId>io.protostuff</groupId>
+                <artifactId>protostuff-runtime</artifactId>
+                <version>${protostuff_version}</version>
+            </dependency>
+
         </dependencies>
     </dependencyManagement>
 
diff --git a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml b/dubbo-registry-extensions/dubbo-registry-dns/pom.xml
index 72fb770..947efbe 100644
--- a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml
+++ b/dubbo-registry-extensions/dubbo-registry-dns/pom.xml
@@ -36,7 +36,7 @@
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <version>3.0.10-SNAPSHOT</version>
         </dependency>
 
         <dependency>
diff --git a/dubbo-registry-extensions/dubbo-registry-dns/src/main/java/org/apache/dubbo/registry/dns/ReflectionBasedServiceDiscovery.java b/dubbo-registry-extensions/dubbo-registry-dns/src/main/java/org/apache/dubbo/registry/dns/ReflectionBasedServiceDiscovery.java
index ed2e09b..4efcbe2 100644
--- a/dubbo-registry-extensions/dubbo-registry-dns/src/main/java/org/apache/dubbo/registry/dns/ReflectionBasedServiceDiscovery.java
+++ b/dubbo-registry-extensions/dubbo-registry-dns/src/main/java/org/apache/dubbo/registry/dns/ReflectionBasedServiceDiscovery.java
@@ -262,7 +262,7 @@ public class ReflectionBasedServiceDiscovery extends AbstractServiceDiscovery {
     }
 
     private synchronized MetadataService getMetadataServiceProxy(ServiceInstance instance) {
-        return metadataServiceProxies.computeIfAbsent(computeKey(instance), k -> MetadataUtils.referProxy(instance));
+        return metadataServiceProxies.computeIfAbsent(computeKey(instance), k -> MetadataUtils.referProxy(instance).getProxy());
     }
 
     private synchronized void destroyMetadataServiceProxy(ServiceInstance instance) {
diff --git a/dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml b/dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml
index 9493278..dad7f71 100644
--- a/dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml
+++ b/dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml
@@ -36,13 +36,13 @@
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-registry-api</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <version>3.0.9</version>
         </dependency>
 
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-common</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <version>3.0.9</version>
         </dependency>
 
         <dependency>
@@ -72,7 +72,7 @@
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-metadata-api</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <version>3.0.9</version>
         </dependency>
     </dependencies>
 
diff --git a/dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml b/dubbo-rpc-extensions/dubbo-rpc-hessian/pom.xml
similarity index 54%
copy from dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml
copy to dubbo-rpc-extensions/dubbo-rpc-hessian/pom.xml
index 9493278..c640ee8 100644
--- a/dubbo-registry-extensions/dubbo-registry-kubernetes/pom.xml
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/pom.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -15,66 +14,60 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<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>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <parent>
-        <artifactId>dubbo-registry-extensions</artifactId>
+        <artifactId>dubbo-rpc-extensions</artifactId>
         <groupId>org.apache.dubbo.extensions</groupId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>dubbo-rpc-hessian</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
 
-    <artifactId>dubbo-registry-kubernetes</artifactId>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <version>1.0.2-SNAPSHOT</version>
-    <description>The Kubernetes registry module of Dubbo project</description>
-
+    <description>The hessian rpc module of dubbo project</description>
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-registry-api</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <artifactId>dubbo-rpc-api</artifactId>
         </dependency>
-
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-common</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <artifactId>dubbo</artifactId>
+            <scope>test</scope>
         </dependency>
-
         <dependency>
-            <groupId>io.fabric8</groupId>
-            <artifactId>kubernetes-client</artifactId>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-remoting-http</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>io.fabric8</groupId>
-            <artifactId>kubernetes-server-mock</artifactId>
-            <scope>test</scope>
+            <groupId>com.caucho</groupId>
+            <artifactId>hessian</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>org.mockito</groupId>
-            <artifactId>mockito-junit-jupiter</artifactId>
-            <scope>test</scope>
-            <exclusions>
-                <exclusion>
-                    <groupId>org.junit.jupiter</groupId>
-                    <artifactId>junit-jupiter-api</artifactId>
-                </exclusion>
-            </exclusions>
+            <groupId>org.apache.httpcomponents</groupId>
+            <artifactId>httpclient</artifactId>
         </dependency>
-
-
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo-metadata-api</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <artifactId>dubbo-serialization-jdk</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo.extensions</groupId>
+            <artifactId>dubbo-serialization-native-hession</artifactId>
+            <version>${project.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework</groupId>
+            <artifactId>spring-test</artifactId>
+            <scope>test</scope>
         </dependency>
     </dependencies>
-
-
 </project>
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/Constants.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/Constants.java
new file mode 100644
index 0000000..7b5eb6c
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/Constants.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.rpc.protocol.hessian;
+
+/**
+ *
+ */
+public interface Constants {
+
+    String HESSIAN2_REQUEST_KEY = "hessian2.request";
+
+    boolean DEFAULT_HESSIAN2_REQUEST = false;
+
+    String HESSIAN_OVERLOAD_METHOD_KEY = "hessian.overload.method";
+
+    boolean DEFAULT_HESSIAN_OVERLOAD_METHOD = false;
+
+    String DEFAULT_HTTP_CLIENT = "jdk";
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java
new file mode 100644
index 0000000..a78a9ca
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/DubboHessianURLConnectionFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.remoting.Constants;
+
+import com.caucho.hessian.client.HessianConnection;
+import com.caucho.hessian.client.HessianURLConnectionFactory;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.Map;
+
+public class DubboHessianURLConnectionFactory extends HessianURLConnectionFactory {
+
+    @Override
+    public HessianConnection open(URL url) throws IOException {
+        HessianConnection connection = super.open(url);
+        Map<String, String> attachments = HessianProtocolClientFilter.getAttachments();
+        if (attachments != null) {
+            attachments.forEach((k, v) -> connection.addHeader(Constants.DEFAULT_EXCHANGER + k, v));
+        }
+
+        return connection;
+    }
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java
new file mode 100644
index 0000000..c7b4fce
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocol.java
@@ -0,0 +1,206 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.remoting.RemotingServer;
+import org.apache.dubbo.remoting.http.HttpBinder;
+import org.apache.dubbo.remoting.http.HttpHandler;
+import org.apache.dubbo.rpc.ProtocolServer;
+import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.protocol.AbstractProxyProtocol;
+import org.apache.dubbo.rpc.service.GenericService;
+import org.apache.dubbo.rpc.support.ProtocolUtils;
+import org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer;
+
+import com.caucho.hessian.HessianException;
+import com.caucho.hessian.client.HessianConnectionException;
+import com.caucho.hessian.client.HessianConnectionFactory;
+import com.caucho.hessian.client.HessianProxyFactory;
+import com.caucho.hessian.io.HessianMethodSerializationException;
+import com.caucho.hessian.server.HessianSkeleton;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+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.remoting.Constants.CLIENT_KEY;
+import static org.apache.dubbo.remoting.Constants.DEFAULT_EXCHANGER;
+import static org.apache.dubbo.rpc.Constants.GENERIC_KEY;
+import static org.apache.dubbo.rpc.protocol.hessian.Constants.DEFAULT_HESSIAN2_REQUEST;
+import static org.apache.dubbo.rpc.protocol.hessian.Constants.DEFAULT_HESSIAN_OVERLOAD_METHOD;
+import static org.apache.dubbo.rpc.protocol.hessian.Constants.DEFAULT_HTTP_CLIENT;
+import static org.apache.dubbo.rpc.protocol.hessian.Constants.HESSIAN2_REQUEST_KEY;
+import static org.apache.dubbo.rpc.protocol.hessian.Constants.HESSIAN_OVERLOAD_METHOD_KEY;
+
+/**
+ * http rpc support.
+ */
+public class HessianProtocol extends AbstractProxyProtocol {
+
+    private final Map<String, HessianSkeleton> skeletonMap = new ConcurrentHashMap<String, HessianSkeleton>();
+
+    private HttpBinder httpBinder;
+
+    public HessianProtocol() {
+        super(HessianException.class);
+    }
+
+    public void setHttpBinder(HttpBinder httpBinder) {
+        this.httpBinder = httpBinder;
+    }
+
+    @Override
+    public int getDefaultPort() {
+        return 80;
+    }
+
+    @Override
+    protected <T> Runnable doExport(T impl, Class<T> type, URL url) throws RpcException {
+        String addr = getAddr(url);
+        ProtocolServer protocolServer = serverMap.get(addr);
+        if (protocolServer == null) {
+            RemotingServer remotingServer = httpBinder.bind(url, new HessianHandler());
+            serverMap.put(addr, new ProxyProtocolServer(remotingServer));
+        }
+        final String path = url.getAbsolutePath();
+        final HessianSkeleton skeleton = new HessianSkeleton(impl, type);
+        skeletonMap.put(path, skeleton);
+
+        final String genericPath = path + "/" + GENERIC_KEY;
+        skeletonMap.put(genericPath, new HessianSkeleton(impl, GenericService.class));
+
+        return new Runnable() {
+            @Override
+            public void run() {
+                skeletonMap.remove(path);
+                skeletonMap.remove(genericPath);
+            }
+        };
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    protected <T> T doRefer(Class<T> serviceType, URL url) throws RpcException {
+        String generic = url.getParameter(GENERIC_KEY);
+        boolean isGeneric = ProtocolUtils.isGeneric(generic) || serviceType.equals(GenericService.class);
+        if (isGeneric) {
+            RpcContext.getContext().setAttachment(GENERIC_KEY, generic);
+            url = url.setPath(url.getPath() + "/" + GENERIC_KEY);
+        }
+
+        HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
+        boolean isHessian2Request = url.getParameter(HESSIAN2_REQUEST_KEY, DEFAULT_HESSIAN2_REQUEST);
+        hessianProxyFactory.setHessian2Request(isHessian2Request);
+        boolean isOverloadEnabled = url.getParameter(HESSIAN_OVERLOAD_METHOD_KEY, DEFAULT_HESSIAN_OVERLOAD_METHOD);
+        hessianProxyFactory.setOverloadEnabled(isOverloadEnabled);
+        String client = url.getParameter(CLIENT_KEY, DEFAULT_HTTP_CLIENT);
+        if ("httpclient".equals(client)) {
+            HessianConnectionFactory factory = new HttpClientConnectionFactory();
+            factory.setHessianProxyFactory(hessianProxyFactory);
+            hessianProxyFactory.setConnectionFactory(factory);
+        } else if (client != null && client.length() > 0 && !DEFAULT_HTTP_CLIENT.equals(client)) {
+            throw new IllegalStateException("Unsupported http protocol client=\"" + client + "\"!");
+        } else {
+            HessianConnectionFactory factory = new DubboHessianURLConnectionFactory();
+            factory.setHessianProxyFactory(hessianProxyFactory);
+            hessianProxyFactory.setConnectionFactory(factory);
+        }
+        int timeout = url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT);
+        hessianProxyFactory.setConnectTimeout(timeout);
+        hessianProxyFactory.setReadTimeout(timeout);
+        hessianProxyFactory.setSerializerFactory(Hessian2FactoryInitializer.getInstance().getSerializerFactory());
+        return (T) hessianProxyFactory.create(serviceType, new URL("http", url.getHost(), url.getPort(), url.getPath(), url.getParameters()).toJavaURL(), Thread.currentThread().getContextClassLoader());
+    }
+
+    @Override
+    protected int getErrorCode(Throwable e) {
+        if (e instanceof HessianConnectionException) {
+            if (e.getCause() != null) {
+                Class<?> cls = e.getCause().getClass();
+                if (SocketTimeoutException.class.equals(cls)) {
+                    return RpcException.TIMEOUT_EXCEPTION;
+                }
+            }
+            return RpcException.NETWORK_EXCEPTION;
+        } else if (e instanceof HessianMethodSerializationException) {
+            return RpcException.SERIALIZATION_EXCEPTION;
+        }
+        return super.getErrorCode(e);
+    }
+
+    @Override
+    public void destroy() {
+        super.destroy();
+        for (String key : new ArrayList<String>(serverMap.keySet())) {
+            ProtocolServer protocolServer = serverMap.remove(key);
+            if (protocolServer != null) {
+                try {
+                    if (logger.isInfoEnabled()) {
+                        logger.info("Close hessian server " + protocolServer.getUrl());
+                    }
+                    protocolServer.close();
+                } catch (Throwable t) {
+                    logger.warn(t.getMessage(), t);
+                }
+            }
+        }
+    }
+
+    private class HessianHandler implements HttpHandler {
+
+        @Override
+        public void handle(HttpServletRequest request, HttpServletResponse response)
+                throws IOException, ServletException {
+            String uri = request.getRequestURI();
+            HessianSkeleton skeleton = skeletonMap.get(uri);
+            if (!"POST".equalsIgnoreCase(request.getMethod())) {
+                response.setStatus(500);
+            } else {
+                RpcContext.getContext().setRemoteAddress(request.getRemoteAddr(), request.getRemotePort());
+
+                Map<String, String> attachments = new HashMap<>();
+                Enumeration<String> enumeration = request.getHeaderNames();
+                while (enumeration.hasMoreElements()) {
+                    String key = enumeration.nextElement();
+                    if (key.startsWith(DEFAULT_EXCHANGER)) {
+                        attachments.put(key.substring(DEFAULT_EXCHANGER.length()), request.getHeader(key));
+                    }
+                }
+                HessianProtocolFilter.setAttachments(attachments);
+
+                try {
+                    skeleton.invoke(request.getInputStream(), response.getOutputStream(), Hessian2FactoryInitializer.getInstance().getSerializerFactory());
+                } catch (Throwable e) {
+                    throw new ServletException(e);
+                }
+            }
+        }
+
+    }
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolClientFilter.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolClientFilter.java
new file mode 100644
index 0000000..b213957
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolClientFilter.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.threadlocal.InternalThreadLocal;
+import org.apache.dubbo.rpc.Filter;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.RpcException;
+
+import java.util.HashMap;
+import java.util.Map;
+
+@Activate(group = CommonConstants.CONSUMER, order = Integer.MAX_VALUE)
+public class HessianProtocolClientFilter implements Filter {
+    private final static InternalThreadLocal<Map<String, String>> attachments = new InternalThreadLocal<>();
+
+    @Override
+    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
+        Map<String, String> attachments = new HashMap<>(RpcContext.getContext().getAttachments());
+        attachments.putAll(invocation.getAttachments());
+        HessianProtocolClientFilter.attachments.set(attachments);
+        try {
+            return invoker.invoke(invocation);
+        } finally {
+            HessianProtocolClientFilter.attachments.remove();
+        }
+    }
+
+    public static Map<String, String> getAttachments() {
+        return attachments.get();
+    }
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolFilter.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolFilter.java
new file mode 100644
index 0000000..3102d5d
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolFilter.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.Activate;
+import org.apache.dubbo.common.threadlocal.InternalThreadLocal;
+import org.apache.dubbo.rpc.Filter;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
+
+import java.util.Map;
+
+@Activate(group = CommonConstants.PROVIDER, order = Integer.MIN_VALUE + 10000)
+public class HessianProtocolFilter implements Filter {
+    private final static InternalThreadLocal<Map<String, String>> attachments = new InternalThreadLocal<>();
+
+    @Override
+    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
+        if (attachments.get() != null) {
+            attachments.get().forEach(invocation::setAttachment);
+            attachments.remove();
+        }
+        return invoker.invoke(invocation);
+    }
+
+    protected static void setAttachments(Map<String, String> attachments) {
+        HessianProtocolFilter.attachments.set(attachments);
+    }
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HttpClientConnection.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HttpClientConnection.java
new file mode 100644
index 0000000..e22acbe
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HttpClientConnection.java
@@ -0,0 +1,99 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import com.caucho.hessian.client.HessianConnection;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.message.BasicHeader;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+
+/**
+ * HttpClientConnection
+ */
+public class HttpClientConnection implements HessianConnection {
+
+    private final HttpClient httpClient;
+
+    private final ByteArrayOutputStream output;
+
+    private final HttpPost request;
+
+    private volatile HttpResponse response;
+
+    public HttpClientConnection(HttpClient httpClient, URL url) {
+        this.httpClient = httpClient;
+        this.output = new ByteArrayOutputStream();
+        this.request = new HttpPost(url.toString());
+    }
+
+    @Override
+    public void addHeader(String key, String value) {
+        request.addHeader(new BasicHeader(key, value));
+    }
+
+    @Override
+    public OutputStream getOutputStream() throws IOException {
+        return output;
+    }
+
+    @Override
+    public void sendRequest() throws IOException {
+        request.setEntity(new ByteArrayEntity(output.toByteArray()));
+        this.response = httpClient.execute(request);
+    }
+
+    @Override
+    public int getStatusCode() {
+        return response == null || response.getStatusLine() == null ? 0 : response.getStatusLine().getStatusCode();
+    }
+
+    @Override
+    public String getStatusMessage() {
+        return response == null || response.getStatusLine() == null ? null : response.getStatusLine().getReasonPhrase();
+    }
+
+    @Override
+    public String getContentEncoding() {
+        return (response == null || response.getEntity() == null || response.getEntity().getContentEncoding() == null) ? null : response.getEntity().getContentEncoding().getValue();
+    }
+
+    @Override
+    public InputStream getInputStream() throws IOException {
+        return response == null || response.getEntity() == null ? null : response.getEntity().getContent();
+    }
+
+    @Override
+    public void close() throws IOException {
+        HttpPost request = this.request;
+        if (request != null) {
+            request.abort();
+        }
+    }
+
+    @Override
+    public void destroy() throws IOException {
+    }
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HttpClientConnectionFactory.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HttpClientConnectionFactory.java
new file mode 100644
index 0000000..9a69722
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/java/org/apache/dubbo/rpc/protocol/hessian/HttpClientConnectionFactory.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.remoting.Constants;
+
+import com.caucho.hessian.client.HessianConnection;
+import com.caucho.hessian.client.HessianConnectionFactory;
+import com.caucho.hessian.client.HessianProxyFactory;
+import org.apache.http.client.HttpClient;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.impl.client.HttpClientBuilder;
+
+import java.net.URL;
+import java.util.Map;
+
+/**
+ * HttpClientConnectionFactory
+ * TODO, Consider using connection pool
+ */
+public class HttpClientConnectionFactory implements HessianConnectionFactory {
+
+    private HttpClient httpClient;
+
+    @Override
+    public void setHessianProxyFactory(HessianProxyFactory factory) {
+        RequestConfig requestConfig = RequestConfig.custom()
+                .setConnectionRequestTimeout((int) factory.getConnectTimeout())
+                .setSocketTimeout((int) factory.getReadTimeout())
+                .build();
+        httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build();
+    }
+
+    @Override
+    public HessianConnection open(URL url) {
+        HttpClientConnection httpClientConnection = new HttpClientConnection(httpClient, url);
+        Map<String, String> attachments = HessianProtocolClientFilter.getAttachments();
+        if (attachments != null) {
+            attachments.forEach((k, v) -> httpClientConnection.addHeader(Constants.DEFAULT_EXCHANGER + k, v));
+        }
+        return httpClientConnection;
+    }
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
new file mode 100644
index 0000000..72c0892
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Filter
@@ -0,0 +1,2 @@
+hessian-protocol-server=org.apache.dubbo.rpc.protocol.hessian.HessianProtocolFilter
+hessian-protocol-client=org.apache.dubbo.rpc.protocol.hessian.HessianProtocolClientFilter
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
new file mode 100644
index 0000000..cecd147
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
@@ -0,0 +1 @@
+hessian=org.apache.dubbo.rpc.protocol.hessian.HessianProtocol
\ No newline at end of file
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolTest.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolTest.java
new file mode 100644
index 0000000..8eebc75
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianProtocolTest.java
@@ -0,0 +1,264 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.beanutil.JavaBeanDescriptor;
+import org.apache.dubbo.common.beanutil.JavaBeanSerializeUtil;
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.common.serialize.Serialization;
+import org.apache.dubbo.common.serialize.nativejava.NativeJavaSerialization;
+import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.rpc.Exporter;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Protocol;
+import org.apache.dubbo.rpc.ProxyFactory;
+import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.cluster.Cluster;
+import org.apache.dubbo.rpc.cluster.directory.StaticDirectory;
+import org.apache.dubbo.rpc.service.GenericService;
+
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.Collections;
+
+import static org.junit.jupiter.api.Assertions.fail;
+
+/**
+ * HessianProtocolTest
+ */
+public class HessianProtocolTest {
+    
+    @AfterEach
+    public void after() {
+        ExtensionLoader.getExtensionLoader(Protocol.class).getExtension("hessian").destroy();
+    }
+
+    @Test
+    public void testHessianProtocol() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        Assertions.assertFalse(server.isCalled());
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&hessian.overload.method=true");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<HessianService> invoker = protocol.refer(HessianService.class, url);
+        HessianService client = proxyFactory.getProxy(invoker);
+        String result = client.sayHello("haha");
+        Assertions.assertTrue(server.isCalled());
+        Assertions.assertEquals("Hello, haha", result);
+        invoker.destroy();
+        exporter.unexport();
+    }
+
+    @Test
+    public void testGenericInvoke() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        Assertions.assertFalse(server.isCalled());
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+        GenericService client = proxyFactory.getProxy(invoker, true);
+        String result = (String) client.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{"haha"});
+        Assertions.assertTrue(server.isCalled());
+        Assertions.assertEquals("Hello, haha", result);
+        invoker.destroy();
+        exporter.unexport();
+    }
+
+    @Test
+    public void testGenericInvokeWithNativeJava() throws IOException, ClassNotFoundException {
+        // temporary enable native java generic serialize
+        System.setProperty(CommonConstants.ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE, "true");
+        HessianServiceImpl server = new HessianServiceImpl();
+        Assertions.assertFalse(server.isCalled());
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&generic=nativejava");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+        GenericService client = proxyFactory.getProxy(invoker);
+
+        Serialization serialization = new NativeJavaSerialization();
+        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+
+        ObjectOutput objectOutput = serialization.serialize(url, byteArrayOutputStream);
+        objectOutput.writeObject("haha");
+        objectOutput.flushBuffer();
+
+        Object result = client.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{byteArrayOutputStream.toByteArray()});
+        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream((byte[]) result);
+        ObjectInput objectInput = serialization.deserialize(url, byteArrayInputStream);
+        Assertions.assertTrue(server.isCalled());
+        Assertions.assertEquals("Hello, haha", objectInput.readObject());
+        invoker.destroy();
+        exporter.unexport();
+        System.clearProperty(CommonConstants.ENABLE_NATIVE_JAVA_GENERIC_SERIALIZE);
+    }
+
+    @Test
+    public void testGenericInvokeWithRpcContext() {
+        RpcContext.getContext().setAttachment("myContext", "123");
+
+        HessianServiceImpl server = new HessianServiceImpl();
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+        GenericService client = proxyFactory.getProxy(invoker, true);
+        String result = (String) client.$invoke("context", new String[]{"java.lang.String"}, new Object[]{"haha"});
+        Assertions.assertEquals("Hello, haha context, 123", result);
+        invoker.destroy();
+        exporter.unexport();
+    }
+
+    @Test
+    public void testGenericInvokeWithBean() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        Assertions.assertFalse(server.isCalled());
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&generic=bean");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+        GenericService client = proxyFactory.getProxy(invoker);
+
+        JavaBeanDescriptor javaBeanDescriptor = JavaBeanSerializeUtil.serialize("haha");
+
+        Object result = client.$invoke("sayHello", new String[]{"java.lang.String"}, new Object[]{javaBeanDescriptor});
+        Assertions.assertTrue(server.isCalled());
+        Assertions.assertEquals("Hello, haha", JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) result));
+        invoker.destroy();
+        exporter.unexport();
+    }
+    
+    @Test
+    public void testOverload() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        Assertions.assertFalse(server.isCalled());
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&hessian.overload.method=true&hessian2.request=false");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<HessianService> invoker = protocol.refer(HessianService.class, url);
+        HessianService client = proxyFactory.getProxy(invoker);
+        String result = client.sayHello("haha");
+        Assertions.assertEquals("Hello, haha", result);
+        result = client.sayHello("haha", 1);
+        Assertions.assertEquals("Hello, haha. ", result);
+        invoker.destroy();
+        exporter.unexport();
+    }
+    
+    @Test
+    public void testHttpClient() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        Assertions.assertFalse(server.isCalled());
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&client=httpclient&hessian.overload.method=true");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<HessianService> invoker = protocol.refer(HessianService.class, url);
+        HessianService client = proxyFactory.getProxy(invoker);
+        String result = client.sayHello("haha");
+        Assertions.assertTrue(server.isCalled());
+        Assertions.assertEquals("Hello, haha", result);
+        invoker.destroy();
+        exporter.unexport();
+    }
+    
+    @Test
+    public void testTimeOut() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&timeout=10");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<HessianService> invoker = protocol.refer(HessianService.class, url);
+        HessianService client = proxyFactory.getProxy(invoker);
+        try {
+            client.timeOut(6000);
+            fail();
+        } catch (RpcException expected) {
+            Assertions.assertTrue(expected.isTimeout());
+        } finally {
+            invoker.destroy();
+            exporter.unexport();
+        }
+        
+    }
+    
+    @Test
+    public void testCustomException() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<HessianService> invoker = protocol.refer(HessianService.class, url);
+        HessianService client = proxyFactory.getProxy(invoker);
+        try {
+            client.customException();
+            fail();
+        } catch (HessianServiceImpl.MyException expected) {
+        
+        }
+        invoker.destroy();
+        exporter.unexport();
+    }
+    
+    
+    @Test
+    public void testRemoteApplicationName() {
+        HessianServiceImpl server = new HessianServiceImpl();
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        int port = NetUtils.getAvailablePort();
+        URL url = URL.valueOf("hessian://127.0.0.1:" + port + "/" + HessianService.class.getName() + "?version=1.0.0&hessian.overload.method=true").addParameter("application", "consumer");
+        Exporter<HessianService> exporter = protocol.export(proxyFactory.getInvoker(server, HessianService.class, url));
+        Invoker<HessianService> invoker = protocol.refer(HessianService.class, url);
+        Cluster cluster = ExtensionLoader.getExtensionLoader(Cluster.class).getAdaptiveExtension();
+        Invoker<HessianService> clusterInvoker = cluster.join(new StaticDirectory<>(Collections.singletonList(invoker)), true);
+        HessianService client = proxyFactory.getProxy(clusterInvoker);
+        String result = client.getRemoteApplicationName();
+        Assertions.assertEquals("consumer", result);
+        clusterInvoker.destroy();
+        exporter.unexport();
+    }
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianService.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianService.java
new file mode 100644
index 0000000..f5bb589
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianService.java
@@ -0,0 +1,37 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+
+/**
+ * HessianService
+ */
+public interface HessianService {
+
+    String sayHello(String name);
+
+    String sayHello(String name, int times);
+
+    void timeOut(int millis);
+
+    String customException();
+
+    String context(String name);
+
+    String getRemoteApplicationName();
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianServiceImpl.java b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianServiceImpl.java
new file mode 100644
index 0000000..3e013f0
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-hessian/src/test/java/org/apache/dubbo/rpc/protocol/hessian/HessianServiceImpl.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.hessian;
+
+import org.apache.dubbo.rpc.RpcContext;
+
+/**
+ * HessianServiceImpl
+ */
+public class HessianServiceImpl implements HessianService {
+
+    private boolean called;
+
+    public String sayHello(String name) {
+        called = true;
+        return "Hello, " + name;
+    }
+
+    public String sayHello(String name, int times) {
+        called = true;
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < times; i++) {
+            sb.append("Hello, " + name + ". ");
+        }
+        return sb.toString();
+    }
+
+    public boolean isCalled() {
+        return called;
+    }
+
+    public void timeOut(int millis) {
+        try {
+            Thread.sleep(millis);
+        } catch (InterruptedException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public String customException() {
+        throw new MyException("custom exception");
+    }
+
+    public String context(String name) {
+        return "Hello, " + name + " context, " + RpcContext.getContext().getAttachment("myContext");
+    }
+
+    static class MyException extends RuntimeException {
+
+        private static final long serialVersionUID = -3051041116483629056L;
+
+        public MyException(String message) {
+            super(message);
+        }
+    }
+
+    @Override
+    public String getRemoteApplicationName() {
+        return RpcContext.getContext().getRemoteApplicationName();
+    }
+}
diff --git a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml b/dubbo-rpc-extensions/dubbo-rpc-memcached/pom.xml
similarity index 65%
copy from dubbo-registry-extensions/dubbo-registry-dns/pom.xml
copy to dubbo-rpc-extensions/dubbo-rpc-memcached/pom.xml
index 72fb770..9b1093c 100644
--- a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml
+++ b/dubbo-rpc-extensions/dubbo-rpc-memcached/pom.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -15,34 +14,31 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<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">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <parent>
-        <artifactId>dubbo-registry-extensions</artifactId>
+        <artifactId>dubbo-rpc-extensions</artifactId>
         <groupId>org.apache.dubbo.extensions</groupId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-registry-dns</artifactId>
+    <artifactId>dubbo-rpc-memcached</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <version>1.0.2-SNAPSHOT</version>
-    <description>The DNS registry module of Dubbo project</description>
-
+    <description>The memcached rpc module of dubbo project</description>
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <artifactId>dubbo-rpc-api</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-all</artifactId>
+            <groupId>com.googlecode.xmemcached</groupId>
+            <artifactId>xmemcached</artifactId>
         </dependency>
-
     </dependencies>
 </project>
diff --git a/dubbo-rpc-extensions/dubbo-rpc-memcached/src/main/java/org/apache/dubbo/rpc/protocol/memcached/MemcachedProtocol.java b/dubbo-rpc-extensions/dubbo-rpc-memcached/src/main/java/org/apache/dubbo/rpc/protocol/memcached/MemcachedProtocol.java
new file mode 100644
index 0000000..1620f57
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-memcached/src/main/java/org/apache/dubbo/rpc/protocol/memcached/MemcachedProtocol.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.memcached;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.constants.RemotingConstants;
+import org.apache.dubbo.rpc.AsyncRpcResult;
+import org.apache.dubbo.rpc.Exporter;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.protocol.AbstractInvoker;
+import org.apache.dubbo.rpc.protocol.AbstractProtocol;
+
+import net.rubyeye.xmemcached.MemcachedClient;
+import net.rubyeye.xmemcached.MemcachedClientBuilder;
+import net.rubyeye.xmemcached.XMemcachedClientBuilder;
+import net.rubyeye.xmemcached.exception.MemcachedException;
+import net.rubyeye.xmemcached.utils.AddrUtil;
+
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.util.Map;
+import java.util.concurrent.TimeoutException;
+
+/**
+ * MemcachedProtocol
+ */
+public class MemcachedProtocol extends AbstractProtocol {
+
+    public static final int DEFAULT_PORT = 11211;
+
+    @Override
+    public int getDefaultPort() {
+        return DEFAULT_PORT;
+    }
+
+    @Override
+    public <T> Exporter<T> export(final Invoker<T> invoker) throws RpcException {
+        throw new UnsupportedOperationException("Unsupported export memcached service. url: " + invoker.getUrl());
+    }
+
+    @Override
+    public <T> Invoker<T> protocolBindingRefer(final Class<T> type, final URL url) throws RpcException {
+        try {
+            String address = url.getAddress();
+            String backup = url.getParameter(RemotingConstants.BACKUP_KEY);
+            if (backup != null && backup.length() > 0) {
+                address += "," + backup;
+            }
+            MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses(address));
+            final MemcachedClient memcachedClient = builder.build();
+            final int expiry = url.getParameter("expiry", 0);
+            final String get = url.getParameter("get", "get");
+            final String set = url.getParameter("set", Map.class.equals(type) ? "put" : "set");
+            final String delete = url.getParameter("delete", Map.class.equals(type) ? "remove" : "delete");
+            return new AbstractInvoker<T>(type, url) {
+                @Override
+                protected Result doInvoke(Invocation invocation) throws Throwable {
+                    try {
+                        Object value = null;
+                        if (get.equals(invocation.getMethodName())) {
+                            if (invocation.getArguments().length != 1) {
+                                throw new IllegalArgumentException("The memcached get method arguments mismatch, must only one arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
+                            }
+                            value = memcachedClient.get(String.valueOf(invocation.getArguments()[0]));
+                        } else if (set.equals(invocation.getMethodName())) {
+                            if (invocation.getArguments().length != 2) {
+                                throw new IllegalArgumentException("The memcached set method arguments mismatch, must be two arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
+                            }
+                            memcachedClient.set(String.valueOf(invocation.getArguments()[0]), expiry, invocation.getArguments()[1]);
+                        } else if (delete.equals(invocation.getMethodName())) {
+                            if (invocation.getArguments().length != 1) {
+                                throw new IllegalArgumentException("The memcached delete method arguments mismatch, must only one arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
+                            }
+                            memcachedClient.delete(String.valueOf(invocation.getArguments()[0]));
+                        } else {
+                            throw new UnsupportedOperationException("Unsupported method " + invocation.getMethodName() + " in memcached service.");
+                        }
+                        return AsyncRpcResult.newDefaultAsyncResult(value, invocation);
+                    } catch (Throwable t) {
+                        RpcException re = new RpcException("Failed to invoke memcached service method. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url + ", cause: " + t.getMessage(), t);
+                        if (t instanceof TimeoutException || t instanceof SocketTimeoutException) {
+                            re.setCode(RpcException.TIMEOUT_EXCEPTION);
+                        } else if (t instanceof MemcachedException || t instanceof IOException) {
+                            re.setCode(RpcException.NETWORK_EXCEPTION);
+                        }
+                        throw re;
+                    }
+                }
+
+                @Override
+                public void destroy() {
+                    super.destroy();
+                    try {
+                        memcachedClient.shutdown();
+                    } catch (Throwable e) {
+                        logger.warn(e.getMessage(), e);
+                    }
+                }
+            };
+        } catch (Throwable t) {
+            throw new RpcException("Failed to refer memcached service. interface: " + type.getName() + ", url: " + url + ", cause: " + t.getMessage(), t);
+        }
+    }
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-memcached/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol b/dubbo-rpc-extensions/dubbo-rpc-memcached/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
new file mode 100644
index 0000000..5102c3f
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-memcached/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
@@ -0,0 +1 @@
+memcached=org.apache.dubbo.rpc.protocol.memcached.MemcachedProtocol
\ No newline at end of file
diff --git a/dubbo-rpc-extensions/dubbo-rpc-memcached/src/test/java/org/apache/dubbo/rpc/protocol/memcached/MemcachedProtocolTest.java b/dubbo-rpc-extensions/dubbo-rpc-memcached/src/test/java/org/apache/dubbo/rpc/protocol/memcached/MemcachedProtocolTest.java
new file mode 100644
index 0000000..4f2a752
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-memcached/src/test/java/org/apache/dubbo/rpc/protocol/memcached/MemcachedProtocolTest.java
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.memcached;
+
+public class MemcachedProtocolTest {
+
+}
\ No newline at end of file
diff --git a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml b/dubbo-rpc-extensions/dubbo-rpc-redis/pom.xml
similarity index 51%
copy from dubbo-registry-extensions/dubbo-registry-dns/pom.xml
copy to dubbo-rpc-extensions/dubbo-rpc-redis/pom.xml
index 72fb770..baae316 100644
--- a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml
+++ b/dubbo-rpc-extensions/dubbo-rpc-redis/pom.xml
@@ -1,4 +1,3 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
@@ -15,34 +14,46 @@
   See the License for the specific language governing permissions and
   limitations under the License.
   -->
-<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">
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
     <parent>
-        <artifactId>dubbo-registry-extensions</artifactId>
+        <artifactId>dubbo-rpc-extensions</artifactId>
         <groupId>org.apache.dubbo.extensions</groupId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <modelVersion>4.0.0</modelVersion>
 
-    <artifactId>dubbo-registry-dns</artifactId>
+    <artifactId>dubbo-rpc-redis</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <version>1.0.2-SNAPSHOT</version>
-    <description>The DNS registry module of Dubbo project</description>
-
+    <description>The redis rpc module of dubbo project</description>
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <artifactId>dubbo-rpc-api</artifactId>
         </dependency>
-
         <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-all</artifactId>
+            <groupId>redis.clients</groupId>
+            <artifactId>jedis</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.github.codemonstur</groupId>
+            <artifactId>embedded-redis</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-serialization-jdk</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.commons</groupId>
+            <artifactId>commons-lang3</artifactId>
+            <scope>test</scope>
         </dependency>
-
     </dependencies>
 </project>
diff --git a/dubbo-rpc-extensions/dubbo-rpc-redis/src/main/java/org/apache/dubbo/rpc/protocol/redis/RedisProtocol.java b/dubbo-rpc-extensions/dubbo-rpc-redis/src/main/java/org/apache/dubbo/rpc/protocol/redis/RedisProtocol.java
new file mode 100644
index 0000000..1fbaec5
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-redis/src/main/java/org/apache/dubbo/rpc/protocol/redis/RedisProtocol.java
@@ -0,0 +1,186 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.redis;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.common.serialize.Serialization;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.remoting.Constants;
+import org.apache.dubbo.rpc.AsyncRpcResult;
+import org.apache.dubbo.rpc.Exporter;
+import org.apache.dubbo.rpc.Invocation;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Result;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.rpc.protocol.AbstractInvoker;
+import org.apache.dubbo.rpc.protocol.AbstractProtocol;
+
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.exceptions.JedisConnectionException;
+import redis.clients.jedis.exceptions.JedisDataException;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.SocketTimeoutException;
+import java.util.Map;
+
+import static org.apache.dubbo.common.constants.CommonConstants.DEFAULT_TIMEOUT;
+import static org.apache.dubbo.common.constants.CommonConstants.TIMEOUT_KEY;
+
+
+/**
+ * RedisProtocol
+ */
+public class RedisProtocol extends AbstractProtocol {
+
+    public static final int DEFAULT_PORT = 6379;
+
+    @Override
+    public int getDefaultPort() {
+        return DEFAULT_PORT;
+    }
+
+    @Override
+    public <T> Exporter<T> export(final Invoker<T> invoker) throws RpcException {
+        throw new UnsupportedOperationException("Unsupported export redis service. url: " + invoker.getUrl());
+    }
+
+    private Serialization getSerialization(URL url) {
+        return ExtensionLoader.getExtensionLoader(Serialization.class).getExtension(url.getParameter(Constants.SERIALIZATION_KEY, "java"));
+    }
+
+    @Override
+    protected <T> Invoker<T> protocolBindingRefer(final Class<T> type, final URL url) throws RpcException {
+        try {
+            GenericObjectPoolConfig config = new GenericObjectPoolConfig();
+            config.setTestOnBorrow(url.getParameter("test.on.borrow", true));
+            config.setTestOnReturn(url.getParameter("test.on.return", false));
+            config.setTestWhileIdle(url.getParameter("test.while.idle", false));
+            if (url.getParameter("max.idle", 0) > 0) {
+                config.setMaxIdle(url.getParameter("max.idle", 0));
+            }
+            if (url.getParameter("min.idle", 0) > 0) {
+                config.setMinIdle(url.getParameter("min.idle", 0));
+            }
+            if (url.getParameter("max.active", 0) > 0) {
+                config.setMaxTotal(url.getParameter("max.active", 0));
+            }
+            if (url.getParameter("max.total", 0) > 0) {
+                config.setMaxTotal(url.getParameter("max.total", 0));
+            }
+            if (url.getParameter("max.wait", 0) > 0) {
+                config.setMaxWaitMillis(url.getParameter("max.wait", 0));
+            }
+            if (url.getParameter("num.tests.per.eviction.run", 0) > 0) {
+                config.setNumTestsPerEvictionRun(url.getParameter("num.tests.per.eviction.run", 0));
+            }
+            if (url.getParameter("time.between.eviction.runs.millis", 0) > 0) {
+                config.setTimeBetweenEvictionRunsMillis(url.getParameter("time.between.eviction.runs.millis", 0));
+            }
+            if (url.getParameter("min.evictable.idle.time.millis", 0) > 0) {
+                config.setMinEvictableIdleTimeMillis(url.getParameter("min.evictable.idle.time.millis", 0));
+            }
+            final JedisPool jedisPool = new JedisPool(config, url.getHost(), url.getPort(DEFAULT_PORT),
+                    url.getParameter(TIMEOUT_KEY, DEFAULT_TIMEOUT),
+                    StringUtils.isBlank(url.getPassword()) ? null : url.getPassword(),
+                    url.getParameter("db.index", 0));
+            final int expiry = url.getParameter("expiry", 0);
+            final String get = url.getParameter("get", "get");
+            final String set = url.getParameter("set", Map.class.equals(type) ? "put" : "set");
+            final String delete = url.getParameter("delete", Map.class.equals(type) ? "remove" : "delete");
+            return new AbstractInvoker<T>(type, url) {
+                @Override
+                protected Result doInvoke(Invocation invocation) throws Throwable {
+                    Jedis jedis = null;
+                    try {
+                        jedis = jedisPool.getResource();
+
+                        if (get.equals(invocation.getMethodName())) {
+                            if (invocation.getArguments().length != 1) {
+                                throw new IllegalArgumentException("The redis get method arguments mismatch, must only one arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
+                            }
+                            byte[] value = jedis.get(String.valueOf(invocation.getArguments()[0]).getBytes());
+                            if (value == null) {
+                                return AsyncRpcResult.newDefaultAsyncResult(invocation);
+                            }
+                            ObjectInput oin = getSerialization(url).deserialize(url, new ByteArrayInputStream(value));
+                            return AsyncRpcResult.newDefaultAsyncResult(oin.readObject(), invocation);
+                        } else if (set.equals(invocation.getMethodName())) {
+                            if (invocation.getArguments().length != 2) {
+                                throw new IllegalArgumentException("The redis set method arguments mismatch, must be two arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
+                            }
+                            byte[] key = String.valueOf(invocation.getArguments()[0]).getBytes();
+                            ByteArrayOutputStream output = new ByteArrayOutputStream();
+                            ObjectOutput value = getSerialization(url).serialize(url, output);
+                            value.writeObject(invocation.getArguments()[1]);
+                            jedis.set(key, output.toByteArray());
+                            if (expiry > 1000) {
+                                jedis.expire(key, expiry / 1000);
+                            }
+                            return AsyncRpcResult.newDefaultAsyncResult(invocation);
+                        } else if (delete.equals(invocation.getMethodName())) {
+                            if (invocation.getArguments().length != 1) {
+                                throw new IllegalArgumentException("The redis delete method arguments mismatch, must only one arguments. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url);
+                            }
+                            jedis.del(String.valueOf(invocation.getArguments()[0]).getBytes());
+                            return AsyncRpcResult.newDefaultAsyncResult(invocation);
+                        } else {
+                            throw new UnsupportedOperationException("Unsupported method " + invocation.getMethodName() + " in redis service.");
+                        }
+                    } catch (Throwable t) {
+                        RpcException re = new RpcException("Failed to invoke redis service method. interface: " + type.getName() + ", method: " + invocation.getMethodName() + ", url: " + url + ", cause: " + t.getMessage(), t);
+                        if (t instanceof SocketTimeoutException) {
+                            re.setCode(RpcException.TIMEOUT_EXCEPTION);
+                        } else if (t instanceof JedisConnectionException || t instanceof IOException) {
+                            re.setCode(RpcException.NETWORK_EXCEPTION);
+                        } else if (t instanceof JedisDataException) {
+                            re.setCode(RpcException.SERIALIZATION_EXCEPTION);
+                        }
+                        throw re;
+                    } finally {
+                        if (jedis != null) {
+                            try {
+                                jedis.close();
+                            } catch (Throwable t) {
+                                logger.warn("returnResource error: " + t.getMessage(), t);
+                            }
+                        }
+                    }
+                }
+
+                @Override
+                public void destroy() {
+                    super.destroy();
+                    try {
+                        jedisPool.destroy();
+                    } catch (Throwable e) {
+                        logger.warn(e.getMessage(), e);
+                    }
+                }
+            };
+        } catch (Throwable t) {
+            throw new RpcException("Failed to refer redis service. interface: " + type.getName() + ", url: " + url + ", cause: " + t.getMessage(), t);
+        }
+    }
+
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-redis/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol b/dubbo-rpc-extensions/dubbo-rpc-redis/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
new file mode 100644
index 0000000..e715493
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-redis/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.rpc.Protocol
@@ -0,0 +1 @@
+redis=org.apache.dubbo.rpc.protocol.redis.RedisProtocol
\ No newline at end of file
diff --git a/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/java/org/apache/dubbo/rpc/protocol/redis/IDemoService.java b/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/java/org/apache/dubbo/rpc/protocol/redis/IDemoService.java
new file mode 100644
index 0000000..0f0b224
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/java/org/apache/dubbo/rpc/protocol/redis/IDemoService.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.redis;
+
+public interface IDemoService {
+    void set(String key, String value);
+
+    String get(String key);
+
+    void delete(String key);
+
+    String unsupported(String wrong);
+
+    String set(String key, String value, String extraArg);
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/java/org/apache/dubbo/rpc/protocol/redis/RedisProtocolTest.java b/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/java/org/apache/dubbo/rpc/protocol/redis/RedisProtocolTest.java
new file mode 100644
index 0000000..14acc7c
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/java/org/apache/dubbo/rpc/protocol/redis/RedisProtocolTest.java
@@ -0,0 +1,254 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.rpc.protocol.redis;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.Serialization;
+import org.apache.dubbo.common.utils.NetUtils;
+import org.apache.dubbo.remoting.Constants;
+import org.apache.dubbo.rpc.Invoker;
+import org.apache.dubbo.rpc.Protocol;
+import org.apache.dubbo.rpc.ProxyFactory;
+import org.apache.dubbo.rpc.RpcException;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.junit.jupiter.api.AfterEach;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestInfo;
+import redis.clients.jedis.Jedis;
+import redis.clients.jedis.JedisPool;
+import redis.clients.jedis.exceptions.JedisConnectionException;
+import redis.clients.jedis.exceptions.JedisDataException;
+import redis.embedded.RedisServer;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.Random;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static redis.embedded.RedisServer.newRedisServer;
+
+public class RedisProtocolTest {
+
+    private static final String
+            REDIS_URL_TEMPLATE = "redis://%slocalhost:%d/TestService",
+            REDIS_PASSWORD = "123456",
+            REDIS_URL_AUTH_SECTION = "username:" + REDIS_PASSWORD + "@";
+
+    private static final Protocol PROTOCOL = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+    private static final ProxyFactory PROXY = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+
+    private RedisServer redisServer;
+    private URL registryUrl;
+
+    @BeforeEach
+    public void setUp(final TestInfo testInfo) throws IOException {
+        final boolean usesAuthentication = usesAuthentication(testInfo);
+        int redisPort = 0;
+        IOException exception = null;
+
+        for (int i = 0; i < 10; i++) {
+            try {
+                redisPort = NetUtils.getAvailablePort(30000 + new Random().nextInt(10000));
+                redisServer = newRedisServer()
+                        .port(redisPort)
+                        // set maxheap to fix Windows error 0x70 while starting redis
+                        .settingIf(SystemUtils.IS_OS_WINDOWS, "maxheap 128mb")
+                        .settingIf(usesAuthentication, "requirepass " + REDIS_PASSWORD)
+                        .build();
+                this.redisServer.start();
+                exception = null;
+            } catch (IOException e) {
+                e.printStackTrace();
+                exception = e;
+            }
+            if (exception == null) {
+                break;
+            }
+        }
+
+        Assertions.assertNull(exception);
+        registryUrl = newRedisUrl(usesAuthentication, redisPort);
+    }
+
+    private static boolean usesAuthentication(final TestInfo testInfo) {
+        final String methodName = testInfo.getTestMethod().get().getName();
+        return "testAuthRedis".equals(methodName) || "testWrongAuthRedis".equals(methodName);
+    }
+    private static URL newRedisUrl(final boolean usesAuthentication, final int redisPort) {
+        final String urlAuthSection = usesAuthentication ? REDIS_URL_AUTH_SECTION : "";
+        final String urlSuffix = usesAuthentication ? "?db.index=0" : "";
+        return URL.valueOf(String.format(REDIS_URL_TEMPLATE, urlAuthSection, redisPort) + urlSuffix);
+    }
+
+    @AfterEach
+    public void tearDown() throws IOException {
+        this.redisServer.stop();
+    }
+    @Test
+    public void testReferClass() {
+        Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class, registryUrl);
+
+        Class<IDemoService> serviceClass = refer.getInterface();
+        assertThat(serviceClass.getName(), is("org.apache.dubbo.rpc.protocol.redis.IDemoService"));
+    }
+
+    @Test
+    public void testInvocation() {
+        Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class,
+                registryUrl
+                        .addParameter("max.idle", 10)
+                        .addParameter("max.active", 20));
+        IDemoService demoService = PROXY.getProxy(refer);
+
+        String value = demoService.get("key");
+        assertThat(value, is(nullValue()));
+
+        demoService.set("key", "newValue");
+        value = demoService.get("key");
+        assertThat(value, is("newValue"));
+
+        demoService.delete("key");
+        value = demoService.get("key");
+        assertThat(value, is(nullValue()));
+
+        refer.destroy();
+    }
+
+    @Test
+    public void testUnsupportedMethod() {
+        Assertions.assertThrows(RpcException.class, () -> {
+            Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class, registryUrl);
+            IDemoService demoService = this.PROXY.getProxy(refer);
+
+            demoService.unsupported(null);
+        });
+    }
+
+    @Test
+    public void testWrongParameters() {
+        Assertions.assertThrows(RpcException.class, () -> {
+            Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class, registryUrl);
+            IDemoService demoService = this.PROXY.getProxy(refer);
+
+            demoService.set("key", "value", "wrongValue");
+        });
+    }
+
+    @Test
+    public void testWrongRedis() {
+        Assertions.assertThrows(RpcException.class, () -> {
+            Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class, URL.valueOf("redis://localhost:1"));
+            IDemoService demoService = this.PROXY.getProxy(refer);
+
+            demoService.get("key");
+        });
+    }
+
+    @Test
+    public void testExport() {
+        Assertions.assertThrows(UnsupportedOperationException.class, () -> PROTOCOL.export(PROTOCOL.refer(IDemoService.class, registryUrl)));
+    }
+
+    @Test
+    public void testAuthRedis() {
+        // default db.index=0
+        Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class,
+                registryUrl
+                        .addParameter("max.idle", 10)
+                        .addParameter("max.active", 20));
+        IDemoService demoService = this.PROXY.getProxy(refer);
+
+        String value = demoService.get("key");
+        assertThat(value, is(nullValue()));
+
+        demoService.set("key", "newValue");
+        value = demoService.get("key");
+        assertThat(value, is("newValue"));
+
+        demoService.delete("key");
+        value = demoService.get("key");
+        assertThat(value, is(nullValue()));
+
+        refer.destroy();
+
+        //change db.index=1
+        String password = "123456";
+        int database = 1;
+        this.registryUrl = this.registryUrl.setPassword(password).addParameter("db.index", database);
+        refer = PROTOCOL.refer(IDemoService.class,
+                registryUrl
+                        .addParameter("max.idle", 10)
+                        .addParameter("max.active", 20));
+        demoService = this.PROXY.getProxy(refer);
+
+        demoService.set("key", "newValue");
+        value = demoService.get("key");
+        assertThat(value, is("newValue"));
+
+        // jedis gets the result comparison
+        JedisPool pool = new JedisPool(new GenericObjectPoolConfig(), "localhost", registryUrl.getPort(), 2000, password, database, (String) null);
+        try (Jedis jedis = pool.getResource()) {
+            byte[] valueByte = jedis.get("key".getBytes());
+            Serialization serialization = ExtensionLoader.getExtensionLoader(Serialization.class).getExtension(this.registryUrl.getParameter(Constants.SERIALIZATION_KEY, "java"));
+            ObjectInput oin = serialization.deserialize(this.registryUrl, new ByteArrayInputStream(valueByte));
+            String actual = (String) oin.readObject();
+            assertThat(value, is(actual));
+        } catch (Exception e) {
+            Assertions.fail("jedis gets the result comparison is error!");
+        } finally {
+            pool.destroy();
+        }
+
+        demoService.delete("key");
+        value = demoService.get("key");
+        assertThat(value, is(nullValue()));
+
+        refer.destroy();
+    }
+
+    @Test
+    public void testWrongAuthRedis() {
+        String password = "1234567";
+        this.registryUrl = this.registryUrl.setPassword(password);
+        Invoker<IDemoService> refer = PROTOCOL.refer(IDemoService.class,
+                registryUrl
+                        .addParameter("max.idle", 10)
+                        .addParameter("max.active", 20));
+        IDemoService demoService = this.PROXY.getProxy(refer);
+
+        try {
+            String value = demoService.get("key");
+            assertThat(value, is(nullValue()));
+        } catch (RpcException e) {
+            if (e.getCause() instanceof JedisConnectionException && e.getCause().getCause() instanceof JedisDataException) {
+                Assertions.assertEquals("ERR invalid password", e.getCause().getCause().getMessage());
+            } else {
+                Assertions.fail("no invalid password exception!");
+            }
+        }
+
+        refer.destroy();
+    }
+}
diff --git a/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization b/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
new file mode 100644
index 0000000..495c475
--- /dev/null
+++ b/dubbo-rpc-extensions/dubbo-rpc-redis/src/test/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
@@ -0,0 +1 @@
+java=org.apache.dubbo.common.serialize.java.JavaSerialization
\ No newline at end of file
diff --git a/dubbo-rpc-extensions/pom.xml b/dubbo-rpc-extensions/pom.xml
index 0bfb941..d4a1800 100644
--- a/dubbo-rpc-extensions/pom.xml
+++ b/dubbo-rpc-extensions/pom.xml
@@ -36,6 +36,9 @@
         <module>dubbo-rpc-http</module>
         <module>dubbo-rpc-webservice</module>
         <module>dubbo-rpc-rmi</module>
+        <module>dubbo-rpc-hessian</module>
+        <module>dubbo-rpc-memcached</module>
+        <module>dubbo-rpc-redis</module>
     </modules>
 
 </project>
diff --git a/dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml b/dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml
index 275ece8..8aa18f4 100644
--- a/dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml
+++ b/dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml
@@ -31,7 +31,7 @@ limitations under the License.
     <description>The kryo serialization module of dubbo project</description>
     <properties>
         <skip_maven_deploy>false</skip_maven_deploy>
-        <dubbo-common-extensions-version>3.0.0-SNAPSHOT</dubbo-common-extensions-version>
+        <dubbo-common-extensions-version>1.0.1</dubbo-common-extensions-version>
     </properties>
     <dependencies>
         <dependency>
diff --git a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml b/dubbo-serialization-extensions/dubbo-serialization-msgpack/pom.xml
similarity index 66%
copy from dubbo-registry-extensions/dubbo-registry-dns/pom.xml
copy to dubbo-serialization-extensions/dubbo-serialization-msgpack/pom.xml
index 72fb770..a47d128 100644
--- a/dubbo-registry-extensions/dubbo-registry-dns/pom.xml
+++ b/dubbo-serialization-extensions/dubbo-serialization-msgpack/pom.xml
@@ -1,6 +1,5 @@
-<?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Licensed to the Apache Software Foundation (ASF) under one or more
+Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
@@ -18,31 +17,40 @@
 <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>
     <parent>
-        <artifactId>dubbo-registry-extensions</artifactId>
         <groupId>org.apache.dubbo.extensions</groupId>
+        <artifactId>dubbo-serialization-extensions</artifactId>
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
-    <modelVersion>4.0.0</modelVersion>
-
-    <artifactId>dubbo-registry-dns</artifactId>
+    <artifactId>dubbo-serialization-msgpack</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <version>1.0.2-SNAPSHOT</version>
-    <description>The DNS registry module of Dubbo project</description>
+    <description>The Msgpack serialization implement for dubbo</description>
+    <properties>
+        <skip_maven_deploy>false</skip_maven_deploy>
+    </properties>
 
     <dependencies>
+
         <dependency>
             <groupId>org.apache.dubbo</groupId>
-            <artifactId>dubbo</artifactId>
-            <version>3.0.8-SNAPSHOT</version>
+            <artifactId>dubbo-serialization-api</artifactId>
         </dependency>
 
         <dependency>
-            <groupId>io.netty</groupId>
-            <artifactId>netty-all</artifactId>
+            <groupId>org.msgpack</groupId>
+            <artifactId>msgpack-core</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.msgpack</groupId>
+            <artifactId>jackson-dataformat-msgpack</artifactId>
         </dependency>
 
     </dependencies>
+
+
 </project>
diff --git a/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectInput.java b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectInput.java
new file mode 100644
index 0000000..3b7c004
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectInput.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.common.serialize.msgpack;
+
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.utils.PojoUtils;
+
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.msgpack.jackson.dataformat.MessagePackFactory;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+
+public class MsgpackObjectInput implements ObjectInput {
+
+    private final InputStream in;
+
+    private ObjectMapper om;
+
+    public MsgpackObjectInput(InputStream in) {
+        this.in = in;
+        om = new ObjectMapper(new MessagePackFactory());
+        om.configure(JsonParser.Feature.AUTO_CLOSE_SOURCE, false);
+    }
+
+    @Override
+    public boolean readBool() throws IOException {
+        return read(boolean.class);
+    }
+
+    @Override
+    public byte readByte() throws IOException {
+        return read(byte.class);
+    }
+
+    @Override
+    public short readShort() throws IOException {
+        return read(short.class);
+    }
+
+    @Override
+    public int readInt() throws IOException {
+        return read(int.class);
+    }
+
+    @Override
+    public long readLong() throws IOException {
+        return read(long.class);
+    }
+
+    @Override
+    public float readFloat() throws IOException {
+        return read(float.class);
+    }
+
+    @Override
+    public double readDouble() throws IOException {
+        return read(double.class);
+    }
+
+    @Override
+    public String readUTF() throws IOException {
+        return read(String.class);
+    }
+
+    @Override
+    public byte[] readBytes() throws IOException {
+        return read(byte[].class);
+    }
+
+    @Override
+    public Object readObject() throws IOException, ClassNotFoundException {
+        return om.readValue(this.in, Object.class);
+    }
+
+    @Override
+    public <T> T readObject(Class<T> cls) throws IOException, ClassNotFoundException {
+        return read(cls);
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T readObject(Class<T> cls, Type type) throws IOException, ClassNotFoundException {
+        Object value = readObject(cls);
+        return (T) PojoUtils.realize(value, cls, type);
+    }
+
+    private <T> T read(Class<T> cls) throws IOException {
+        return om.readValue(this.in, cls);
+    }
+
+    @Override
+    public Throwable readThrowable() throws IOException, ClassNotFoundException {
+        Class clazz = readObject(Class.class);
+        return (Throwable) readObject(clazz);
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectOutput.java b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectOutput.java
new file mode 100644
index 0000000..c335352
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectOutput.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.common.serialize.msgpack;
+
+import org.apache.dubbo.common.serialize.ObjectOutput;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.msgpack.jackson.dataformat.MessagePackFactory;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Arrays;
+
+
+public class MsgpackObjectOutput implements ObjectOutput {
+
+    private OutputStream out;
+    private ObjectMapper om;
+
+    public MsgpackObjectOutput(OutputStream out) {
+        this.out = out;
+        om = new ObjectMapper(new MessagePackFactory());
+    }
+
+    @Override
+    public void writeBool(boolean v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeByte(byte v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeShort(short v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeInt(int v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeLong(long v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeFloat(float v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeDouble(double v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeUTF(String v) throws IOException {
+        writeObject(v);
+    }
+
+    @Override
+    public void writeBytes(byte[] b) throws IOException {
+        writeObject(b);
+    }
+
+    @Override
+    public void writeBytes(byte[] b, int off, int len) throws IOException {
+        byte[] d = Arrays.copyOfRange(b, off, off + len);
+        writeObject(d);
+    }
+
+    @Override
+    public void writeObject(Object obj) throws IOException {
+        byte[] bytes = om.writeValueAsBytes(obj);
+        out.write(bytes);
+        out.flush();
+        bytes = null;
+    }
+
+    @Override
+    public void writeThrowable(Object obj) throws IOException {
+        writeObject(obj.getClass());
+        writeObject(obj);
+    }
+
+    @Override
+    public void flushBuffer() throws IOException {
+        out.flush();
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackSerialization.java b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackSerialization.java
new file mode 100644
index 0000000..3f67141
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/java/org/apache/dubbo/common/serialize/msgpack/MsgpackSerialization.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.common.serialize.msgpack;
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.common.serialize.Serialization;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+public class MsgpackSerialization implements Serialization {
+
+    byte MSGPACK_SERIALIZATION_ID = 27;
+
+    @Override
+    public byte getContentTypeId() {
+        return MSGPACK_SERIALIZATION_ID;
+    }
+
+    @Override
+    public String getContentType() {
+        return "text/json";
+    }
+
+    @Override
+    public ObjectOutput serialize(URL url, OutputStream output) throws IOException {
+        return new MsgpackObjectOutput(output);
+    }
+
+    @Override
+    public ObjectInput deserialize(URL url, InputStream input) throws IOException {
+        return new MsgpackObjectInput(input);
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
new file mode 100644
index 0000000..08015de
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
@@ -0,0 +1 @@
+msgpack=org.apache.dubbo.common.serialize.msgpack.MsgpackSerialization
diff --git a/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/test/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectOutputTest.java b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/test/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectOutputTest.java
new file mode 100644
index 0000000..ccfbf10
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-msgpack/src/test/java/org/apache/dubbo/common/serialize/msgpack/MsgpackObjectOutputTest.java
@@ -0,0 +1,273 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.common.serialize.msgpack;
+
+
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class MsgpackObjectOutputTest {
+    private MsgpackObjectOutput msgpackObjectOutput;
+    private MsgpackObjectInput msgpackObjectInput;
+    private ByteArrayOutputStream byteArrayOutputStream;
+    private ByteArrayInputStream byteArrayInputStream;
+
+    @BeforeEach
+    public void setUp() throws Exception {
+        this.byteArrayOutputStream = new ByteArrayOutputStream();
+        this.msgpackObjectOutput = new MsgpackObjectOutput(byteArrayOutputStream);
+    }
+
+    @Test
+    public void testWriteBool() throws IOException {
+        this.msgpackObjectOutput.writeBool(true);
+        this.flushToInput();
+
+        assertThat(msgpackObjectInput.readBool(), is(true));
+    }
+
+    @Test
+    public void testWriteShort() throws IOException {
+        this.msgpackObjectOutput.writeShort((short) 2);
+        this.flushToInput();
+
+        assertThat(msgpackObjectInput.readShort(), is((short) 2));
+    }
+
+    @Test
+    public void testWriteInt() throws IOException {
+        this.msgpackObjectOutput.writeInt(1);
+        this.flushToInput();
+
+        assertThat(msgpackObjectInput.readInt(), is(1));
+    }
+
+    @Test
+    public void testWriteLong() throws IOException {
+        this.msgpackObjectOutput.writeLong(1000L);
+        this.flushToInput();
+
+        assertThat(msgpackObjectInput.readLong(), is(1000L));
+    }
+
+    @Test
+    public void testWriteUTF() throws IOException {
+        this.msgpackObjectOutput.writeUTF("Pace Hasîtî 和平 Мир");
+        this.flushToInput();
+
+        assertThat(msgpackObjectInput.readUTF(), is("Pace Hasîtî 和平 Мир"));
+    }
+
+    @Test
+    public void testWriteUTF2() throws IOException {
+        this.msgpackObjectOutput.writeUTF("a");
+        this.msgpackObjectOutput.writeUTF("b");
+        this.msgpackObjectOutput.writeUTF("c");
+        this.flushToInput();
+        assertThat(msgpackObjectInput.readUTF(), is("a"));
+        assertThat(msgpackObjectInput.readUTF(), is("b"));
+        assertThat(msgpackObjectInput.readUTF(), is("c"));
+    }
+
+
+    @Test
+    public void testWriteThrowable() throws IOException, ClassNotFoundException {
+        BizException throwable = new BizException("error");
+        this.msgpackObjectOutput.writeThrowable(throwable);
+        this.flushToInput();
+        Throwable ex = msgpackObjectInput.readThrowable();
+        assertThat(ex.getMessage(), is("error"));
+        assertThat(ex.getClass(), is(BizException.class));
+    }
+
+    @Test
+    public void testWriteFloat() throws IOException {
+        this.msgpackObjectOutput.writeFloat(1.88f);
+        this.flushToInput();
+
+        assertThat(this.msgpackObjectInput.readFloat(), is(1.88f));
+    }
+
+    @Test
+    public void testWriteDouble() throws IOException {
+        this.msgpackObjectOutput.writeDouble(1.66d);
+        this.flushToInput();
+
+        assertThat(this.msgpackObjectInput.readDouble(), is(1.66d));
+    }
+
+    @Test
+    public void testWriteBytes() throws IOException {
+        this.msgpackObjectOutput.writeBytes("hello".getBytes());
+        this.flushToInput();
+
+        assertThat(this.msgpackObjectInput.readBytes(), is("hello".getBytes()));
+    }
+
+    @Test
+    public void testWriteBytesWithSubLength() throws IOException {
+        this.msgpackObjectOutput.writeBytes("hello".getBytes(), 2, 2);
+        this.flushToInput();
+
+        assertThat(this.msgpackObjectInput.readBytes(), is("ll".getBytes()));
+    }
+
+    @Test
+    public void testWriteByte() throws IOException {
+        this.msgpackObjectOutput.writeByte((byte) 123);
+        this.flushToInput();
+
+        assertThat(this.msgpackObjectInput.readByte(), is((byte) 123));
+    }
+
+    @Test
+    public void testWriteObject() throws IOException, ClassNotFoundException {
+        Image image = new Image("test.png", "logo", 300, 480, MsgpackObjectOutputTest.Image.Size.SMALL);
+        this.msgpackObjectOutput.writeObject(image);
+        this.flushToInput();
+        Image readObjectForImage = msgpackObjectInput.readObject(Image.class);
+        assertThat(readObjectForImage, not(nullValue()));
+        assertThat(readObjectForImage, is(image));
+    }
+
+    private void flushToInput() throws IOException {
+        this.msgpackObjectOutput.flushBuffer();
+        this.byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
+        this.msgpackObjectInput = new MsgpackObjectInput(byteArrayInputStream);
+    }
+
+
+    public static class BizException extends RuntimeException {
+
+        public BizException(String message) {
+            super(message);
+        }
+        
+    }
+
+    public static class Image implements java.io.Serializable {
+        private static final long serialVersionUID = 1L;
+        public String uri;
+        public String title;  // Can be null
+        public int width;
+        public int height;
+        public Image.Size size;
+
+        public Image() {
+        }
+
+        public Image(String uri, String title, int width, int height, Image.Size size) {
+            this.height = height;
+            this.title = title;
+            this.uri = uri;
+            this.width = width;
+            this.size = size;
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+
+            Image image = (Image) o;
+
+            if (height != image.height) return false;
+            if (width != image.width) return false;
+            if (size != image.size) return false;
+            if (title != null ? !title.equals(image.title) : image.title != null) return false;
+            if (uri != null ? !uri.equals(image.uri) : image.uri != null) return false;
+
+            return true;
+        }
+
+        @Override
+        public int hashCode() {
+            int result = uri != null ? uri.hashCode() : 0;
+            result = 31 * result + (title != null ? title.hashCode() : 0);
+            result = 31 * result + width;
+            result = 31 * result + height;
+            result = 31 * result + (size != null ? size.hashCode() : 0);
+            return result;
+        }
+
+        public String toString() {
+            StringBuilder sb = new StringBuilder();
+            sb.append("[Image ");
+            sb.append("uri=").append(uri);
+            sb.append(", title=").append(title);
+            sb.append(", width=").append(width);
+            sb.append(", height=").append(height);
+            sb.append(", size=").append(size);
+            sb.append("]");
+            return sb.toString();
+        }
+
+        public String getUri() {
+            return uri;
+        }
+
+        public void setUri(String uri) {
+            this.uri = uri;
+        }
+
+        public String getTitle() {
+            return title;
+        }
+
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        public int getWidth() {
+            return width;
+        }
+
+        public void setWidth(int width) {
+            this.width = width;
+        }
+
+        public int getHeight() {
+            return height;
+        }
+
+        public void setHeight(int height) {
+            this.height = height;
+        }
+
+        public Image.Size getSize() {
+            return size;
+        }
+
+        public void setSize(Image.Size size) {
+            this.size = size;
+        }
+
+        public enum Size {
+            SMALL, LARGE
+        }
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml b/dubbo-serialization-extensions/dubbo-serialization-native-hession/pom.xml
similarity index 59%
copy from dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml
copy to dubbo-serialization-extensions/dubbo-serialization-native-hession/pom.xml
index 275ece8..edf298b 100644
--- a/dubbo-serialization-extensions/dubbo-serialization-kryo/pom.xml
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/pom.xml
@@ -15,8 +15,7 @@ See the License for the specific language governing permissions and
 limitations under the License.
 -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+<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>
     <parent>
         <groupId>org.apache.dubbo.extensions</groupId>
@@ -24,32 +23,21 @@ limitations under the License.
         <version>${revision}</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
-    <artifactId>dubbo-serialization-kryo</artifactId>
+
+    <artifactId>dubbo-serialization-native-hession</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
     <packaging>jar</packaging>
     <name>${project.artifactId}</name>
-    <version>1.0.2-SNAPSHOT</version>
-    <description>The kryo serialization module of dubbo project</description>
-    <properties>
-        <skip_maven_deploy>false</skip_maven_deploy>
-        <dubbo-common-extensions-version>3.0.0-SNAPSHOT</dubbo-common-extensions-version>
-    </properties>
+    <description>The native-hession serialization module of dubbo project</description>
+
     <dependencies>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
             <artifactId>dubbo-serialization-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>com.esotericsoftware</groupId>
-            <artifactId>kryo</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>de.javakaffee</groupId>
-            <artifactId>kryo-serializers</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.dubbo.extensions</groupId>
-            <artifactId>dubbo-common-extensions</artifactId>
-            <version>${dubbo-common-extensions-version}</version>
+            <groupId>com.caucho</groupId>
+            <artifactId>hessian</artifactId>
         </dependency>
     </dependencies>
 </project>
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2ObjectInput.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2ObjectInput.java
new file mode 100644
index 0000000..5f7430a
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2ObjectInput.java
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian;
+
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer;
+
+import com.caucho.hessian.io.Hessian2Input;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.reflect.Type;
+
+/**
+ * Hessian2 Object input.
+ */
+public class Hessian2ObjectInput implements ObjectInput {
+    private final Hessian2Input input;
+
+    public Hessian2ObjectInput(InputStream is) {
+        input = new Hessian2Input(is);
+        input.setSerializerFactory(Hessian2FactoryInitializer.getInstance().getSerializerFactory());
+    }
+
+    @Override
+    public boolean readBool() throws IOException {
+        return input.readBoolean();
+    }
+
+    @Override
+    public byte readByte() throws IOException {
+        return (byte) input.readInt();
+    }
+
+    @Override
+    public short readShort() throws IOException {
+        return (short) input.readInt();
+    }
+
+    @Override
+    public int readInt() throws IOException {
+        return input.readInt();
+    }
+
+    @Override
+    public long readLong() throws IOException {
+        return input.readLong();
+    }
+
+    @Override
+    public float readFloat() throws IOException {
+        return (float) input.readDouble();
+    }
+
+    @Override
+    public double readDouble() throws IOException {
+        return input.readDouble();
+    }
+
+    @Override
+    public byte[] readBytes() throws IOException {
+        return input.readBytes();
+    }
+
+    @Override
+    public String readUTF() throws IOException {
+        return input.readString();
+    }
+
+    @Override
+    public Object readObject() throws IOException {
+        return input.readObject();
+    }
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public <T> T readObject(Class<T> cls) throws IOException {
+        return (T) input.readObject(cls);
+    }
+
+    @Override
+    public <T> T readObject(Class<T> cls, Type type) throws IOException {
+        return readObject(cls);
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2ObjectOutput.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2ObjectOutput.java
new file mode 100644
index 0000000..2bc2d01
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2ObjectOutput.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian;
+
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer;
+
+import com.caucho.hessian.io.Hessian2Output;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * Hessian2 Object output.
+ */
+public class Hessian2ObjectOutput implements ObjectOutput {
+    private final Hessian2Output output;
+
+    public Hessian2ObjectOutput(OutputStream os) {
+        output = new Hessian2Output(os);
+        output.setSerializerFactory(Hessian2FactoryInitializer.getInstance().getSerializerFactory());
+    }
+
+    @Override
+    public void writeBool(boolean v) throws IOException {
+        output.writeBoolean(v);
+    }
+
+    @Override
+    public void writeByte(byte v) throws IOException {
+        output.writeInt(v);
+    }
+
+    @Override
+    public void writeShort(short v) throws IOException {
+        output.writeInt(v);
+    }
+
+    @Override
+    public void writeInt(int v) throws IOException {
+        output.writeInt(v);
+    }
+
+    @Override
+    public void writeLong(long v) throws IOException {
+        output.writeLong(v);
+    }
+
+    @Override
+    public void writeFloat(float v) throws IOException {
+        output.writeDouble(v);
+    }
+
+    @Override
+    public void writeDouble(double v) throws IOException {
+        output.writeDouble(v);
+    }
+
+    @Override
+    public void writeBytes(byte[] b) throws IOException {
+        output.writeBytes(b);
+    }
+
+    @Override
+    public void writeBytes(byte[] b, int off, int len) throws IOException {
+        output.writeBytes(b, off, len);
+    }
+
+    @Override
+    public void writeUTF(String v) throws IOException {
+        output.writeString(v);
+    }
+
+    @Override
+    public void writeObject(Object obj) throws IOException {
+        output.writeObject(obj);
+    }
+
+    @Override
+    public void flushBuffer() throws IOException {
+        output.flushBuffer();
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2Serialization.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2Serialization.java
new file mode 100644
index 0000000..ee58876
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2Serialization.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian;
+
+
+import org.apache.dubbo.common.URL;
+import org.apache.dubbo.common.serialize.ObjectInput;
+import org.apache.dubbo.common.serialize.ObjectOutput;
+import org.apache.dubbo.common.serialize.Serialization;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+
+import static org.apache.dubbo.common.serialize.Constants.NATIVE_HESSIAN_SERIALIZATION_ID;
+
+public class Hessian2Serialization implements Serialization {
+
+    @Override
+    public byte getContentTypeId() {
+        return NATIVE_HESSIAN_SERIALIZATION_ID;
+    }
+
+    @Override
+    public String getContentType() {
+        return "x-application/native-hessian";
+    }
+
+    @Override
+    public ObjectOutput serialize(URL url, OutputStream out) throws IOException {
+        return new Hessian2ObjectOutput(out);
+    }
+
+    @Override
+    public ObjectInput deserialize(URL url, InputStream is) throws IOException {
+        return new Hessian2ObjectInput(is);
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2SerializerFactory.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2SerializerFactory.java
new file mode 100644
index 0000000..f096491
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/Hessian2SerializerFactory.java
@@ -0,0 +1,107 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian;
+
+import org.apache.dubbo.serialize.hessian.serializer.java8.DurationHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.InstantHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.LocalDateHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.LocalDateTimeHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.LocalTimeHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.MonthDayHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.OffsetDateTimeHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.OffsetTimeHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.PeriodHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.YearHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.YearMonthHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.ZoneIdSerializer;
+import org.apache.dubbo.serialize.hessian.serializer.java8.ZoneOffsetHandle;
+import org.apache.dubbo.serialize.hessian.serializer.java8.ZonedDateTimeHandle;
+
+import com.caucho.hessian.io.Deserializer;
+import com.caucho.hessian.io.HessianProtocolException;
+import com.caucho.hessian.io.Serializer;
+import com.caucho.hessian.io.SerializerFactory;
+
+import java.util.HashMap;
+
+import static org.apache.dubbo.serialize.hessian.serializer.java8.Java8TimeSerializer.create;
+
+public class Hessian2SerializerFactory extends SerializerFactory {
+    private HashMap _serializerMap = new HashMap();
+    private HashMap _deserializerMap = new HashMap();
+
+    public Hessian2SerializerFactory() {
+        super();
+        if (isJava8()) {
+            try {
+                this.addSerializer(Class.forName("java.time.LocalTime"), create(LocalTimeHandle.class));
+                this.addSerializer(Class.forName("java.time.LocalDate"), create(LocalDateHandle.class));
+                this.addSerializer(Class.forName("java.time.LocalDateTime"), create(LocalDateTimeHandle.class));
+
+                this.addSerializer(Class.forName("java.time.Instant"), create(InstantHandle.class));
+                this.addSerializer(Class.forName("java.time.Duration"), create(DurationHandle.class));
+                this.addSerializer(Class.forName("java.time.Period"), create(PeriodHandle.class));
+
+                this.addSerializer(Class.forName("java.time.Year"), create(YearHandle.class));
+                this.addSerializer(Class.forName("java.time.YearMonth"), create(YearMonthHandle.class));
+                this.addSerializer(Class.forName("java.time.MonthDay"), create(MonthDayHandle.class));
+
+                this.addSerializer(Class.forName("java.time.OffsetDateTime"), create(OffsetDateTimeHandle.class));
+                this.addSerializer(Class.forName("java.time.ZoneOffset"), create(ZoneOffsetHandle.class));
+                this.addSerializer(Class.forName("java.time.OffsetTime"), create(OffsetTimeHandle.class));
+                this.addSerializer(Class.forName("java.time.ZonedDateTime"), create(ZonedDateTimeHandle.class));
+            } catch (ClassNotFoundException e) {
+                // ignore
+            }
+        }
+    }
+
+    @Override
+    public Serializer getSerializer(Class cl) throws HessianProtocolException {
+        if (isZoneId(cl)) {
+            return ZoneIdSerializer.getInstance();
+        }
+        Object java8Serializer = this._serializerMap.get(cl);
+        if (java8Serializer != null) {
+            return (Serializer) java8Serializer;
+        }
+        return super.getSerializer(cl);
+    }
+
+    private static boolean isZoneId(Class cl) {
+        try {
+            return isJava8() && Class.forName("java.time.ZoneId").isAssignableFrom(cl);
+        } catch (ClassNotFoundException e) {
+            // ignore
+        }
+        return false;
+    }
+
+    private static boolean isJava8() {
+        String javaVersion = System.getProperty("java.specification.version");
+        return Double.valueOf(javaVersion) >= 1.8;
+    }
+
+    public void addSerializer(Class cl, Serializer serializer) {
+        this._serializerMap.put(cl, serializer);
+    }
+
+    public void addDeserializer(Class cl, Deserializer deserializer) {
+        this._deserializerMap.put(cl, deserializer);
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/AbstractHessian2FactoryInitializer.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/AbstractHessian2FactoryInitializer.java
new file mode 100644
index 0000000..4ea381e
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/AbstractHessian2FactoryInitializer.java
@@ -0,0 +1,36 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian.dubbo;
+
+import com.caucho.hessian.io.SerializerFactory;
+
+public abstract class AbstractHessian2FactoryInitializer implements Hessian2FactoryInitializer {
+    private static SerializerFactory SERIALIZER_FACTORY;
+
+    @Override
+    public SerializerFactory getSerializerFactory() {
+        if (SERIALIZER_FACTORY != null) {
+            return SERIALIZER_FACTORY;
+        }
+        synchronized (this) {
+            SERIALIZER_FACTORY = createSerializerFactory();
+        }
+        return SERIALIZER_FACTORY;
+    }
+
+    protected abstract SerializerFactory createSerializerFactory();
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/DefaultHessian2FactoryInitializer.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/DefaultHessian2FactoryInitializer.java
new file mode 100644
index 0000000..2161919
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/DefaultHessian2FactoryInitializer.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian.dubbo;
+
+import org.apache.dubbo.serialize.hessian.Hessian2SerializerFactory;
+
+import com.caucho.hessian.io.SerializerFactory;
+
+public class DefaultHessian2FactoryInitializer extends AbstractHessian2FactoryInitializer {
+    @Override
+    protected SerializerFactory createSerializerFactory() {
+        return new Hessian2SerializerFactory();
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/Hessian2FactoryInitializer.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/Hessian2FactoryInitializer.java
new file mode 100644
index 0000000..41061c2
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/Hessian2FactoryInitializer.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian.dubbo;
+
+import org.apache.dubbo.common.config.ConfigurationUtils;
+import org.apache.dubbo.common.extension.ExtensionLoader;
+import org.apache.dubbo.common.extension.SPI;
+import org.apache.dubbo.common.utils.StringUtils;
+
+import com.caucho.hessian.io.SerializerFactory;
+
+@SPI("default")
+public interface Hessian2FactoryInitializer {
+    String WHITELIST = "dubbo.application.hessian2.whitelist";
+    String ALLOW = "dubbo.application.hessian2.allow";
+    String DENY = "dubbo.application.hessian2.deny";
+    ExtensionLoader<Hessian2FactoryInitializer> loader = ExtensionLoader.getExtensionLoader(Hessian2FactoryInitializer.class);
+
+    SerializerFactory getSerializerFactory();
+
+    static Hessian2FactoryInitializer getInstance() {
+        String whitelist = ConfigurationUtils.getProperty(WHITELIST);
+        if (StringUtils.isNotEmpty(whitelist)) {
+            return loader.getExtension("whitelist");
+        }
+        return loader.getDefaultExtension();
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/WhitelistHessian2FactoryInitializer.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/WhitelistHessian2FactoryInitializer.java
new file mode 100644
index 0000000..a7edd27
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/dubbo/WhitelistHessian2FactoryInitializer.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+package org.apache.dubbo.serialize.hessian.dubbo;
+
+import org.apache.dubbo.common.config.ConfigurationUtils;
+import org.apache.dubbo.common.utils.StringUtils;
+import org.apache.dubbo.serialize.hessian.Hessian2SerializerFactory;
+
+import com.caucho.hessian.io.SerializerFactory;
+
+/**
+ * see https://github.com/ebourg/hessian/commit/cf851f5131707891e723f7f6a9718c2461aed826
+ */
+public class WhitelistHessian2FactoryInitializer extends AbstractHessian2FactoryInitializer {
+
+    @Override
+    public SerializerFactory createSerializerFactory() {
+        SerializerFactory serializerFactory = new Hessian2SerializerFactory();
+        String whiteList = ConfigurationUtils.getProperty(WHITELIST);
+        if ("true".equals(whiteList)) {
+            serializerFactory.getClassFactory().setWhitelist(true);
+            String allowPattern = ConfigurationUtils.getProperty(ALLOW);
+            if (StringUtils.isNotEmpty(allowPattern)) {
+                serializerFactory.getClassFactory().allow(allowPattern);
+            }
+        } else {
+            serializerFactory.getClassFactory().setWhitelist(false);
+            String denyPattern = ConfigurationUtils.getProperty(DENY);
+            if (StringUtils.isNotEmpty(denyPattern)) {
+                serializerFactory.getClassFactory().deny(denyPattern);
+            }
+        }
+        return serializerFactory;
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/DurationHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/DurationHandle.java
new file mode 100755
index 0000000..67615f3
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/DurationHandle.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.Duration;
+
+public class DurationHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -4367309317780077156L;
+
+    private long seconds;
+    private int nanos;
+
+    public DurationHandle() {
+    }
+
+    public DurationHandle(Object o) {
+        try {
+            Duration duration = (Duration) o;
+            this.seconds = duration.getSeconds();
+            this.nanos = duration.getNano();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return Duration.ofSeconds(seconds, nanos);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/InstantHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/InstantHandle.java
new file mode 100755
index 0000000..6b9a1a8
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/InstantHandle.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.Instant;
+
+public class InstantHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -4367309317780077156L;
+
+    private long seconds;
+    private int nanos;
+
+    public InstantHandle() {
+    }
+
+    public InstantHandle(Object o) {
+        try {
+            Instant instant = (Instant) o;
+            this.seconds = instant.getEpochSecond();
+            this.nanos = instant.getNano();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+
+    private Object readResolve() {
+        try {
+            return Instant.ofEpochSecond(seconds, nanos);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/Java8TimeSerializer.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/Java8TimeSerializer.java
new file mode 100755
index 0000000..4b4494d
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/Java8TimeSerializer.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.AbstractHessianOutput;
+import com.caucho.hessian.io.AbstractSerializer;
+
+import java.io.IOException;
+import java.lang.reflect.Constructor;
+
+public class Java8TimeSerializer<T> extends AbstractSerializer {
+
+    // Type of handle
+    private Class<T> handleType;
+
+    private Java8TimeSerializer(Class<T> handleType) {
+        this.handleType = handleType;
+    }
+
+    public static <T> Java8TimeSerializer<T> create(Class<T> handleType) {
+        return new Java8TimeSerializer<T>(handleType);
+    }
+
+    @Override
+    public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
+        if (obj == null) {
+            out.writeNull();
+            return;
+        }
+
+        T handle = null;
+        try {
+            Constructor<T> constructor = handleType.getConstructor(Object.class);
+            handle = constructor.newInstance(obj);
+        } catch (Exception e) {
+            throw new RuntimeException("the class :" + handleType.getName() + " construct failed:" + e.getMessage(), e);
+        }
+
+        out.writeObject(handle);
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalDateHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalDateHandle.java
new file mode 100755
index 0000000..f994bc4
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalDateHandle.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+
+public class LocalDateHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = 166018689500019951L;
+
+    private int year;
+    private int month;
+    private int day;
+
+    public LocalDateHandle() {
+    }
+
+    public LocalDateHandle(Object o) {
+        try {
+            LocalDate localDate = (LocalDate) o;
+            this.year = localDate.getYear();
+            this.month = localDate.getMonthValue();
+            this.day = localDate.getDayOfMonth();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    public Object readResolve() {
+        try {
+            return LocalDate.of(year, month, day);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalDateTimeHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalDateTimeHandle.java
new file mode 100755
index 0000000..094ced5
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalDateTimeHandle.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+
+public class LocalDateTimeHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = 7563825215275989361L;
+
+    private LocalDate date;
+    private LocalTime time;
+
+    public LocalDateTimeHandle() {
+    }
+
+    public LocalDateTimeHandle(Object o) {
+        try {
+            LocalDateTime localDateTime = (LocalDateTime) o;
+            date = localDateTime.toLocalDate();
+            time = localDateTime.toLocalTime();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return LocalDateTime.of(date, time);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalTimeHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalTimeHandle.java
new file mode 100755
index 0000000..b0d9619
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/LocalTimeHandle.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+
+public class LocalTimeHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -5892919085390462315L;
+
+    private int hour;
+    private int minute;
+    private int second;
+    private int nano;
+
+    public LocalTimeHandle() {
+    }
+
+    public LocalTimeHandle(Object o) {
+        try {
+            LocalTime localTime = (LocalTime) o;
+            this.hour = localTime.getHour();
+            this.minute = localTime.getMinute();
+            this.second = localTime.getSecond();
+            this.nano = localTime.getNano();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return LocalTime.of(hour, minute, second, nano);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/MonthDayHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/MonthDayHandle.java
new file mode 100755
index 0000000..8c19273
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/MonthDayHandle.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.MonthDay;
+
+public class MonthDayHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = 5288238558666577745L;
+
+    private int month;
+    private int day;
+
+    public MonthDayHandle() {
+    }
+
+    public MonthDayHandle(Object o) {
+        try {
+            MonthDay monthDay = (MonthDay) o;
+            this.month = monthDay.getMonthValue();
+            this.day = monthDay.getDayOfMonth();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return MonthDay.of(month, day);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/OffsetDateTimeHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/OffsetDateTimeHandle.java
new file mode 100755
index 0000000..b785266
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/OffsetDateTimeHandle.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+
+public class OffsetDateTimeHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -7823900532640515312L;
+
+    private LocalDateTime dateTime;
+    private ZoneOffset offset;
+
+    public OffsetDateTimeHandle() {
+    }
+
+    public OffsetDateTimeHandle(Object o) {
+        try {
+            OffsetDateTime offsetDateTime = (OffsetDateTime) o;
+            this.dateTime = offsetDateTime.toLocalDateTime();
+            this.offset = offsetDateTime.getOffset();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return OffsetDateTime.of(dateTime, offset);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/OffsetTimeHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/OffsetTimeHandle.java
new file mode 100755
index 0000000..5a57300
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/OffsetTimeHandle.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.LocalTime;
+import java.time.OffsetTime;
+import java.time.ZoneOffset;
+
+public class OffsetTimeHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -3269846941421652860L;
+
+    private LocalTime localTime;
+    private ZoneOffset zoneOffset;
+
+    public OffsetTimeHandle() {
+    }
+
+    public OffsetTimeHandle(Object o) {
+        try {
+            OffsetTime offsetTime = (OffsetTime) o;
+            this.zoneOffset = offsetTime.getOffset();
+            this.localTime = offsetTime.toLocalTime();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return OffsetTime.of(localTime, zoneOffset);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/PeriodHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/PeriodHandle.java
new file mode 100755
index 0000000..d29b39f
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/PeriodHandle.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.Period;
+
+
+public class PeriodHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = 4399720381283781186L;
+
+    private int years;
+    private int months;
+    private int days;
+
+    public PeriodHandle() {
+    }
+
+    public PeriodHandle(Object o) {
+        try {
+            Period period = (Period) o;
+            this.years = period.getYears();
+            this.months = period.getMonths();
+            this.days = period.getDays();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return Period.of(years, months, days);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/YearHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/YearHandle.java
new file mode 100755
index 0000000..6560c0d
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/YearHandle.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.Year;
+
+public class YearHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -6299552890287487926L;
+
+    private int year;
+
+    public YearHandle() {
+    }
+
+    public YearHandle(Object o) {
+        try {
+            Year y = (Year) o;
+            this.year = y.getValue();
+        } catch (Throwable t) {
+            // ignore
+        }
+
+    }
+
+    private Object readResolve() {
+        try {
+            return Year.of(year);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/YearMonthHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/YearMonthHandle.java
new file mode 100755
index 0000000..5f67c2e
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/YearMonthHandle.java
@@ -0,0 +1,53 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.YearMonth;
+
+public class YearMonthHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -4150786187896925314L;
+
+    private int year;
+    private int month;
+
+    public YearMonthHandle() {
+    }
+
+    public YearMonthHandle(Object o) {
+        try {
+            YearMonth yearMonth = (YearMonth) o;
+            this.year = yearMonth.getYear();
+            this.month = yearMonth.getMonthValue();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return YearMonth.of(year, month);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneIdHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneIdHandle.java
new file mode 100755
index 0000000..f125469
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneIdHandle.java
@@ -0,0 +1,52 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.ZoneId;
+
+public class ZoneIdHandle implements HessianHandle, Serializable {
+
+    private static final long serialVersionUID = 8789182864066905552L;
+
+    private String zoneId;
+
+    public ZoneIdHandle() {
+    }
+
+    public ZoneIdHandle(Object o) {
+        try {
+            ZoneId zoneId = (ZoneId) o;
+            this.zoneId = zoneId.getId();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return ZoneId.of(this.zoneId);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneIdSerializer.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneIdSerializer.java
new file mode 100755
index 0000000..7104670
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneIdSerializer.java
@@ -0,0 +1,43 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.AbstractHessianOutput;
+import com.caucho.hessian.io.AbstractSerializer;
+
+import java.io.IOException;
+
+public class ZoneIdSerializer extends AbstractSerializer {
+
+    private static final ZoneIdSerializer SERIALIZER = new ZoneIdSerializer();
+
+    public static ZoneIdSerializer getInstance() {
+        return SERIALIZER;
+    }
+
+    @Override
+    public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
+        if (obj == null) {
+            out.writeNull();
+        } else {
+            out.writeObject(new ZoneIdHandle(obj));
+        }
+    }
+
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneOffsetHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneOffsetHandle.java
new file mode 100755
index 0000000..f7e622a
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZoneOffsetHandle.java
@@ -0,0 +1,51 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.ZoneOffset;
+
+public class ZoneOffsetHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = 8841589723587858789L;
+
+    private int seconds;
+
+    public ZoneOffsetHandle() {
+    }
+
+    public ZoneOffsetHandle(Object o) {
+        try {
+            ZoneOffset zoneOffset = (ZoneOffset) o;
+            this.seconds = zoneOffset.getTotalSeconds();
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return ZoneOffset.ofTotalSeconds(seconds);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZonedDateTimeHandle.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZonedDateTimeHandle.java
new file mode 100755
index 0000000..44b3ff5
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/java/org/apache/dubbo/serialize/hessian/serializer/java8/ZonedDateTimeHandle.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian.serializer.java8;
+
+
+import com.caucho.hessian.io.HessianHandle;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+
+public class ZonedDateTimeHandle implements HessianHandle, Serializable {
+    private static final long serialVersionUID = -6933460123278647569L;
+
+    private LocalDateTime dateTime;
+    private ZoneOffset offset;
+    private String zoneId;
+
+
+    public ZonedDateTimeHandle() {
+    }
+
+    public ZonedDateTimeHandle(Object o) {
+        try {
+            ZonedDateTime zonedDateTime = (ZonedDateTime) o;
+            this.dateTime = zonedDateTime.toLocalDateTime();
+            this.offset = zonedDateTime.getOffset();
+            ZoneId zone = zonedDateTime.getZone();
+            if (zone != null) {
+                this.zoneId = zone.getId();
+            }
+        } catch (Throwable t) {
+            // ignore
+        }
+    }
+
+    private Object readResolve() {
+        try {
+            return ZonedDateTime.ofLocal(dateTime, ZoneId.of(zoneId), offset);
+        } catch (Throwable t) {
+            // ignore
+        }
+        return null;
+    }
+}
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
new file mode 100644
index 0000000..ad66016
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.common.serialize.Serialization
@@ -0,0 +1 @@
+native-hessian=org.apache.dubbo.serialize.hessian.Hessian2Serialization
\ No newline at end of file
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer
new file mode 100644
index 0000000..114d43e
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/main/resources/META-INF/dubbo/internal/org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer
@@ -0,0 +1,2 @@
+default=org.apache.dubbo.serialize.hessian.dubbo.DefaultHessian2FactoryInitializer
+whitelist=org.apache.dubbo.serialize.hessian.dubbo.WhitelistHessian2FactoryInitializer
\ No newline at end of file
diff --git a/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/test/java/org/apache/dubbo/serialize/hessian/Java8TimeSerializerTest.java b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/test/java/org/apache/dubbo/serialize/hessian/Java8TimeSerializerTest.java
new file mode 100644
index 0000000..e73ba52
--- /dev/null
+++ b/dubbo-serialization-extensions/dubbo-serialization-native-hession/src/test/java/org/apache/dubbo/serialize/hessian/Java8TimeSerializerTest.java
@@ -0,0 +1,152 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.
+ */
+
+package org.apache.dubbo.serialize.hessian;
+
+import org.apache.dubbo.serialize.hessian.dubbo.Hessian2FactoryInitializer;
+
+import com.caucho.hessian.io.Hessian2Input;
+import com.caucho.hessian.io.Hessian2Output;
+import com.caucho.hessian.io.SerializerFactory;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.time.Duration;
+import java.time.Instant;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.MonthDay;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
+import java.time.Period;
+import java.time.Year;
+import java.time.YearMonth;
+import java.time.ZoneId;
+import java.time.ZoneOffset;
+import java.time.ZonedDateTime;
+import java.util.Calendar;
+
+/**
+ * Test Java8TimeSerializer class
+ */
+public class Java8TimeSerializerTest {
+
+    private static SerializerFactory factory = Hessian2FactoryInitializer.getInstance().getSerializerFactory();
+    private static ByteArrayOutputStream os = new ByteArrayOutputStream();
+
+    @Test
+    public void testNull() throws IOException {
+        testJava8Time(null);
+    }
+
+    @Test
+    public void testInstant() throws Exception {
+        Instant.now();
+        testJava8Time(Instant.now());
+    }
+
+    @Test
+    public void testDuration() throws Exception {
+        testJava8Time(Duration.ofDays(2));
+    }
+
+    @Test
+    public void testLocalDate() throws Exception {
+        testJava8Time(LocalDate.now());
+    }
+
+    @Test
+    public void testLocalDateTime() throws Exception {
+        testJava8Time(LocalDateTime.now());
+    }
+
+    @Test
+    public void testLocalTime() throws Exception {
+        testJava8Time(LocalTime.now());
+    }
+
+    @Test
+    public void testYear() throws Exception {
+        testJava8Time(Year.now());
+    }
+
+    @Test
+    public void testYearMonth() throws Exception {
+        testJava8Time(YearMonth.now());
+    }
+
+    @Test
+    public void testMonthDay() throws Exception {
+        testJava8Time(MonthDay.now());
+    }
+
+    @Test
+    public void testPeriod() throws Exception {
+        testJava8Time(Period.ofDays(3));
+    }
+
+    @Test
+    public void testOffsetTime() throws Exception {
+        testJava8Time(OffsetTime.now());
+    }
+
+    @Test
+    public void testZoneOffset() throws Exception {
+        testJava8Time(ZoneOffset.ofHours(8));
+    }
+
+    @Test
+    public void testOffsetDateTime() throws Throwable {
+        testJava8Time(OffsetDateTime.now());
+    }
+
+    @Test
+    public void testZonedDateTime() throws Exception {
+        testJava8Time(ZonedDateTime.now());
+    }
+
+    @Test
+    public void testZoneId() throws Exception {
+        testJava8Time(ZoneId.of("America/New_York"));
+    }
+
+
+    @Test
+    public void testCalendar() throws IOException {
+        testJava8Time(Calendar.getInstance());
+    }
+
+    private void testJava8Time(Object expected) throws IOException {
+        os.reset();
+
+        Hessian2Output output = new Hessian2Output(os);
+        output.setSerializerFactory(factory);
+        output.writeObject(expected);
+        output.flush();
+
+        ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray());
+        Hessian2Input input = new Hessian2Input(is);
+        input.setSerializerFactory(factory);
+        Object actual = input.readObject();
+
+        Assertions.assertEquals(expected, actual);
+    }
+}
diff --git a/dubbo-serialization-extensions/pom.xml b/dubbo-serialization-extensions/pom.xml
index 9c551be..2367e62 100644
--- a/dubbo-serialization-extensions/pom.xml
+++ b/dubbo-serialization-extensions/pom.xml
@@ -37,6 +37,8 @@
         <module>dubbo-serialization-fst</module>
         <module>dubbo-serialization-fastjson</module>
         <module>dubbo-serialization-avro</module>
+        <module>dubbo-serialization-msgpack</module>
+        <module>dubbo-serialization-native-hession</module>
         <module>dubbo-serialization-test</module>
     </modules>
 </project>