You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by li...@apache.org on 2018/11/06 09:19:58 UTC

[incubator-dubbo] branch dev-metadata updated: Merge pull request #2744, metadata unit test and generic test, refactor zk store.

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

liujun pushed a commit to branch dev-metadata
in repository https://gitbox.apache.org/repos/asf/incubator-dubbo.git


The following commit(s) were added to refs/heads/dev-metadata by this push:
     new 072b51e  Merge pull request #2744, metadata unit test and generic test, refactor zk store.
072b51e is described below

commit 072b51e0bafc0443731de0767867ac3d5f9498e8
Author: cvictory <sh...@gmail.com>
AuthorDate: Tue Nov 6 17:19:53 2018 +0800

    Merge pull request #2744, metadata unit test and generic test, refactor zk store.
---
 dubbo-compatible/pom.xml                           |   7 +-
 .../apache/dubbo/generic/GenericServiceTest.java   | 181 ++++++++++++-
 .../org/apache/dubbo/service/ComplexObject.java    | 282 +++++++++++++++++++++
 .../java/org/apache/dubbo/service/DemoService.java |   8 +-
 .../org/apache/dubbo/service/DemoServiceImpl.java  |  15 +-
 .../dubbo/config/AbstractInterfaceConfig.java      |   2 +-
 .../META-INF/spring/dubbo-demo-consumer.xml        |   3 +-
 .../META-INF/spring/dubbo-demo-provider.xml        |   2 +-
 .../definition/builder/CollectionTypeBuilder.java  |   3 +-
 .../definition/model/FullServiceDefinition.java    |   8 +
 .../definition/model/MethodDefinition.java         |  18 ++
 .../definition/model/ServiceDefinition.java        |  16 ++
 .../metadata/definition/model/TypeDefinition.java  |  18 ++
 .../dubbo/metadata/definition/util/ClassUtils.java |   4 +-
 .../definition/ServiceDefinitionBuildderTest.java  |  81 ++++++
 .../common/ResultWithRawCollections.java           |   2 +-
 .../metadata/definition/service/ComplexObject.java | 280 ++++++++++++++++++++
 .../metadata/definition/service/DemoService.java}  |  18 +-
 .../dubbo-metadata-report-api/pom.xml              |   9 +-
 .../identifier/ConsumerMetadataIdentifier.java     |   4 +-
 .../metadata/identifier/MetadataIdentifier.java    |   5 +-
 .../identifier/ProviderMetadataIdentifier.java     |   2 +-
 .../integration/MetadataReportService.java         |   1 +
 .../dubbo/metadata/metadata/MethodDescriptor.java  |  54 ----
 .../dubbo/metadata/metadata/ServiceDescriptor.java |  55 ----
 .../dubbo/metadata/metadata/TypeDescriptor.java    |  65 -----
 .../metadata/builder/ArrayTypeBuilder.java         |  36 ---
 .../metadata/builder/CollectionTypeBuilder.java    |  59 -----
 .../metadata/builder/DefaultTypeBuilder.java       | 113 ---------
 .../metadata/metadata/builder/EnumTypeBuilder.java |  45 ----
 .../metadata/metadata/builder/MapTypeBuilder.java  |  60 -----
 .../metadata/builder/ServiceDescriptorBuilder.java |  71 ------
 .../metadata/metadata/builder/TypeBuilder.java     |  23 --
 .../metadata/builder/TypeDescriptorBuilder.java    |  63 -----
 .../metadata/support/AbstractMetadataReport.java   |  13 +-
 .../metadata/integration/RetryTestService.java     |   2 +-
 .../metadata/builder/ArrayTypeBuilderTest.java     |  89 -------
 .../builder/CollectionTypeBuilderTest.java         |  90 -------
 .../metadata/metadata/builder/ComplexEnum.java     |  16 --
 .../metadata/metadata/builder/ComplexObject.java   |  37 ---
 .../metadata/builder/DefaultTypeBuilderTest.java   |  64 -----
 .../metadata/builder/EnumTypeBuilderTest.java      |  84 ------
 .../metadata/builder/MapTypeBuilderTest.java       |  89 -------
 .../builder/ServiceDescriptorBuilderTest.java      |  25 --
 .../metadata/metadata/builder/SingleEnum.java      |   8 -
 .../metadata/metadata/builder/TestService.java     |  45 ----
 .../builder/TypeDescriptorBuilderTest.java         | 101 --------
 .../store/test/JTestMetadataReport4Test.java       |   3 +-
 .../support/AbstractMetadataReportFactoryTest.java |   1 -
 .../support/AbstractMetadataReportTest.java        |  11 +-
 .../store/zookeeper/ZookeeperMetadataReport.java   |  10 +-
 .../zookeeper/ZookeeperMetadataReportTest.java     |  32 +--
 .../java/org/apache/dubbo/registry/ZKTools.java    |   4 +-
 .../dubbo/remoting/zookeeper/ZookeeperClient.java  |   4 +
 .../zookeeper/curator/CuratorZookeeperClient.java  |  40 +++
 .../zookeeper/support/AbstractZookeeperClient.java |  28 ++
 .../zookeeper/zkclient/ZkClientWrapper.java        |  15 ++
 .../zkclient/ZkclientZookeeperClient.java          |  25 ++
 .../curator/CuratorZookeeperClientTest.java        |  30 ++-
 .../zkclient/ZkclientZookeeperClientTest.java      |  30 ++-
 .../webservice/WebserviceProtocolTest.java         |   4 +-
 61 files changed, 1144 insertions(+), 1369 deletions(-)

diff --git a/dubbo-compatible/pom.xml b/dubbo-compatible/pom.xml
index 1da947f..95be710 100644
--- a/dubbo-compatible/pom.xml
+++ b/dubbo-compatible/pom.xml
@@ -79,5 +79,10 @@
             <version>${project.parent.version}</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
-</project>
\ No newline at end of file
+</project>
diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java b/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java
index 9bc4cdc..c18334a 100644
--- a/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java
+++ b/dubbo-compatible/src/test/java/org/apache/dubbo/generic/GenericServiceTest.java
@@ -17,20 +17,32 @@
 
 package org.apache.dubbo.generic;
 
-import com.alibaba.dubbo.rpc.service.GenericService;
 
+import com.alibaba.fastjson.JSON;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.extension.ExtensionLoader;
-import org.apache.dubbo.service.DemoService;
-import org.apache.dubbo.service.DemoServiceImpl;
+import org.apache.dubbo.metadata.definition.ServiceDefinitionBuilder;
+import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
+import org.apache.dubbo.metadata.definition.model.MethodDefinition;
+import org.apache.dubbo.metadata.definition.model.TypeDefinition;
 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.service.GenericService;
+import org.apache.dubbo.service.ComplexObject;
+import org.apache.dubbo.service.DemoService;
+import org.apache.dubbo.service.DemoServiceImpl;
 import org.junit.Assert;
 import org.junit.Test;
 
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
 public class GenericServiceTest {
 
     @Test
@@ -75,4 +87,165 @@ public class GenericServiceTest {
         invoker.destroy();
         exporter.unexport();
     }
+
+    @Test
+    public void testGenericComplexCompute4FullServiceMetadata() {
+        DemoService server = new DemoServiceImpl();
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        URL url = URL.valueOf("dubbo://127.0.0.1:5342/" + DemoService.class.getName() + "?version=1.0.0&generic=true$timeout=3000");
+        Exporter<DemoService> exporter = protocol.export(proxyFactory.getInvoker(server, DemoService.class, url));
+
+
+        String var1 = "v1";
+        int var2 = 234;
+        long l = 555;
+        String[] var3 = {"var31", "var32"};
+        List<Integer> var4 = Arrays.asList(2, 4, 8);
+        ComplexObject.TestEnum testEnum = ComplexObject.TestEnum.VALUE2;
+
+        FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(DemoService.class);
+        MethodDefinition methodDefinition = getMethod("complexCompute", fullServiceDefinition.getMethods());
+        Map parm2= createComplextObject(fullServiceDefinition,var1, var2, l, var3, var4, testEnum);
+        ComplexObject complexObject = map2bean(parm2);
+
+        Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+
+
+        GenericService client = proxyFactory.getProxy(invoker, true);
+        Object result = client.$invoke(methodDefinition.getName(), methodDefinition.getParameterTypes(), new Object[]{"haha", parm2});
+        Assert.assertEquals("haha###" + complexObject.toString(), result);
+
+
+        Invoker<DemoService> invoker2 = protocol.refer(DemoService.class, url);
+        GenericService client2 = (GenericService) proxyFactory.getProxy(invoker2, true);
+        Object result2 = client2.$invoke("complexCompute", methodDefinition.getParameterTypes(), new Object[]{"haha2", parm2});
+        Assert.assertEquals("haha2###" + complexObject.toString(), result2);
+
+        invoker.destroy();
+        exporter.unexport();
+    }
+
+    @Test
+    public void testGenericFindComplexObject4FullServiceMetadata() {
+        DemoService server = new DemoServiceImpl();
+        ProxyFactory proxyFactory = ExtensionLoader.getExtensionLoader(ProxyFactory.class).getAdaptiveExtension();
+        Protocol protocol = ExtensionLoader.getExtensionLoader(Protocol.class).getAdaptiveExtension();
+        URL url = URL.valueOf("dubbo://127.0.0.1:5342/" + DemoService.class.getName() + "?version=1.0.0&generic=true$timeout=3000");
+        Exporter<DemoService> exporter = protocol.export(proxyFactory.getInvoker(server, DemoService.class, url));
+
+
+        String var1 = "v1";
+        int var2 = 234;
+        long l = 555;
+        String[] var3 = {"var31", "var32"};
+        List<Integer> var4 = Arrays.asList(2, 4, 8);
+        ComplexObject.TestEnum testEnum = ComplexObject.TestEnum.VALUE2;
+        //ComplexObject complexObject = createComplexObject(var1, var2, l, var3, var4, testEnum);
+
+        Invoker<GenericService> invoker = protocol.refer(GenericService.class, url);
+
+        GenericService client = proxyFactory.getProxy(invoker, true);
+        Object result = client.$invoke("findComplexObject", new String[]{"java.lang.String", "int", "long", "java.lang.String[]", "java.util.List", "org.apache.dubbo.service.ComplexObject$TestEnum"},
+                new Object[]{var1, var2, l, var3, var4, testEnum});
+        Assert.assertNotNull(result);
+        ComplexObject r = map2bean((Map) result);
+        Assert.assertEquals(r, createComplexObject(var1, var2, l, var3, var4, testEnum));
+
+        invoker.destroy();
+        exporter.unexport();
+    }
+
+    MethodDefinition getMethod(String methodName, List<MethodDefinition> list) {
+        for (MethodDefinition methodDefinition : list) {
+            if (methodDefinition.getName().equals(methodName)) {
+                return methodDefinition;
+            }
+        }
+        return null;
+    }
+
+    Map<String, Object> createComplextObject(FullServiceDefinition fullServiceDefinition, String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum) {
+        List<TypeDefinition> typeDefinitions = fullServiceDefinition.getTypes();
+        TypeDefinition topTypeDefinition = null;
+        TypeDefinition innerTypeDefinition = null;
+        TypeDefinition inner2TypeDefinition = null;
+        TypeDefinition inner3TypeDefinition = null;
+        for (TypeDefinition typeDefinition : typeDefinitions) {
+            if (typeDefinition.getType().equals(ComplexObject.class.getName())) {
+                topTypeDefinition = typeDefinition;
+            } else if (typeDefinition.getType().equals(ComplexObject.InnerObject.class.getName())) {
+                innerTypeDefinition = typeDefinition;
+            } else if (typeDefinition.getType().contains(ComplexObject.InnerObject2.class.getName())) {
+                inner2TypeDefinition = typeDefinition;
+            } else if (typeDefinition.getType().equals(ComplexObject.InnerObject3.class.getName())) {
+                inner3TypeDefinition = typeDefinition;
+            }
+        }
+        Assert.assertEquals(topTypeDefinition.getProperties().get("v").getType(), "long");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("maps").getType(), "java.util.Map<java.lang.String, java.lang.String>");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("innerObject").getType(), "org.apache.dubbo.service.ComplexObject$InnerObject");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("intList").getType(), "java.util.List<java.lang.Integer>");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("strArrays").getType(), "java.lang.String[]");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("innerObject3").getType(), "org.apache.dubbo.service.ComplexObject.InnerObject3[]");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("testEnum").getType(), "org.apache.dubbo.service.ComplexObject.TestEnum");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("innerObject2").getType(), "java.util.Set<org.apache.dubbo.service.ComplexObject$InnerObject2>");
+
+        Assert.assertSame(innerTypeDefinition.getProperties().get("innerA").getType(), "java.lang.String");
+        Assert.assertSame(innerTypeDefinition.getProperties().get("innerB").getType(), "int");
+
+        Assert.assertSame(inner2TypeDefinition.getProperties().get("innerA2").getType(), "java.lang.String");
+        Assert.assertSame(inner2TypeDefinition.getProperties().get("innerB2").getType(), "int");
+
+        Assert.assertSame(inner3TypeDefinition.getProperties().get("innerA3").getType(), "java.lang.String");
+
+        Map<String, Object> result = new HashMap<>();
+        result.put("v", l);
+        Map maps = new HashMap<>(4);
+        maps.put(var1 + "_k1", var1 + "_v1");
+        maps.put(var1 + "_k2", var1 + "_v2");
+        result.put("maps", maps);
+        result.put("intList", var4);
+        result.put("strArrays", var3);
+        result.put("testEnum", testEnum.name());
+
+        Map innerObjectMap = new HashMap<>(4);
+        result.put("innerObject", innerObjectMap);
+        innerObjectMap.put("innerA", var1);
+        innerObjectMap.put("innerB", var2);
+
+        Set<Map> innerObject2Set = new HashSet<>(4);
+        result.put("innerObject2", innerObject2Set);
+        Map innerObject2Tmp1 = new HashMap<>(4);
+        innerObject2Tmp1.put("innerA2", var1 + "_21");
+        innerObject2Tmp1.put("innerB2", var2 + 100000);
+        Map innerObject2Tmp2 = new HashMap<>(4);
+        innerObject2Tmp2.put("innerA2", var1 + "_22");
+        innerObject2Tmp2.put("innerB2", var2 + 200000);
+        innerObject2Set.add(innerObject2Tmp1);
+        innerObject2Set.add(innerObject2Tmp2);
+
+        Map innerObject3Tmp1 = new HashMap<>(4);
+        innerObject3Tmp1.put("innerA3", var1 + "_31");
+        Map innerObject3Tmp2 = new HashMap<>(4);
+        innerObject3Tmp2.put("innerA3", var1 + "_32");
+        Map innerObject3Tmp3 = new HashMap<>(4);
+        innerObject3Tmp3.put("innerA3", var1 + "_32");
+        result.put("innerObject3", new Map[]{innerObject3Tmp1, innerObject3Tmp2, innerObject3Tmp3});
+
+        return result;
+    }
+
+    Map<String, Object> bean2Map(ComplexObject complexObject) {
+        return JSON.parseObject(JSON.toJSONString(complexObject), Map.class);
+    }
+
+    ComplexObject map2bean(Map<String, Object> map) {
+        return JSON.parseObject(JSON.toJSONString(map), ComplexObject.class);
+    }
+
+    ComplexObject createComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum) {
+        return new ComplexObject(var1, var2, l, var3, var4, testEnum);
+    }
+
 }
diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/service/ComplexObject.java b/dubbo-compatible/src/test/java/org/apache/dubbo/service/ComplexObject.java
new file mode 100644
index 0000000..5bcc9f6
--- /dev/null
+++ b/dubbo-compatible/src/test/java/org/apache/dubbo/service/ComplexObject.java
@@ -0,0 +1,282 @@
+package org.apache.dubbo.service;
+
+import net.sf.cglib.beans.BeanMap;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * ON 2018/11/5
+ */
+public class ComplexObject {
+
+    public ComplexObject() {
+    }
+
+    public ComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum) {
+        this.setInnerObject(new ComplexObject.InnerObject());
+        this.getInnerObject().setInnerA(var1);
+        this.getInnerObject().setInnerB(var2);
+        this.setIntList(var4);
+        this.setStrArrays(var3);
+        this.setTestEnum(testEnum);
+        this.setV(l);
+        InnerObject2 io21 = new InnerObject2();
+        io21.setInnerA2(var1 + "_21");
+        io21.setInnerB2(var2 + 100000);
+        InnerObject2 io22 = new InnerObject2();
+        io22.setInnerA2(var1 + "_22");
+        io22.setInnerB2(var2 + 200000);
+        this.setInnerObject2(new HashSet<InnerObject2>(Arrays.asList(io21, io22)));
+
+        InnerObject3 io31 = new InnerObject3();
+        io31.setInnerA3(var1 + "_31");
+        InnerObject3 io32 = new InnerObject3();
+        io32.setInnerA3(var1 + "_32");
+        InnerObject3 io33 = new InnerObject3();
+        io33.setInnerA3(var1 + "_33");
+        this.setInnerObject3(new InnerObject3[]{io31, io32, io33});
+        this.maps = new HashMap<>(4);
+        this.maps.put(var1 + "_k1", var1 + "_v1");
+        this.maps.put(var1 + "_k2", var1 + "_v2");
+    }
+
+    private InnerObject innerObject;
+    private Set<InnerObject2> innerObject2;
+    private InnerObject3[] innerObject3;
+    private String[] strArrays;
+    private List<Integer> intList;
+    private long v;
+    private TestEnum testEnum;
+    private Map<String, String> maps;
+
+    public InnerObject getInnerObject() {
+        return innerObject;
+    }
+
+    public void setInnerObject(InnerObject innerObject) {
+        this.innerObject = innerObject;
+    }
+
+    public String[] getStrArrays() {
+        return strArrays;
+    }
+
+    public void setStrArrays(String[] strArrays) {
+        this.strArrays = strArrays;
+    }
+
+    public List<Integer> getIntList() {
+        return intList;
+    }
+
+    public void setIntList(List<Integer> intList) {
+        this.intList = intList;
+    }
+
+    public long getV() {
+        return v;
+    }
+
+    public void setV(long v) {
+        this.v = v;
+    }
+
+    public TestEnum getTestEnum() {
+        return testEnum;
+    }
+
+    public void setTestEnum(TestEnum testEnum) {
+        this.testEnum = testEnum;
+    }
+
+    public Set<InnerObject2> getInnerObject2() {
+        return innerObject2;
+    }
+
+    public void setInnerObject2(Set<InnerObject2> innerObject2) {
+        this.innerObject2 = innerObject2;
+    }
+
+    public InnerObject3[] getInnerObject3() {
+        return innerObject3;
+    }
+
+    public void setInnerObject3(InnerObject3[] innerObject3) {
+        this.innerObject3 = innerObject3;
+    }
+
+    public Map<String, String> getMaps() {
+        return maps;
+    }
+
+    public void setMaps(Map<String, String> maps) {
+        this.maps = maps;
+    }
+
+    @Override
+    public String toString() {
+        return "ComplexObject{" +
+                "innerObject=" + innerObject +
+                ", innerObject2=" + innerObject2 +
+                ", innerObject3=" + Arrays.toString(innerObject3) +
+                ", strArrays=" + Arrays.toString(strArrays) +
+                ", intList=" + intList +
+                ", v=" + v +
+                ", testEnum=" + testEnum +
+                ", maps=" + maps +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ComplexObject)) return false;
+        ComplexObject that = (ComplexObject) o;
+        return getV() == that.getV() &&
+                Objects.equals(getInnerObject(), that.getInnerObject()) &&
+                Objects.equals(getInnerObject2(), that.getInnerObject2()) &&
+                Arrays.equals(getInnerObject3(), that.getInnerObject3()) &&
+                Arrays.equals(getStrArrays(), that.getStrArrays()) &&
+                Objects.equals(getIntList(), that.getIntList()) &&
+                getTestEnum() == that.getTestEnum() &&
+                Objects.equals(getMaps(), that.getMaps());
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(getInnerObject(), getInnerObject2(), getIntList(), getV(), getTestEnum(), getMaps());
+        result = 31 * result + Arrays.hashCode(getInnerObject3());
+        result = 31 * result + Arrays.hashCode(getStrArrays());
+        return result;
+    }
+
+    static public enum TestEnum {
+        VALUE1, VALUE2
+    }
+
+    static public class InnerObject {
+        String innerA;
+        int innerB;
+
+        public String getInnerA() {
+            return innerA;
+        }
+
+        public void setInnerA(String innerA) {
+            this.innerA = innerA;
+        }
+
+        public int getInnerB() {
+            return innerB;
+        }
+
+        public void setInnerB(int innerB) {
+            this.innerB = innerB;
+        }
+
+        @Override
+        public String toString() {
+            return "InnerObject{" +
+                    "innerA='" + innerA + '\'' +
+                    ", innerB=" + innerB +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof InnerObject)) return false;
+            InnerObject that = (InnerObject) o;
+            return getInnerB() == that.getInnerB() &&
+                    Objects.equals(getInnerA(), that.getInnerA());
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(getInnerA(), getInnerB());
+        }
+    }
+
+    static public class InnerObject2 {
+        String innerA2;
+        int innerB2;
+
+        public String getInnerA2() {
+            return innerA2;
+        }
+
+        public void setInnerA2(String innerA) {
+            this.innerA2 = innerA2;
+        }
+
+        public int getInnerB2() {
+            return innerB2;
+        }
+
+        public void setInnerB2(int innerB) {
+            this.innerB2 = innerB2;
+        }
+
+        @Override
+        public String toString() {
+            return "InnerObject{" +
+                    "innerA='" + innerA2 + '\'' +
+                    ", innerB=" + innerB2 +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof InnerObject2)) return false;
+            InnerObject2 that = (InnerObject2) o;
+            return getInnerB2() == that.getInnerB2() &&
+                    Objects.equals(getInnerA2(), that.getInnerA2());
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(getInnerA2(), getInnerB2());
+        }
+    }
+
+    static public class InnerObject3 {
+        String innerA3;
+
+        public String getInnerA3() {
+            return innerA3;
+        }
+
+        public void setInnerA3(String innerA3) {
+            this.innerA3 = innerA3;
+        }
+
+        @Override
+        public String toString() {
+            return "InnerObject3{" +
+                    "innerA3='" + innerA3 + '\'' +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof InnerObject3)) return false;
+            InnerObject3 that = (InnerObject3) o;
+            return Objects.equals(getInnerA3(), that.getInnerA3());
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(getInnerA3());
+        }
+    }
+}
+
+
diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoService.java b/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoService.java
index b73fa49..ba63c59 100644
--- a/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoService.java
+++ b/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoService.java
@@ -16,6 +16,8 @@
  */
 package org.apache.dubbo.service;
 
+import java.util.List;
+
 public interface DemoService {
     String sayHello(String name);
 
@@ -39,4 +41,8 @@ public interface DemoService {
 
     byte getbyte(byte arg);
 
-}
\ No newline at end of file
+    String complexCompute(String input, ComplexObject co);
+
+    ComplexObject findComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum);
+
+}
diff --git a/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoServiceImpl.java b/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoServiceImpl.java
index cfbcf80..fb508c6 100644
--- a/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoServiceImpl.java
+++ b/dubbo-compatible/src/test/java/org/apache/dubbo/service/DemoServiceImpl.java
@@ -18,6 +18,8 @@ package org.apache.dubbo.service;
 
 import org.apache.dubbo.rpc.RpcContext;
 
+import java.util.List;
+
 /**
  * DemoServiceImpl
  */
@@ -78,7 +80,18 @@ public class DemoServiceImpl implements DemoService {
         return arg;
     }
 
+    @Override
+    public String complexCompute(String input, ComplexObject co) {
+        return input + "###" + co.toString();
+    }
+
+    @Override
+    public ComplexObject findComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum) {
+
+        return new ComplexObject(var1, var2, l, var3, var4, testEnum);
+    }
+
     public Person gerPerson(Person person) {
         return person;
     }
-}
\ No newline at end of file
+}
diff --git a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
index 73fe79d..6e41fe6 100644
--- a/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
+++ b/dubbo-config/dubbo-config-api/src/main/java/org/apache/dubbo/config/AbstractInterfaceConfig.java
@@ -183,7 +183,7 @@ public abstract class AbstractInterfaceConfig extends AbstractMethodConfig {
         }
         metadataReportConfig.refresh();
         if (!metadataReportConfig.isValid()) {
-            logger.info("There's no valid metadata config found, if you are using the simplified mode of registry url, please make sure you have a metadata address configured properly.");
+            logger.warn("There's no valid metadata config found, if you are using the simplified mode of registry url, please make sure you have a metadata address configured properly.");
         }
     }
 
diff --git a/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml b/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml
index 4f2f7cc..241e605 100644
--- a/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml
+++ b/dubbo-demo/dubbo-demo-consumer/src/main/resources/META-INF/spring/dubbo-demo-consumer.xml
@@ -24,6 +24,7 @@
     <dubbo:application name="demo-consumer"/>
 
     <!-- use multicast registry center to discover service -->
+
     <dubbo:registry group="dubboregistrygroup1" address="zookeeper://127.0.0.1:2181"/>
 
     <dubbo:configcenter type="zookeeper" address="127.0.0.1:2181" namespace="dubboregistrygroup1"
@@ -31,6 +32,6 @@
 
     <!-- generate proxy for the remote service, then demoService can be used in the same way as the
     local regular interface -->
-    <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>
+    <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService" version="1.0.4" group="dd-test"/>
 
 </beans>
diff --git a/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml b/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml
index 89d24b0..7af535e 100644
--- a/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml
+++ b/dubbo-demo/dubbo-demo-provider/src/main/resources/META-INF/spring/dubbo-demo-provider.xml
@@ -38,6 +38,6 @@
     <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>
 
     <!-- declare the service interface to be exported -->
-    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>
+    <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" version="1.0.4" group="dd-test"/>
 
 </beans>
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
index 0f0efde..917c00d 100755
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/builder/CollectionTypeBuilder.java
@@ -28,7 +28,8 @@ import java.util.Map;
 /**
  * 2015/1/27.
  */
-public class CollectionTypeBuilder implements TypeBuilder {
+public class
+CollectionTypeBuilder implements TypeBuilder {
 
     @Override
     public boolean accept(Type type, Class<?> clazz) {
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
index bbec7b5..4d6c98f 100644
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
@@ -17,6 +17,7 @@
 package org.apache.dubbo.metadata.definition.model;
 
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 2018/10/25
@@ -33,4 +34,11 @@ public class FullServiceDefinition extends ServiceDefinition {
         this.parameters = parameters;
     }
 
+    @Override
+    public String toString() {
+        return "FullServiceDefinition{" +
+                "parameters=" + parameters +
+                "} " + super.toString();
+    }
+
 }
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
index fe9e054..c1e1548 100755
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/MethodDefinition.java
@@ -19,6 +19,7 @@ package org.apache.dubbo.metadata.definition.model;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 2015/1/27.
@@ -71,4 +72,21 @@ public class MethodDefinition {
                 + ", returnType=" + returnType + "]";
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof MethodDefinition)) return false;
+        MethodDefinition that = (MethodDefinition) o;
+        return Objects.equals(getName(), that.getName()) &&
+                Arrays.equals(getParameterTypes(), that.getParameterTypes()) &&
+                Objects.equals(getReturnType(), that.getReturnType()) &&
+                Objects.equals(getParameters(), that.getParameters());
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(getName(), getReturnType(), getParameters());
+        result = 31 * result + Arrays.hashCode(getParameterTypes());
+        return result;
+    }
 }
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
index af60f43..f94e4d5 100755
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/ServiceDefinition.java
@@ -18,6 +18,7 @@ package org.apache.dubbo.metadata.definition.model;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 2015/1/27.
@@ -77,4 +78,19 @@ public class ServiceDefinition {
                 + methods + "]";
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ServiceDefinition)) return false;
+        ServiceDefinition that = (ServiceDefinition) o;
+        return Objects.equals(getCanonicalName(), that.getCanonicalName()) &&
+                Objects.equals(getCodeSource(), that.getCodeSource()) &&
+                Objects.equals(getMethods(), that.getMethods()) &&
+                Objects.equals(getTypes(), that.getTypes());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getCanonicalName(), getCodeSource(), getMethods(), getTypes());
+    }
 }
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
index 8d1c582..f4cc145 100755
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/TypeDefinition.java
@@ -22,6 +22,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 
 /**
  * 2015/1/27.
@@ -103,4 +104,21 @@ public class TypeDefinition {
         return "TypeDefinition [id=" + id + ", type=" + type + ", properties=" + properties + ", $ref=" + $ref + "]";
     }
 
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof TypeDefinition)) return false;
+        TypeDefinition that = (TypeDefinition) o;
+        return Objects.equals(getId(), that.getId()) &&
+                Objects.equals(getType(), that.getType()) &&
+                Objects.equals(getItems(), that.getItems()) &&
+                Objects.equals(getEnums(), that.getEnums()) &&
+                Objects.equals(get$ref(), that.get$ref()) &&
+                Objects.equals(getProperties(), that.getProperties());
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(getId(), getType(), getItems(), getEnums(), get$ref(), getProperties());
+    }
 }
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
index 54fc655..3257de5 100755
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/util/ClassUtils.java
@@ -33,7 +33,7 @@ public final class ClassUtils {
     /**
      * Get the code source file or class path of the Class passed in.
      *
-     * @param clazz Class to find.
+     * @param clazz
      * @return Jar file name or class path.
      */
     public static String getCodeSource(Class<?> clazz) {
@@ -58,6 +58,7 @@ public final class ClassUtils {
 
     /**
      * Get all non-static fields of the Class passed in or its super classes.
+     * <p>
      *
      * @param clazz Class to parse.
      * @return field list
@@ -87,6 +88,7 @@ public final class ClassUtils {
 
     /**
      * Get all public, non-static methods of the Class passed in.
+     * <p>
      *
      * @param clazz Class to parse.
      * @return methods list
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuildderTest.java b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuildderTest.java
new file mode 100644
index 0000000..fb6ff67
--- /dev/null
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/ServiceDefinitionBuildderTest.java
@@ -0,0 +1,81 @@
+package org.apache.dubbo.metadata.definition;
+
+import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
+import org.apache.dubbo.metadata.definition.model.MethodDefinition;
+import org.apache.dubbo.metadata.definition.model.TypeDefinition;
+import org.apache.dubbo.metadata.definition.service.ComplexObject;
+import org.apache.dubbo.metadata.definition.service.DemoService;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 2018/11/6
+ */
+public class ServiceDefinitionBuildderTest {
+
+    @Test
+    public void testBuilderComplextObject() {
+        FullServiceDefinition fullServiceDefinition = ServiceDefinitionBuilder.buildFullDefinition(DemoService.class);
+        checkComplextObjectAsParam(fullServiceDefinition);
+    }
+
+
+    void checkComplextObjectAsParam(FullServiceDefinition fullServiceDefinition) {
+        List<MethodDefinition> methodDefinitions = fullServiceDefinition.getMethods();
+        MethodDefinition complexCompute = null;
+        MethodDefinition findComplexObject = null;
+        for (MethodDefinition methodDefinition : methodDefinitions) {
+            if ("complexCompute".equals(methodDefinition.getName())) {
+                complexCompute = methodDefinition;
+            } else if ("findComplexObject".equals(methodDefinition.getName())) {
+                findComplexObject = methodDefinition;
+            }
+        }
+        Assert.assertTrue(Arrays.equals(complexCompute.getParameterTypes(), new String[]{String.class.getName(), ComplexObject.class.getName()}));
+        Assert.assertEquals(complexCompute.getReturnType(), String.class.getName());
+
+        Assert.assertTrue(Arrays.equals(findComplexObject.getParameterTypes(), new String[]{String.class.getName(), "int", "long",
+                String[].class.getCanonicalName(), "java.util.List<java.lang.Integer>", ComplexObject.TestEnum.class.getCanonicalName()}));
+        Assert.assertEquals(findComplexObject.getReturnType(), ComplexObject.class.getCanonicalName());
+
+
+        List<TypeDefinition> typeDefinitions = fullServiceDefinition.getTypes();
+
+        TypeDefinition topTypeDefinition = null;
+        TypeDefinition innerTypeDefinition = null;
+        TypeDefinition inner2TypeDefinition = null;
+        TypeDefinition inner3TypeDefinition = null;
+        for (TypeDefinition typeDefinition : typeDefinitions) {
+            if (typeDefinition.getType().equals(ComplexObject.class.getName())) {
+                topTypeDefinition = typeDefinition;
+            } else if (typeDefinition.getType().equals(ComplexObject.InnerObject.class.getName())) {
+                innerTypeDefinition = typeDefinition;
+            } else if (typeDefinition.getType().contains(ComplexObject.InnerObject2.class.getName())) {
+                inner2TypeDefinition = typeDefinition;
+            } else if (typeDefinition.getType().equals(ComplexObject.InnerObject3.class.getName())) {
+                inner3TypeDefinition = typeDefinition;
+            }
+        }
+        Assert.assertEquals(topTypeDefinition.getProperties().get("v").getType(), "long");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("maps").getType(), "java.util.Map<java.lang.String, java.lang.String>");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("innerObject").getType(), ComplexObject.InnerObject.class.getName());
+        Assert.assertEquals(topTypeDefinition.getProperties().get("intList").getType(), "java.util.List<java.lang.Integer>");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("strArrays").getType(), "java.lang.String[]");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("innerObject3").getType(), "org.apache.dubbo.metadata.definition.service.ComplexObject.InnerObject3[]");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("testEnum").getType(), "org.apache.dubbo.metadata.definition.service.ComplexObject.TestEnum");
+        Assert.assertEquals(topTypeDefinition.getProperties().get("innerObject2").getType(), "java.util.Set<org.apache.dubbo.metadata.definition.service.ComplexObject$InnerObject2>");
+
+        Assert.assertSame(innerTypeDefinition.getProperties().get("innerA").getType(), "java.lang.String");
+        Assert.assertSame(innerTypeDefinition.getProperties().get("innerB").getType(), "int");
+
+        Assert.assertSame(inner2TypeDefinition.getProperties().get("innerA2").getType(), "java.lang.String");
+        Assert.assertSame(inner2TypeDefinition.getProperties().get("innerB2").getType(), "int");
+
+        Assert.assertSame(inner3TypeDefinition.getProperties().get("innerA3").getType(), "java.lang.String");
+
+    }
+
+}
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java
index e17b16b..07f1711 100644
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/common/ResultWithRawCollections.java
@@ -20,7 +20,7 @@ import java.util.List;
 import java.util.Map;
 
 /**
- * Created by Arthur.xqw on 2017/4/11.
+ *
  */
 @SuppressWarnings("rawtypes")
 public class ResultWithRawCollections {
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
new file mode 100644
index 0000000..a5fc300
--- /dev/null
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/ComplexObject.java
@@ -0,0 +1,280 @@
+package org.apache.dubbo.metadata.definition.service;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+/**
+ * for test
+ */
+public class ComplexObject {
+
+    public ComplexObject() {
+    }
+
+    public ComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum) {
+        this.setInnerObject(new ComplexObject.InnerObject());
+        this.getInnerObject().setInnerA(var1);
+        this.getInnerObject().setInnerB(var2);
+        this.setIntList(var4);
+        this.setStrArrays(var3);
+        this.setTestEnum(testEnum);
+        this.setV(l);
+        InnerObject2 io21 = new InnerObject2();
+        io21.setInnerA2(var1 + "_21");
+        io21.setInnerB2(var2 + 100000);
+        InnerObject2 io22 = new InnerObject2();
+        io22.setInnerA2(var1 + "_22");
+        io22.setInnerB2(var2 + 200000);
+        this.setInnerObject2(new HashSet<InnerObject2>(Arrays.asList(io21, io22)));
+
+        InnerObject3 io31 = new InnerObject3();
+        io31.setInnerA3(var1 + "_31");
+        InnerObject3 io32 = new InnerObject3();
+        io32.setInnerA3(var1 + "_32");
+        InnerObject3 io33 = new InnerObject3();
+        io33.setInnerA3(var1 + "_33");
+        this.setInnerObject3(new InnerObject3[]{io31, io32, io33});
+        this.maps = new HashMap<>(4);
+        this.maps.put(var1 + "_k1", var1 + "_v1");
+        this.maps.put(var1 + "_k2", var1 + "_v2");
+    }
+
+    private InnerObject innerObject;
+    private Set<InnerObject2> innerObject2;
+    private InnerObject3[] innerObject3;
+    private String[] strArrays;
+    private List<Integer> intList;
+    private long v;
+    private TestEnum testEnum;
+    private Map<String, String> maps;
+
+    public InnerObject getInnerObject() {
+        return innerObject;
+    }
+
+    public void setInnerObject(InnerObject innerObject) {
+        this.innerObject = innerObject;
+    }
+
+    public String[] getStrArrays() {
+        return strArrays;
+    }
+
+    public void setStrArrays(String[] strArrays) {
+        this.strArrays = strArrays;
+    }
+
+    public List<Integer> getIntList() {
+        return intList;
+    }
+
+    public void setIntList(List<Integer> intList) {
+        this.intList = intList;
+    }
+
+    public long getV() {
+        return v;
+    }
+
+    public void setV(long v) {
+        this.v = v;
+    }
+
+    public TestEnum getTestEnum() {
+        return testEnum;
+    }
+
+    public void setTestEnum(TestEnum testEnum) {
+        this.testEnum = testEnum;
+    }
+
+    public Set<InnerObject2> getInnerObject2() {
+        return innerObject2;
+    }
+
+    public void setInnerObject2(Set<InnerObject2> innerObject2) {
+        this.innerObject2 = innerObject2;
+    }
+
+    public InnerObject3[] getInnerObject3() {
+        return innerObject3;
+    }
+
+    public void setInnerObject3(InnerObject3[] innerObject3) {
+        this.innerObject3 = innerObject3;
+    }
+
+    public Map<String, String> getMaps() {
+        return maps;
+    }
+
+    public void setMaps(Map<String, String> maps) {
+        this.maps = maps;
+    }
+
+    @Override
+    public String toString() {
+        return "ComplexObject{" +
+                "innerObject=" + innerObject +
+                ", innerObject2=" + innerObject2 +
+                ", innerObject3=" + Arrays.toString(innerObject3) +
+                ", strArrays=" + Arrays.toString(strArrays) +
+                ", intList=" + intList +
+                ", v=" + v +
+                ", testEnum=" + testEnum +
+                ", maps=" + maps +
+                '}';
+    }
+
+    @Override
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (!(o instanceof ComplexObject)) return false;
+        ComplexObject that = (ComplexObject) o;
+        return getV() == that.getV() &&
+                Objects.equals(getInnerObject(), that.getInnerObject()) &&
+                Objects.equals(getInnerObject2(), that.getInnerObject2()) &&
+                Arrays.equals(getInnerObject3(), that.getInnerObject3()) &&
+                Arrays.equals(getStrArrays(), that.getStrArrays()) &&
+                Objects.equals(getIntList(), that.getIntList()) &&
+                getTestEnum() == that.getTestEnum() &&
+                Objects.equals(getMaps(), that.getMaps());
+    }
+
+    @Override
+    public int hashCode() {
+        int result = Objects.hash(getInnerObject(), getInnerObject2(), getIntList(), getV(), getTestEnum(), getMaps());
+        result = 31 * result + Arrays.hashCode(getInnerObject3());
+        result = 31 * result + Arrays.hashCode(getStrArrays());
+        return result;
+    }
+
+    static public enum TestEnum {
+        VALUE1, VALUE2
+    }
+
+    static public class InnerObject {
+        String innerA;
+        int innerB;
+
+        public String getInnerA() {
+            return innerA;
+        }
+
+        public void setInnerA(String innerA) {
+            this.innerA = innerA;
+        }
+
+        public int getInnerB() {
+            return innerB;
+        }
+
+        public void setInnerB(int innerB) {
+            this.innerB = innerB;
+        }
+
+        @Override
+        public String toString() {
+            return "InnerObject{" +
+                    "innerA='" + innerA + '\'' +
+                    ", innerB=" + innerB +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof InnerObject)) return false;
+            InnerObject that = (InnerObject) o;
+            return getInnerB() == that.getInnerB() &&
+                    Objects.equals(getInnerA(), that.getInnerA());
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(getInnerA(), getInnerB());
+        }
+    }
+
+    static public class InnerObject2 {
+        String innerA2;
+        int innerB2;
+
+        public String getInnerA2() {
+            return innerA2;
+        }
+
+        public void setInnerA2(String innerA) {
+            this.innerA2 = innerA2;
+        }
+
+        public int getInnerB2() {
+            return innerB2;
+        }
+
+        public void setInnerB2(int innerB) {
+            this.innerB2 = innerB2;
+        }
+
+        @Override
+        public String toString() {
+            return "InnerObject{" +
+                    "innerA='" + innerA2 + '\'' +
+                    ", innerB=" + innerB2 +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof InnerObject2)) return false;
+            InnerObject2 that = (InnerObject2) o;
+            return getInnerB2() == that.getInnerB2() &&
+                    Objects.equals(getInnerA2(), that.getInnerA2());
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(getInnerA2(), getInnerB2());
+        }
+    }
+
+    static public class InnerObject3 {
+        String innerA3;
+
+        public String getInnerA3() {
+            return innerA3;
+        }
+
+        public void setInnerA3(String innerA3) {
+            this.innerA3 = innerA3;
+        }
+
+        @Override
+        public String toString() {
+            return "InnerObject3{" +
+                    "innerA3='" + innerA3 + '\'' +
+                    '}';
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (!(o instanceof InnerObject3)) return false;
+            InnerObject3 that = (InnerObject3) o;
+            return Objects.equals(getInnerA3(), that.getInnerA3());
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(getInnerA3());
+        }
+    }
+}
+
+
diff --git a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java
similarity index 67%
copy from dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
copy to dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java
index bbec7b5..c839c66 100644
--- a/dubbo-metadata-report/dubbo-metadata-definition/src/main/java/org/apache/dubbo/metadata/definition/model/FullServiceDefinition.java
+++ b/dubbo-metadata-report/dubbo-metadata-definition/src/test/java/org/apache/dubbo/metadata/definition/service/DemoService.java
@@ -14,23 +14,17 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package org.apache.dubbo.metadata.definition.model;
+package org.apache.dubbo.metadata.definition.service;
 
-import java.util.Map;
+import java.util.List;
 
 /**
- * 2018/10/25
+ * for test
  */
-public class FullServiceDefinition extends ServiceDefinition {
+public interface DemoService {
 
-    private Map<String, String> parameters;
+    String complexCompute(String input, ComplexObject co);
 
-    public Map<String, String> getParameters() {
-        return parameters;
-    }
-
-    public void setParameters(Map<String, String> parameters) {
-        this.parameters = parameters;
-    }
+    ComplexObject findComplexObject(String var1, int var2, long l, String[] var3, List<Integer> var4, ComplexObject.TestEnum testEnum);
 
 }
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/pom.xml b/dubbo-metadata-report/dubbo-metadata-report-api/pom.xml
index e1e2c34..3497002 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/pom.xml
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/pom.xml
@@ -60,8 +60,13 @@
             <scope>test</scope>
         </dependency>
         <dependency>
-            <groupId>org.apache.commons</groupId>
-            <artifactId>commons-lang3</artifactId>
+            <groupId>org.apache.dubbo</groupId>
+            <artifactId>dubbo-metadata-definition</artifactId>
+            <version>${project.parent.version}</version>
+        </dependency>
+        <dependency>
+            <groupId>com.google.code.gson</groupId>
+            <artifactId>gson</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.dubbo</groupId>
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ConsumerMetadataIdentifier.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ConsumerMetadataIdentifier.java
index f4a17ce..ac1f48b 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ConsumerMetadataIdentifier.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ConsumerMetadataIdentifier.java
@@ -3,7 +3,7 @@ package org.apache.dubbo.metadata.identifier;
 import org.apache.dubbo.common.Constants;
 
 /**
- * @author cvictory ON 2018/10/25
+ * 2018/10/25
  */
 public class ConsumerMetadataIdentifier extends MetadataIdentifier {
 
@@ -21,8 +21,6 @@ public class ConsumerMetadataIdentifier extends MetadataIdentifier {
         return Constants.PATH_SEPARATOR + application;
     }
 
-    ;
-
     public String getApplication() {
         return application;
     }
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
index f3c1cbc..e9f4226 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/MetadataIdentifier.java
@@ -4,7 +4,7 @@ import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
 
 /**
- * @author cvictory ON 2018/10/25
+ * 2018/10/25
  */
 public class MetadataIdentifier {
     public static final String SEPARATOR = ":";
@@ -35,7 +35,7 @@ public class MetadataIdentifier {
 
     public String getFilePathKey(String pathTag) {
         return toServicePath() + Constants.PATH_SEPARATOR + pathTag + Constants.PATH_SEPARATOR + (version == null ? "" : (version + Constants.PATH_SEPARATOR))
-                + side + getPathSegment();
+                + (group == null ? "" : (group + Constants.PATH_SEPARATOR)) + side + getPathSegment();
     }
 
     private String toServicePath() {
@@ -49,7 +49,6 @@ public class MetadataIdentifier {
         return "";
     }
 
-    ;
 
     public String getServiceInterface() {
         return serviceInterface;
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ProviderMetadataIdentifier.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ProviderMetadataIdentifier.java
index 4946a91..c2e03db 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ProviderMetadataIdentifier.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/identifier/ProviderMetadataIdentifier.java
@@ -3,7 +3,7 @@ package org.apache.dubbo.metadata.identifier;
 import org.apache.dubbo.common.Constants;
 
 /**
- * @author cvictory ON 2018/10/25
+ * 2018/10/25
  */
 public class ProviderMetadataIdentifier extends MetadataIdentifier {
 
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/integration/MetadataReportService.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/integration/MetadataReportService.java
index 89f075b..10c0942 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/integration/MetadataReportService.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/integration/MetadataReportService.java
@@ -76,6 +76,7 @@ public class MetadataReportService {
         //first add into the list
         // remove the individul param
         providerUrl = providerUrl.removeParameters(Constants.PID_KEY, Constants.TIMESTAMP_KEY, Constants.BIND_IP_KEY, Constants.BIND_PORT_KEY, Constants.TIMESTAMP_KEY);
+
         try {
             String interfaceName = providerUrl.getParameter(Constants.INTERFACE_KEY);
             if (StringUtils.isNotEmpty(interfaceName)) {
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/MethodDescriptor.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/MethodDescriptor.java
deleted file mode 100644
index 59a954e..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/MethodDescriptor.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package org.apache.dubbo.metadata.metadata;
-
-import java.util.Arrays;
-import java.util.Objects;
-
-/**
- *  2018/9/18
- */
-public class MethodDescriptor {
-    private String name;
-    private String[] parameterTypes;
-    private String returnType;
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String[] getParameterTypes() {
-        return parameterTypes;
-    }
-
-    public void setParameterTypes(String[] parameterTypes) {
-        this.parameterTypes = parameterTypes;
-    }
-
-    public String getReturnType() {
-        return returnType;
-    }
-
-    public void setReturnType(String returnType) {
-        this.returnType = returnType;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof MethodDescriptor)) return false;
-        MethodDescriptor that = (MethodDescriptor) o;
-        return Objects.equals(getName(), that.getName()) &&
-                Arrays.equals(getParameterTypes(), that.getParameterTypes()) &&
-                Objects.equals(getReturnType(), that.getReturnType());
-    }
-
-    @Override
-    public int hashCode() {
-        int result = Objects.hash(getName(), getReturnType());
-        result = 31 * result + Arrays.hashCode(getParameterTypes());
-        return result;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/ServiceDescriptor.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/ServiceDescriptor.java
deleted file mode 100644
index f0e9ba5..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/ServiceDescriptor.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package org.apache.dubbo.metadata.metadata;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public class ServiceDescriptor {
-    private String name;
-    private String codeSource;
-    private List<MethodDescriptor> methodDescriptors = new ArrayList<>();
-    /**
-     * Primitive type and String will not be stored.
-     *
-     * The typeDescriptor will not store
-     */
-    private Map<String, TypeDescriptor> types = new HashMap<>();
-
-
-
-    public String getName() {
-        return name;
-    }
-
-    public void setName(String name) {
-        this.name = name;
-    }
-
-    public String getCodeSource() {
-        return codeSource;
-    }
-
-    public void setCodeSource(String codeSource) {
-        this.codeSource = codeSource;
-    }
-
-    public List<MethodDescriptor> getMethodDescriptors() {
-        return methodDescriptors;
-    }
-
-    public void setMethodDescriptors(List<MethodDescriptor> methodDescriptors) {
-        this.methodDescriptors = methodDescriptors;
-    }
-
-    public Map<String, TypeDescriptor> getTypes() {
-        return types;
-    }
-
-    public void setTypes(Map<String, TypeDescriptor> types) {
-        this.types = types;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/TypeDescriptor.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/TypeDescriptor.java
deleted file mode 100644
index 48ba6fd..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/TypeDescriptor.java
+++ /dev/null
@@ -1,65 +0,0 @@
-package org.apache.dubbo.metadata.metadata;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Objects;
-
-/**
- *  2018/9/18
- */
-public class TypeDescriptor {
-
-    private String type;
-    private boolean custom;
-    private Map<String, TypeDescriptor> properties = new HashMap<>();
-
-    public TypeDescriptor(String type){
-        this.type = type;
-    }
-
-    public TypeDescriptor(String type, boolean custom){
-        this.type = type;
-        this.custom = custom;
-    }
-
-    public static TypeDescriptor simplifyTypeDescriptor(TypeDescriptor typeDescriptor){
-        return new TypeDescriptor(typeDescriptor.getType(), typeDescriptor.isCustom());
-    }
-
-    public String getType() {
-        return type;
-    }
-
-    public void setType(String type) {
-        this.type = type;
-    }
-
-    public Map<String, TypeDescriptor> getProperties() {
-        return properties;
-    }
-
-    public void setProperties(Map<String, TypeDescriptor> properties) {
-        this.properties = properties;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) return true;
-        if (!(o instanceof TypeDescriptor)) return false;
-        TypeDescriptor that = (TypeDescriptor) o;
-        return Objects.equals(getType(), that.getType());
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(getType());
-    }
-
-    public boolean isCustom() {
-        return custom;
-    }
-
-    public void setCustom(boolean custom) {
-        this.custom = custom;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/ArrayTypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/ArrayTypeBuilder.java
deleted file mode 100644
index 883a8e1..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/ArrayTypeBuilder.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.Type;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public class ArrayTypeBuilder implements TypeBuilder {
-
-    @Override
-    public boolean accept(Type type, Class<?> clazz) {
-        if (clazz == null) {
-            return false;
-        }
-
-        if (clazz.isArray()) {
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public TypeDescriptor build(Type type, Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache) {
-        // Process the component type of an array.
-        Class<?> componentType = clazz.getComponentType();
-        TypeDescriptorBuilder.build(componentType, componentType, typeCache);
-
-        final String canonicalName = clazz.getCanonicalName();
-        TypeDescriptor td = new TypeDescriptor(canonicalName);
-        return td;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/CollectionTypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/CollectionTypeBuilder.java
deleted file mode 100644
index 515ced2..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/CollectionTypeBuilder.java
+++ /dev/null
@@ -1,59 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.text.MessageFormat;
-import java.util.Collection;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public class CollectionTypeBuilder implements TypeBuilder{
-    @Override
-    public boolean accept(Type type, Class<?> clazz) {
-        if (clazz == null) {
-            return false;
-        }
-
-        if (Collection.class.isAssignableFrom(clazz)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public TypeDescriptor build(Type type, Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache) {
-        if (!(type instanceof ParameterizedType)) {
-            // 没有泛型信息,就直接返回class name
-            return new TypeDescriptor(clazz.getName());
-        }
-
-        ParameterizedType parameterizedType = (ParameterizedType) type;
-        Type[] actualTypeArgs = parameterizedType.getActualTypeArguments();
-        if (actualTypeArgs == null || actualTypeArgs.length != 1) {
-            throw new IllegalArgumentException(MessageFormat.format(
-                    "[Jaket] Collection type [{0}] with unexpected amount of arguments [{1}]." + actualTypeArgs,
-                    new Object[] { type, actualTypeArgs }));
-        }
-
-        Type actualType = actualTypeArgs[0];
-        if (actualType instanceof ParameterizedType) {
-            // Nested collection or map.
-            Class<?> rawType = (Class<?>) ((ParameterizedType) actualType).getRawType();
-            TypeDescriptorBuilder.build(actualType, rawType, typeCache);
-        } else if (actualType instanceof Class<?>) {
-            Class<?> actualClass = (Class<?>) actualType;
-            if (actualClass.isArray() || actualClass.isEnum()) {
-                TypeDescriptorBuilder.build(null, actualClass, typeCache);
-            } else {
-                DefaultTypeBuilder.build(actualClass, typeCache);
-            }
-        }
-
-        return new TypeDescriptor(type.toString());
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/DefaultTypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/DefaultTypeBuilder.java
deleted file mode 100644
index 2c154f8..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/DefaultTypeBuilder.java
+++ /dev/null
@@ -1,113 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- *  2018/9/18
- */
-public class DefaultTypeBuilder {
-
-    public static TypeDescriptor build(Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache) {
-//        final String canonicalName = clazz.getCanonicalName();
-        final String name = clazz.getName();
-
-        TypeDescriptor td = new TypeDescriptor(name);
-        // Try to get a cached definition
-        if (typeCache.containsKey(clazz)) {
-            return typeCache.get(clazz);
-        }
-
-        // Primitive type
-        if (!needAnalyzing(clazz)) {
-            return td;
-        }
-
-        // Custom type
-        td.setCustom(true);
-
-        List<Field> fields = getNonStaticFields(clazz);
-        for (Field field : fields) {
-            String fieldName = field.getName();
-            Class<?> fieldClass = field.getType();
-            Type fieldType = field.getGenericType();
-
-            TypeDescriptor fieldTd = TypeDescriptorBuilder.build(fieldType, fieldClass, typeCache);
-            // if custom, renew and remove properties.
-            if(fieldTd.isCustom()){
-                fieldTd = TypeDescriptor.simplifyTypeDescriptor(fieldTd);
-            }
-            td.getProperties().put(fieldName, fieldTd);
-        }
-
-        typeCache.put(clazz, td);
-        return td;
-    }
-
-    private static List<Field> getNonStaticFields(final Class<?> clazz) {
-        List<Field> result = new ArrayList<Field>();
-        Class<?> target = clazz;
-        while (target != null) {
-
-            Field[] fields = target.getDeclaredFields();
-            for (Field field : fields) {
-                int modifiers = field.getModifiers();
-                if (Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers)) {
-                    continue;
-                }
-
-                result.add(field);
-            }
-            target = target.getSuperclass();
-        }
-
-        return result;
-    }
-
-
-    private static Set<String> closedTypes = new HashSet<String>(Arrays.asList("boolean", "byte", "char", "double", "float", "int", "long", "short", "void"));
-
-
-    /**
-     * <pre>
-     * 是否需要分析参数 clazz :
-     * clazz 是否为 primitive 类型
-     *    若为 primitive 类型,则不分析
-     * </pre>
-     *
-     * @param clazz
-     * @return
-     */
-    private static boolean needAnalyzing(Class<?> clazz) {
-        String canonicalName = clazz.getCanonicalName();
-
-        if (closedTypes != null && closedTypes.size() > 0) {
-            for (String type : closedTypes) {
-                if (canonicalName.startsWith(type)) {
-                    return false;
-                }
-            }
-        }
-        if (canonicalName.equals("java.lang.String")) {
-            return false;
-        }
-        // bootstrap classloader will be ignored.
-        if (clazz.getClassLoader() == null) {
-            return false;
-        }
-
-        return true;
-    }
-
-    private DefaultTypeBuilder() {
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/EnumTypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/EnumTypeBuilder.java
deleted file mode 100644
index 1bd8b45..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/EnumTypeBuilder.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.Type;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public class EnumTypeBuilder implements TypeBuilder{
-
-    @Override
-    public boolean accept(Type type, Class<?> clazz) {
-        if (clazz == null) {
-            return false;
-        }
-
-        if (clazz.isEnum()) {
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public TypeDescriptor build(Type type, Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache) {
-        TypeDescriptor td = new TypeDescriptor(clazz.getCanonicalName());
-
-        try {
-            // set values
-//            Method methodValues = clazz.getDeclaredMethod("values", new Class<?>[0]);
-//            Object[] values = (Object[]) methodValues.invoke(clazz, new Object[0]);
-//            int length = values.length;t
-//            for (int i = 0; i < length; i++) {
-//                Object value = values[i];
-//                td.getEnums().add(value.toString());
-//            }
-        } catch (Throwable t) {
-        }
-
-        typeCache.put(clazz, td);
-        return td;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/MapTypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/MapTypeBuilder.java
deleted file mode 100644
index 50c8849..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/MapTypeBuilder.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.Type;
-import java.text.MessageFormat;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public class MapTypeBuilder implements TypeBuilder{
-
-    @Override
-    public boolean accept(Type type, Class<?> clazz) {
-        if (clazz == null) {
-            return false;
-        }
-
-        if (Map.class.isAssignableFrom(clazz)) {
-            return true;
-        }
-
-        return false;
-    }
-
-    @Override
-    public TypeDescriptor build(Type type, Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache) {
-        if (!(type instanceof ParameterizedType)) {
-            // 没有泛型信息,就直接返回class name
-            return new TypeDescriptor(clazz.getName());
-        }
-
-        ParameterizedType parameterizedType = (ParameterizedType) type;
-        Type[] actualTypeArgs = parameterizedType.getActualTypeArguments();
-        if (actualTypeArgs == null || actualTypeArgs.length != 2) {
-            throw new IllegalArgumentException(MessageFormat.format(
-                    "Map type [{0}] with unexpected amount of arguments [{1}]." + actualTypeArgs, new Object[] {
-                            type, actualTypeArgs }));
-        }
-
-        for (Type actualType : actualTypeArgs) {
-            if (actualType instanceof ParameterizedType) {
-                // Nested collection or map.
-                Class<?> rawType = (Class<?>) ((ParameterizedType) actualType).getRawType();
-                TypeDescriptorBuilder.build(actualType, rawType, typeCache);
-            } else if (actualType instanceof Class<?>) {
-                Class<?> actualClass = (Class<?>) actualType;
-                if (actualClass.isArray() || actualClass.isEnum()) {
-                    TypeDescriptorBuilder.build(null, actualClass, typeCache);
-                } else {
-                    DefaultTypeBuilder.build(actualClass, typeCache);
-                }
-            }
-        }
-
-        return new TypeDescriptor(type.toString());
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/ServiceDescriptorBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/ServiceDescriptorBuilder.java
deleted file mode 100644
index a06d2ff..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/ServiceDescriptorBuilder.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.MethodDescriptor;
-import org.apache.dubbo.metadata.metadata.ServiceDescriptor;
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.net.URL;
-import java.security.CodeSource;
-import java.security.ProtectionDomain;
-
-/**
- *  2018/9/18
- */
-public class ServiceDescriptorBuilder {
-
-    public static ServiceDescriptor build(final Class<?> interfaceClass) {
-        ServiceDescriptor sd = new ServiceDescriptor();
-        sd.setName(interfaceClass.getCanonicalName());
-        sd.setCodeSource(getCodeSource(interfaceClass));
-
-        TypeDescriptorBuilder builder = new TypeDescriptorBuilder();
-        Method[] methods = interfaceClass.getMethods();
-        for (Method method : methods) {
-            MethodDescriptor md = new MethodDescriptor();
-            md.setName(method.getName());
-
-            // Process parameter types.
-            Class<?>[] paramTypes = method.getParameterTypes();
-            Type[] genericParamTypes = method.getGenericParameterTypes();
-
-            String[] parameterTypes = new String[paramTypes.length];
-            for (int i = 0; i < paramTypes.length; i++) {
-                TypeDescriptor td = builder.build(genericParamTypes[i], paramTypes[i]);
-                parameterTypes[i] = td.getType();
-            }
-            md.setParameterTypes(parameterTypes);
-
-            // Process return type.
-            TypeDescriptor td = builder.build(method.getGenericReturnType(), method.getReturnType());
-            md.setReturnType(td.getType());
-
-            sd.getMethodDescriptors().add(md);
-        }
-
-        sd.setTypes(builder.getTypeDescriptorMap());
-        return sd;
-    }
-
-    static String getCodeSource(Class<?> clazz) {
-        ProtectionDomain protectionDomain = clazz.getProtectionDomain();
-        if (protectionDomain == null || protectionDomain.getCodeSource() == null) {
-            return null;
-        }
-
-        CodeSource codeSource = clazz.getProtectionDomain().getCodeSource();
-        URL location = codeSource.getLocation();
-        if (location == null) {
-            return null;
-        }
-
-        String path = codeSource.getLocation().toExternalForm();
-
-        if (path.endsWith(".jar") && path.contains("/")) {
-            return path.substring(path.lastIndexOf('/') + 1);
-        }
-        return path;
-    }
-
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/TypeBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/TypeBuilder.java
deleted file mode 100644
index 72319f7..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/TypeBuilder.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.Type;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public interface TypeBuilder {
-
-    /**
-     * Whether the build accept the type or class passed in.
-     */
-    boolean accept(Type type, Class<?> clazz);
-
-    /**
-     * Build type definition with the type or class.
-     */
-    TypeDescriptor build(Type type, Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache);
-
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/TypeDescriptorBuilder.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/TypeDescriptorBuilder.java
deleted file mode 100644
index b347df7..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/metadata/builder/TypeDescriptorBuilder.java
+++ /dev/null
@@ -1,63 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- *  2018/9/18
- */
-public class TypeDescriptorBuilder {
-
-    private static final List<TypeBuilder> builders = new ArrayList<TypeBuilder>();
-    private Map<Class<?>, TypeDescriptor> typeCache = new HashMap<Class<?>, TypeDescriptor>();
-
-
-    static {
-        builders.add(new ArrayTypeBuilder());
-        builders.add(new CollectionTypeBuilder());
-        builders.add(new MapTypeBuilder());
-        builders.add(new EnumTypeBuilder());
-    }
-
-
-    public static TypeDescriptor build(Type type, Class<?> clazz, Map<Class<?>, TypeDescriptor> typeCache) {
-        TypeBuilder builder = getGenericTypeBuilder(type, clazz);
-        TypeDescriptor td = null;
-        if (builder != null) {
-            td = builder.build(type, clazz, typeCache);
-        } else {
-            td = DefaultTypeBuilder.build(clazz, typeCache);
-        }
-        return td;
-    }
-
-    static TypeBuilder getGenericTypeBuilder(Type type, Class<?> clazz) {
-        for (TypeBuilder builder : builders) {
-            if (builder.accept(type, clazz)) {
-                return builder;
-            }
-        }
-        return null;
-    }
-
-    public TypeDescriptor build(Type type, Class<?> clazz) {
-        return build(type, clazz, typeCache);
-    }
-
-    public Map<String, TypeDescriptor> getTypeDescriptorMap() {
-        if (typeCache == null || typeCache.isEmpty()) {
-            return Collections.EMPTY_MAP;
-        }
-        Map<String, TypeDescriptor> typeDescriptorMap = new HashMap<>();
-        for (Map.Entry<Class<?>, TypeDescriptor> entry : typeCache.entrySet()) {
-            typeDescriptorMap.put(entry.getKey().getName(), entry.getValue());
-        }
-        return typeDescriptorMap;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
index eb9fb61..d664dd5 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/main/java/org/apache/dubbo/metadata/support/AbstractMetadataReport.java
@@ -17,7 +17,6 @@
 package org.apache.dubbo.metadata.support;
 
 import com.google.gson.Gson;
-import org.apache.commons.lang3.time.DateUtils;
 import org.apache.dubbo.common.Constants;
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.logger.Logger;
@@ -39,7 +38,6 @@ import java.io.RandomAccessFile;
 import java.nio.channels.FileChannel;
 import java.nio.channels.FileLock;
 import java.util.Calendar;
-import java.util.Date;
 import java.util.Iterator;
 import java.util.Map;
 import java.util.Properties;
@@ -311,10 +309,13 @@ public abstract class AbstractMetadataReport implements MetadataReport {
      * @return
      */
     long calculateStartTime() {
-        Date now = new Date();
-        long nowMill = now.getTime();
-        long today0 = DateUtils.truncate(now, Calendar.DAY_OF_MONTH).getTime();
-        long subtract = today0 + ONE_DAY_IN_MIll - nowMill;
+        Calendar calendar = Calendar.getInstance();
+        long nowMill = calendar.getTimeInMillis();
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        long subtract = calendar.getTimeInMillis() + ONE_DAY_IN_MIll - nowMill;
         Random r = new Random();
         return subtract + (FOUR_HOURS_IN_MIll / 2) + r.nextInt(FOUR_HOURS_IN_MIll);
     }
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/RetryTestService.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/RetryTestService.java
index cc129a3..afbad8b 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/RetryTestService.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/integration/RetryTestService.java
@@ -1,7 +1,7 @@
 package org.apache.dubbo.metadata.integration;
 
 /**
- * @author cvictory ON 2018/10/26
+ * 2018/10/26
  */
 public interface RetryTestService {
 
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ArrayTypeBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ArrayTypeBuilderTest.java
deleted file mode 100644
index 8486cd9..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ArrayTypeBuilderTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.reflect.Array;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *  2018/9/20
- */
-public class ArrayTypeBuilderTest {
-
-    private ArrayTypeBuilder arrayTypeBuilder = new ArrayTypeBuilder();
-
-    @Test
-    public void testAcceptWhenArray() {
-        String[] param = new String[2];
-        Class c = param.getClass();
-        Assert.assertTrue(arrayTypeBuilder.accept(null, c));
-    }
-
-    @Test
-    public void testAcceptWhenNull() {
-        Assert.assertFalse(arrayTypeBuilder.accept(null, null));
-    }
-
-    @Test
-    public void testAcceptWhenOtherClass() {
-        Assert.assertFalse(arrayTypeBuilder.accept(null, Array.class));
-    }
-
-    @Test
-    public void testBuildWhenSimpleArray() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteSimpleArray", String[].class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td = arrayTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "java.lang.String[]");
-
-        Method readMethod = targetClass.getMethod("testReadSimpleArray", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = arrayTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "java.lang.String[]");
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testBuildWhenComplexArray() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteComplexArray", String[].class, ComplexObject[].class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td1 = arrayTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td1);
-        Assert.assertNotNull(td1);
-        Assert.assertEquals(td1.getType(), "java.lang.String[]");
-
-        TypeDescriptor td2 = arrayTypeBuilder.build(genericParamTypes[1], paramTypes[1], cache);
-        System.out.println(td2);
-        Assert.assertNotNull(td2);
-        Assert.assertEquals(td2.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject[]");
-
-        Method readMethod = targetClass.getMethod("testReadComplexArray", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = arrayTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject[]");
-
-        Assert.assertTrue(cache.size() == 2);
-        Assert.assertTrue(cache.get(ComplexObject.class) != null);
-        Assert.assertEquals(cache.get(ComplexObject.class).getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject");
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/CollectionTypeBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/CollectionTypeBuilderTest.java
deleted file mode 100644
index ceec948..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/CollectionTypeBuilderTest.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- *  2018/9/20
- */
-public class CollectionTypeBuilderTest {
-
-    private CollectionTypeBuilder collectionTypeBuilder = new CollectionTypeBuilder();
-
-    @Test
-    public void testAcceptWhenNotCollection() {
-        String[] param = new String[2];
-        Class c = param.getClass();
-        Assert.assertFalse(collectionTypeBuilder.accept(null, c));
-    }
-
-    @Test
-    public void testAcceptWhenNull() {
-        Assert.assertFalse(collectionTypeBuilder.accept(null, null));
-    }
-
-    @Test
-    public void testAcceptWhenCollection() {
-        Assert.assertTrue(collectionTypeBuilder.accept(null, ArrayList.class));
-    }
-
-    @Test
-    public void testBuildWhenSimpleList() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteSimpleCollection", List.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td = collectionTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "java.util.List<java.lang.String>");
-
-        Method readMethod = targetClass.getMethod("testReadSimpleCollection", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = collectionTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "java.util.List<java.lang.Integer>");
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testBuildWhenComplexList() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteComplexCollection", List.class, List.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td1 = collectionTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td1);
-        Assert.assertNotNull(td1);
-        Assert.assertEquals(td1.getType(), "java.util.List<java.lang.Long>");
-
-        TypeDescriptor td2 = collectionTypeBuilder.build(genericParamTypes[1], paramTypes[1], cache);
-        System.out.println(td2);
-        Assert.assertNotNull(td2);
-        Assert.assertEquals(td2.getType(), "java.util.List<org.apache.dubbo.metadata.metadata.builder.ComplexObject>");
-
-        Method readMethod = targetClass.getMethod("testReadComplexCollection", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = collectionTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "java.util.Set<org.apache.dubbo.metadata.metadata.builder.ComplexObject>");
-
-        Assert.assertTrue(cache.size() == 2);
-        Assert.assertTrue(cache.get(ComplexObject.class) != null);
-        Assert.assertEquals(cache.get(ComplexObject.class).getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject");
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ComplexEnum.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ComplexEnum.java
deleted file mode 100644
index 689b89f..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ComplexEnum.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-/**
- *  2018/9/28
- */
-public enum ComplexEnum {
-    F(11, "t1"), S(22, "t2"), T(33, "t1");
-
-    ComplexEnum(int code, String message) {
-        this.code = code;
-        this.msg = message;
-    }
-
-    private int code;
-    private String msg;
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ComplexObject.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ComplexObject.java
deleted file mode 100644
index d5f7d29..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ComplexObject.java
+++ /dev/null
@@ -1,37 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- *  2018/9/28
- */
-public class ComplexObject {
-
-    private static boolean test;
-
-    private String[] strArray;
-    private List<Integer> integerList;
-    private short s;
-    private Map<String, Long> testMap;
-    private ComplexInnerObject complexInnerObject;
-
-    public List<Integer> getIntegerList() {
-        return integerList;
-    }
-
-    public void setIntegerList(List<Integer> integerList) {
-        this.integerList = integerList;
-    }
-
-    public short getS() {
-        return s;
-    }
-
-    public void setS(short s) {
-        this.s = s;
-    }
-    static class ComplexInnerObject{
-        private String str;
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/DefaultTypeBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/DefaultTypeBuilderTest.java
deleted file mode 100644
index 2a187d8..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/DefaultTypeBuilderTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.math.BigDecimal;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *  2018/9/28
- */
-public class DefaultTypeBuilderTest {
-
-    @Test
-    public void testWhenBigDecimal() {
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        TypeDescriptor td = DefaultTypeBuilder.build(BigDecimal.class, cache);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "java.math.BigDecimal");
-        Assert.assertFalse(td.isCustom());
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testWhenString() {
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        TypeDescriptor td = DefaultTypeBuilder.build(String.class, cache);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "java.lang.String");
-        Assert.assertFalse(td.isCustom());
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testWhenInt() {
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        TypeDescriptor td = DefaultTypeBuilder.build(int.class, cache);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "int");
-        Assert.assertFalse(td.isCustom());
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testWhenComplextObject() {
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        TypeDescriptor td = DefaultTypeBuilder.build(ComplexObject.class, cache);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject");
-        Assert.assertTrue(td.isCustom());
-        Assert.assertTrue(td.getProperties().entrySet().size() >= 4);
-
-        Assert.assertTrue(cache.size() == 2);
-        Assert.assertEquals(td, cache.get(ComplexObject.class));
-        Assert.assertNotNull(cache.get(ComplexObject.ComplexInnerObject.class));
-    }
-
-
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/EnumTypeBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/EnumTypeBuilderTest.java
deleted file mode 100644
index 92a9096..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/EnumTypeBuilderTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *  2018/9/20
- */
-public class EnumTypeBuilderTest {
-
-    private EnumTypeBuilder enumTypeBuilder = new EnumTypeBuilder();
-
-    @Test
-    public void testAcceptWhenEnum() {
-        Class c = SingleEnum.class;
-        Assert.assertTrue(enumTypeBuilder.accept(null, c));
-    }
-
-    @Test
-    public void testAcceptWhenNull() {
-        Assert.assertFalse(enumTypeBuilder.accept(null, null));
-    }
-
-    @Test
-    public void testAcceptWhenNotEnum() {
-        Assert.assertFalse(enumTypeBuilder.accept(null, ArrayList.class));
-    }
-
-    @Test
-    public void testBuildWhenSingleEnum() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteSingleEnum", SingleEnum.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td = enumTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "org.apache.dubbo.metadata.metadata.builder.SingleEnum");
-
-        Method readMethod = targetClass.getMethod("testReadSingleEnum", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = enumTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "org.apache.dubbo.metadata.metadata.builder.SingleEnum");
-
-        Assert.assertFalse(cache.isEmpty());
-    }
-
-    @Test
-    public void testBuildWhenComplexEnum() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteComplexEnum", ComplexEnum.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-
-        TypeDescriptor td2 = enumTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td2);
-        Assert.assertNotNull(td2);
-        Assert.assertEquals(td2.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexEnum");
-
-        Method readMethod = targetClass.getMethod("testReadComplexEnum", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = enumTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexEnum");
-
-        Assert.assertTrue(cache.size() == 1);
-        Assert.assertTrue(cache.get(ComplexEnum.class) != null);
-        Assert.assertEquals(cache.get(ComplexEnum.class).getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexEnum");
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/MapTypeBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/MapTypeBuilderTest.java
deleted file mode 100644
index 8833df9..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/MapTypeBuilderTest.java
+++ /dev/null
@@ -1,89 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *  2018/9/20
- */
-public class MapTypeBuilderTest {
-
-    private MapTypeBuilder mapTypeBuilder = new MapTypeBuilder();
-
-    @Test
-    public void testAcceptWhenMap() {
-        String[] param = new String[2];
-        Class c = param.getClass();
-        Assert.assertFalse(mapTypeBuilder.accept(null, c));
-    }
-
-    @Test
-    public void testAcceptWhenNull() {
-        Assert.assertFalse(mapTypeBuilder.accept(null, null));
-    }
-
-    @Test
-    public void testAcceptWhenNotMap() {
-        Assert.assertFalse(mapTypeBuilder.accept(null, ArrayList.class));
-    }
-
-    @Test
-    public void testBuildWhenSimpleMap() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteSimpleMap", Map.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td = mapTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "java.util.Map<java.lang.String, java.lang.Integer>");
-
-        Method readMethod = targetClass.getMethod("testReadSimpleMap", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = mapTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "java.util.Map<java.lang.String, java.lang.Integer>");
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testBuildWhenComplexMap() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteComplexMap", Map.class, Map.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td1 = mapTypeBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td1);
-        Assert.assertNotNull(td1);
-        Assert.assertEquals(td1.getType(), "java.util.Map<java.lang.String, java.lang.String>");
-
-        TypeDescriptor td2 = mapTypeBuilder.build(genericParamTypes[1], paramTypes[1], cache);
-        System.out.println(td2);
-        Assert.assertNotNull(td2);
-        Assert.assertEquals(td2.getType(), "java.util.Map<java.lang.String, org.apache.dubbo.metadata.metadata.builder.ComplexObject>");
-
-        Method readMethod = targetClass.getMethod("testReadComplexMap", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = mapTypeBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "java.util.Map<java.lang.String, org.apache.dubbo.metadata.metadata.builder.ComplexObject>");
-
-        Assert.assertTrue(cache.size() == 2);
-        Assert.assertTrue(cache.get(ComplexObject.class) != null);
-        Assert.assertEquals(cache.get(ComplexObject.class).getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject");
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ServiceDescriptorBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ServiceDescriptorBuilderTest.java
deleted file mode 100644
index 1abe7a6..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/ServiceDescriptorBuilderTest.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.ServiceDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *  2018/9/29
- */
-public class ServiceDescriptorBuilderTest {
-
-    @Test
-    public void testGetCodeSource(){
-        String codeSource = ServiceDescriptorBuilder.getCodeSource(ServiceDescriptorBuilder.class);
-        Assert.assertNotNull(codeSource);
-    }
-
-    @Test
-    public void testBuild(){
-        ServiceDescriptor serviceDescriptor = ServiceDescriptorBuilder.build(TestService.class);
-        Assert.assertNotNull(serviceDescriptor);
-        Assert.assertTrue(serviceDescriptor.getMethodDescriptors().size() == 17);
-        Assert.assertTrue(serviceDescriptor.getTypes().size() == 4);
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/SingleEnum.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/SingleEnum.java
deleted file mode 100644
index 18103b8..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/SingleEnum.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-/**
- *  2018/9/28
- */
-public enum SingleEnum {
-    FIRST,SECOND
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/TestService.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/TestService.java
deleted file mode 100644
index 286e6c3..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/TestService.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * 2018/9/28
- */
-public interface TestService {
-
-    void testWriteSimpleArray(String[] args);
-
-    String[] testReadSimpleArray(int i);
-
-    void testWriteComplexArray(String[] args, ComplexObject[] complexObjects);
-
-    ComplexObject[] testReadComplexArray(int i);
-
-    void testWriteSimpleCollection(List<String> args);
-
-    List<Integer> testReadSimpleCollection(int i);
-
-    void testWriteComplexCollection(List<Long> args, List<ComplexObject> complexObjects);
-
-    Set<ComplexObject> testReadComplexCollection(int i);
-
-    void testWriteSingleEnum(SingleEnum singleEnum);
-
-    SingleEnum testReadSingleEnum(int i);
-
-    void testWriteComplexEnum(ComplexEnum complexEnum);
-
-    ComplexEnum testReadComplexEnum(int i);
-
-    void testWriteSimpleMap(Map<String, Integer> args);
-
-    Map<String, Integer> testReadSimpleMap(int i);
-
-    void testWriteComplexMap(Map<String, String> arg, Map<String, ComplexObject> complexObjects);
-
-    Map<String, ComplexObject> testReadComplexMap(int i);
-
-    void testWriteComplexObject(ComplexObject complexObject);
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/TypeDescriptorBuilderTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/TypeDescriptorBuilderTest.java
deleted file mode 100644
index 8723a66..0000000
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/metadata/builder/TypeDescriptorBuilderTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package org.apache.dubbo.metadata.metadata.builder;
-
-import org.apache.dubbo.metadata.metadata.TypeDescriptor;
-import org.junit.Assert;
-import org.junit.Test;
-
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- *  2018/9/29
- */
-public class TypeDescriptorBuilderTest {
-
-
-    @Test
-    public void testStaticBuildWhenSimpleArray() throws NoSuchMethodException {
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteSimpleArray", String[].class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-        TypeDescriptor td = TypeDescriptorBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        System.out.println(td);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "java.lang.String[]");
-
-        Method readMethod = targetClass.getMethod("testReadSimpleArray", int.class);
-        Class returnType = readMethod.getReturnType();
-        Type genericReturnType = readMethod.getGenericReturnType();
-        TypeDescriptor rTd = TypeDescriptorBuilder.build(genericReturnType, returnType, cache);
-        Assert.assertNotNull(rTd);
-        Assert.assertEquals(rTd.getType(), "java.lang.String[]");
-
-        Assert.assertTrue(cache.isEmpty());
-    }
-
-    @Test
-    public void testStaticBuildWhenComplextObject() throws NoSuchMethodException {
-
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteComplexObject", ComplexObject.class);
-        Map<Class<?>, TypeDescriptor> cache = new HashMap<Class<?>, TypeDescriptor>();
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-
-        TypeDescriptor td = TypeDescriptorBuilder.build(genericParamTypes[0], paramTypes[0], cache);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject");
-        Assert.assertTrue(td.isCustom());
-        Assert.assertTrue(td.getProperties().entrySet().size() >= 4);
-
-        Assert.assertTrue(cache.size() == 2);
-        Assert.assertEquals(td, cache.get(ComplexObject.class));
-        Assert.assertNotNull(cache.get(ComplexObject.ComplexInnerObject.class));
-    }
-
-    /**
-     * test builder and getTypeDescriptorMap method.
-     *
-     * @throws NoSuchMethodException
-     */
-    @Test
-    public void testBuildWhenComplextObject() throws NoSuchMethodException {
-        TypeDescriptorBuilder typeDescriptorBuilder = new TypeDescriptorBuilder();
-
-        Class targetClass = TestService.class;
-        Method method = targetClass.getMethod("testWriteComplexObject", ComplexObject.class);
-        Class<?>[] paramTypes = method.getParameterTypes();
-        Type[] genericParamTypes = method.getGenericParameterTypes();
-
-
-        TypeDescriptor td = typeDescriptorBuilder.build(genericParamTypes[0], paramTypes[0]);
-        Assert.assertNotNull(td);
-        Assert.assertEquals(td.getType(), "org.apache.dubbo.metadata.metadata.builder.ComplexObject");
-        Assert.assertTrue(td.isCustom());
-        Assert.assertTrue(td.getProperties().entrySet().size() >= 4);
-
-        Assert.assertTrue(typeDescriptorBuilder.getTypeDescriptorMap().size() == 2);
-        Assert.assertEquals(td, typeDescriptorBuilder.getTypeDescriptorMap().get(ComplexObject.class.getName()));
-        Assert.assertNotNull(typeDescriptorBuilder.getTypeDescriptorMap().get(ComplexObject.ComplexInnerObject.class.getName()));
-    }
-
-    @Test
-    public void testGetGenericTypeBuilder() {
-        Assert.assertNull(TypeDescriptorBuilder.getGenericTypeBuilder(null, ComplexObject.class));
-        Assert.assertNotNull(TypeDescriptorBuilder.getGenericTypeBuilder(null, String[].class));
-        Assert.assertTrue(TypeDescriptorBuilder.getGenericTypeBuilder(null, String[].class) instanceof ArrayTypeBuilder);
-        Assert.assertNotNull(TypeDescriptorBuilder.getGenericTypeBuilder(null, ArrayList.class));
-        Assert.assertTrue(TypeDescriptorBuilder.getGenericTypeBuilder(null, ArrayList.class) instanceof CollectionTypeBuilder);
-        Assert.assertNotNull(TypeDescriptorBuilder.getGenericTypeBuilder(null, HashMap.class));
-        Assert.assertTrue(TypeDescriptorBuilder.getGenericTypeBuilder(null, HashMap.class) instanceof MapTypeBuilder);
-        Assert.assertNotNull(TypeDescriptorBuilder.getGenericTypeBuilder(null, SingleEnum.class));
-        Assert.assertTrue(TypeDescriptorBuilder.getGenericTypeBuilder(null, SingleEnum.class) instanceof EnumTypeBuilder);
-    }
-}
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/store/test/JTestMetadataReport4Test.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/store/test/JTestMetadataReport4Test.java
index e3964af..67294a8 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/store/test/JTestMetadataReport4Test.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/store/test/JTestMetadataReport4Test.java
@@ -36,7 +36,6 @@ public class JTestMetadataReport4Test extends AbstractMetadataReport {
     private final static Logger logger = LoggerFactory.getLogger(JTestMetadataReport4Test.class);
 
 
-
     public JTestMetadataReport4Test(URL url, ZookeeperTransporter zookeeperTransporter) {
         super(url);
     }
@@ -60,7 +59,7 @@ public class JTestMetadataReport4Test extends AbstractMetadataReport {
         store.put(consumerMetadataIdentifier.getIdentifierKey(), serviceParameterString);
     }
 
-    public static String getKey(URL url){
+    public static String getKey(URL url) {
         return getProtocol(url) + url.getServiceKey();
     }
 
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportFactoryTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportFactoryTest.java
index 6a808c1..beb7594 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportFactoryTest.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportFactoryTest.java
@@ -1,7 +1,6 @@
 package org.apache.dubbo.metadata.support;
 
 import com.alibaba.fastjson.JSON;
-
 import org.apache.dubbo.common.URL;
 import org.apache.dubbo.common.utils.NetUtils;
 import org.apache.dubbo.metadata.definition.model.FullServiceDefinition;
diff --git a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportTest.java b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportTest.java
index ab8cd95..4433618 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportTest.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-api/src/test/java/org/apache/dubbo/metadata/support/AbstractMetadataReportTest.java
@@ -27,8 +27,8 @@ import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.Calendar;
 import java.util.Collections;
-import java.util.Date;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -208,11 +208,12 @@ public class AbstractMetadataReportTest {
 
     @Test
     public void testCalculateStartTime() {
-        for (int i = 0; i < 50; i++) {
+        for (int i = 0; i < 300; i++) {
             long t = abstractMetadataReport.calculateStartTime() + System.currentTimeMillis();
-            Date date = new Date(t);
-            Assert.assertTrue(date.getHours() >= 2);
-            Assert.assertTrue(date.getHours() <= 6);
+            Calendar c = Calendar.getInstance();
+            c.setTimeInMillis(t);
+            Assert.assertTrue(c.get(Calendar.HOUR_OF_DAY) >= 2);
+            Assert.assertTrue(c.get(Calendar.HOUR_OF_DAY) <= 6);
         }
     }
 
diff --git a/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java b/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
index 901601f..0f702e8 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/main/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReport.java
@@ -38,6 +38,7 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
     private final static Logger logger = LoggerFactory.getLogger(ZookeeperMetadataReport.class);
 
     private final static String DEFAULT_ROOT = "dubbo";
+    private final static String METADATA_NODE_NAME = "service.data";
 
     private final String root;
 
@@ -84,14 +85,11 @@ public class ZookeeperMetadataReport extends AbstractMetadataReport {
     }
 
     private void storeMetadata(MetadataIdentifier metadataIdentifier, String v) {
-        String category = getCategory(metadataIdentifier);
-        String filePath = category + Constants.PATH_SEPARATOR + URL.encode(v);
-        deletePath(category);
-        zkClient.create(filePath, false);
+        zkClient.create(getNodePath(metadataIdentifier), v, false);
     }
 
-    String getCategory(MetadataIdentifier metadataIdentifier) {
-        return toRootDir() + metadataIdentifier.getFilePathKey();
+    String getNodePath(MetadataIdentifier metadataIdentifier) {
+        return toRootDir() + metadataIdentifier.getFilePathKey() + Constants.PATH_SEPARATOR + METADATA_NODE_NAME;
     }
 
 
diff --git a/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java b/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
index 93b9c08..7c5e173 100644
--- a/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
+++ b/dubbo-metadata-report/dubbo-metadata-report-zookeeper/src/test/java/org/apache/dubbo/metadata/store/zookeeper/ZookeeperMetadataReportTest.java
@@ -55,19 +55,20 @@ public class ZookeeperMetadataReportTest {
         String application = "vic.zk.md";
         ProviderMetadataIdentifier providerMetadataIdentifier = storePrivider(zookeeperMetadataReport, interfaceName, version, group, application);
 
-        List<String> files = zookeeperMetadataReport.zkClient.getChildren(zookeeperMetadataReport.getCategory(providerMetadataIdentifier));
-        Assert.assertTrue(!files.isEmpty());
+        String fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(providerMetadataIdentifier));
+        Assert.assertNotNull(fileContent);
 
         deletePath(providerMetadataIdentifier, zookeeperMetadataReport);
-        files = zookeeperMetadataReport.zkClient.getChildren(zookeeperMetadataReport.getCategory(providerMetadataIdentifier));
-        Assert.assertTrue(files.isEmpty());
+        fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(providerMetadataIdentifier));
+        Assert.assertNull(fileContent);
+
 
         providerMetadataIdentifier = storePrivider(zookeeperMetadataReport, interfaceName, version, group, application);
-        files = zookeeperMetadataReport.zkClient.getChildren(zookeeperMetadataReport.getCategory(providerMetadataIdentifier));
-        Assert.assertTrue(files.size() == 1);
-        String result = URL.decode(files.get(0));
+        fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(providerMetadataIdentifier));
+        Assert.assertNotNull(fileContent);
+
         Gson gson = new Gson();
-        FullServiceDefinition fullServiceDefinition = gson.fromJson(result, FullServiceDefinition.class);
+        FullServiceDefinition fullServiceDefinition = gson.fromJson(fileContent, FullServiceDefinition.class);
         Assert.assertEquals(fullServiceDefinition.getParameters().get("paramTest"), "zkTest");
     }
 
@@ -80,18 +81,17 @@ public class ZookeeperMetadataReportTest {
         String application = "vic.zk.md";
         ConsumerMetadataIdentifier consumerMetadataIdentifier = storeConsumer(zookeeperMetadataReport, interfaceName, version, group, application);
 
-        List<String> files = zookeeperMetadataReport.zkClient.getChildren(zookeeperMetadataReport.getCategory(consumerMetadataIdentifier));
-        Assert.assertTrue(!files.isEmpty());
+        String fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(consumerMetadataIdentifier));
+        Assert.assertNotNull(fileContent);
 
         deletePath(consumerMetadataIdentifier, zookeeperMetadataReport);
-        files = zookeeperMetadataReport.zkClient.getChildren(zookeeperMetadataReport.getCategory(consumerMetadataIdentifier));
-        Assert.assertTrue(files.isEmpty());
+        fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(consumerMetadataIdentifier));
+        Assert.assertNull(fileContent);
 
         consumerMetadataIdentifier = storeConsumer(zookeeperMetadataReport, interfaceName, version, group, application);
-        files = zookeeperMetadataReport.zkClient.getChildren(zookeeperMetadataReport.getCategory(consumerMetadataIdentifier));
-        Assert.assertTrue(files.size() == 1);
-        String result = URL.decode(files.get(0));
-        Assert.assertEquals(result, "paramConsumerTest=zkCm");
+        fileContent = zookeeperMetadataReport.zkClient.getContent(zookeeperMetadataReport.getNodePath(consumerMetadataIdentifier));
+        Assert.assertNotNull(fileContent);
+        Assert.assertEquals(fileContent, "paramConsumerTest=zkCm");
     }
 
 
diff --git a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
index 9425222..d0a569f 100644
--- a/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
+++ b/dubbo-registry/dubbo-registry-api/src/test/java/org/apache/dubbo/registry/ZKTools.java
@@ -54,14 +54,14 @@ public class ZKTools {
     public static void testStartupConfig() {
         String str = "dubbo.registry.address=zookeeper://127.0.0.1:2181\n" +
                 "dubbo.registry.group=dubboregistrygroup1\n" +
-                "dubbo.servicestore.address=zookeeper://127.0.0.1:2181\n" +
+                "dubbo.metadatareport.address=zookeeper://127.0.0.1:2181\n" +
                 "dubbo.protocol.port=20990\n" +
                 "dubbo.service.org.apache.dubbo.demo.DemoService.timeout=9999\n";
 
         System.out.println(str);
 
         try {
-            String path = "/dubboregistrygroup1/config/dubbo/dubbo.properties";
+            String path = "/dubboregistrygroup1/config/demo-provider/dubbo.properties";
             if (client.checkExists().forPath(path) == null) {
                 client.create().creatingParentsIfNeeded().forPath(path);
             }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperClient.java
index 25abde4..b6875ee 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/ZookeeperClient.java
@@ -42,4 +42,8 @@ public interface ZookeeperClient {
 
     URL getUrl();
 
+    void create(String path, String content, boolean ephemeral);
+
+    String getContent(String path);
+
 }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java
index 830eb31..e1315e3 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClient.java
@@ -34,11 +34,13 @@ import org.apache.zookeeper.KeeperException.NoNodeException;
 import org.apache.zookeeper.KeeperException.NodeExistsException;
 import org.apache.zookeeper.WatchedEvent;
 
+import java.nio.charset.Charset;
 import java.util.Collections;
 import java.util.List;
 
 public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorWatcher> {
 
+    private final Charset charset = Charset.forName("UTF-8");
     private final CuratorFramework client;
 
     public CuratorZookeeperClient(URL url) {
@@ -93,6 +95,28 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorWatch
     }
 
     @Override
+    protected void createPersistent(String path, String data) {
+        try {
+            byte[] dataBytes = data.getBytes(charset);
+            client.create().forPath(path, dataBytes);
+        } catch (NodeExistsException e) {
+        } catch (Exception e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    protected void createEphemeral(String path, String data) {
+        try {
+            byte[] dataBytes = data.getBytes(charset);
+            client.create().withMode(CreateMode.EPHEMERAL).forPath(path, dataBytes);
+        } catch (NodeExistsException e) {
+        } catch (Exception e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
     public void delete(String path) {
         try {
             client.delete().forPath(path);
@@ -129,6 +153,22 @@ public class CuratorZookeeperClient extends AbstractZookeeperClient<CuratorWatch
     }
 
     @Override
+    public String doGetContent(String path) {
+        try {
+            byte[] dataBytes = client.getData().forPath(path);
+            if(dataBytes == null || dataBytes.length == 0){
+                return null;
+            }
+            return new String(dataBytes, charset);
+        } catch (NodeExistsException e) {
+        } catch (NoNodeException e) {
+        } catch (Exception e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+        return null;
+    }
+
+    @Override
     public void doClose() {
         client.close();
     }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java
index 5da3ab7..852c974 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/support/AbstractZookeeperClient.java
@@ -127,12 +127,38 @@ public abstract class AbstractZookeeperClient<TargetChildListener> implements Zo
         }
     }
 
+    public void create(String path, String content, boolean ephemeral) {
+        if (checkExists(path)) {
+            delete(path);
+        }
+        int i = path.lastIndexOf('/');
+        if (i > 0) {
+            create(path.substring(0, i), false);
+        }
+        if (ephemeral) {
+            createEphemeral(path, content);
+        } else {
+            createPersistent(path, content);
+        }
+    }
+
+    public String getContent(String path) {
+        if (!checkExists(path)) {
+            return null;
+        }
+        return doGetContent(path);
+    }
+
     protected abstract void doClose();
 
     protected abstract void createPersistent(String path);
 
     protected abstract void createEphemeral(String path);
 
+    protected abstract void createPersistent(String path, String data);
+
+    protected abstract void createEphemeral(String path, String data);
+
     protected abstract boolean checkExists(String path);
 
     protected abstract TargetChildListener createTargetChildListener(String path, ChildListener listener);
@@ -141,4 +167,6 @@ public abstract class AbstractZookeeperClient<TargetChildListener> implements Zo
 
     protected abstract void removeTargetChildListener(String path, TargetChildListener listener);
 
+    protected abstract String doGetContent(String path);
+
 }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java
index 17aa372..ae8a3ef 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkClientWrapper.java
@@ -86,6 +86,16 @@ public class ZkClientWrapper {
         client.createEphemeral(path);
     }
 
+    public void createPersistent(String path, String data) {
+        Assert.notNull(client, new IllegalStateException("Zookeeper is not connected yet!"));
+        client.createPersistent(path, data);
+    }
+
+    public void createEphemeral(String path, String data) {
+        Assert.notNull(client, new IllegalStateException("Zookeeper is not connected yet!"));
+        client.createEphemeral(path, data);
+    }
+
     public void delete(String path) {
         Assert.notNull(client, new IllegalStateException("Zookeeper is not connected yet!"));
         client.delete(path);
@@ -96,6 +106,11 @@ public class ZkClientWrapper {
         return client.getChildren(path);
     }
 
+    public String getData(String path) {
+        Assert.notNull(client, new IllegalStateException("Zookeeper is not connected yet!"));
+        return client.readData(path);
+    }
+
     public boolean exists(String path) {
         Assert.notNull(client, new IllegalStateException("Zookeeper is not connected yet!"));
         return client.exists(path);
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClient.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClient.java
index 4f7faeb..0866efb 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClient.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/main/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClient.java
@@ -77,6 +77,22 @@ public class ZkclientZookeeperClient extends AbstractZookeeperClient<IZkChildLis
     }
 
     @Override
+    protected void createPersistent(String path, String data) {
+        try {
+            client.createPersistent(path, data);
+        } catch (ZkNodeExistsException e) {
+        }
+    }
+
+    @Override
+    protected void createEphemeral(String path, String data) {
+        try {
+            client.createEphemeral(path, data);
+        } catch (ZkNodeExistsException e) {
+        }
+    }
+
+    @Override
     public void delete(String path) {
         try {
             client.delete(path);
@@ -108,6 +124,15 @@ public class ZkclientZookeeperClient extends AbstractZookeeperClient<IZkChildLis
     }
 
     @Override
+    public String doGetContent(String path) {
+        try {
+            return client.getData(path);
+        } catch (ZkNoNodeException e) {
+            return null;
+        }
+    }
+
+    @Override
     public void doClose() {
         client.close();
     }
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java
index 39ab70b..95506c7 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/curator/CuratorZookeeperClientTest.java
@@ -30,6 +30,8 @@ import java.util.List;
 import java.util.concurrent.CountDownLatch;
 
 import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 
@@ -113,9 +115,35 @@ public class CuratorZookeeperClientTest {
         assertThat(connected, is(true));
     }
 
+    @Test
+    public void testCreateContent4Persistent() {
+        String path = "/curatorTest4CrContent/content.data";
+        String content = "createContentTest";
+        curatorClient.delete(path);
+        assertThat(curatorClient.checkExists(path), is(false));
+        assertNull(curatorClient.getContent(path));
+
+        curatorClient.create(path, content, false);
+        assertThat(curatorClient.checkExists(path), is(true));
+        assertEquals(curatorClient.getContent(path), content);
+    }
+
+    @Test
+    public void testCreateContent4Temp() {
+        String path = "/curatorTest4CrContent/content.data";
+        String content = "createContentTest";
+        curatorClient.delete(path);
+        assertThat(curatorClient.checkExists(path), is(false));
+        assertNull(curatorClient.getContent(path));
+
+        curatorClient.create(path, content, true);
+        assertThat(curatorClient.checkExists(path), is(true));
+        assertEquals(curatorClient.getContent(path), content);
+    }
+
     @After
     public void tearDown() throws Exception {
         curatorClient.close();
         zkServer.stop();
     }
-}
\ No newline at end of file
+}
diff --git a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClientTest.java b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClientTest.java
index 01eb787..6a45a8f 100644
--- a/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClientTest.java
+++ b/dubbo-remoting/dubbo-remoting-zookeeper/src/test/java/org/apache/dubbo/remoting/zookeeper/zkclient/ZkclientZookeeperClientTest.java
@@ -31,6 +31,8 @@ import java.util.concurrent.CountDownLatch;
 
 import static org.hamcrest.Matchers.hasSize;
 import static org.hamcrest.core.Is.is;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertThat;
 
 public class ZkclientZookeeperClientTest {
@@ -104,9 +106,35 @@ public class ZkclientZookeeperClientTest {
         assertThat(zookeeperClientChildren, hasSize(5));
     }
 
+    @Test
+    public void testCreateContentPersistent() {
+        String path = "/ZkclientZookeeperClient/content.data";
+        String content = "createContentTest";
+        zkclientZookeeperClient.delete(path);
+        assertThat(zkclientZookeeperClient.checkExists(path), is(false));
+        assertNull(zkclientZookeeperClient.getContent(path));
+
+        zkclientZookeeperClient.create(path, content, false);
+        assertThat(zkclientZookeeperClient.checkExists(path), is(true));
+        assertEquals(zkclientZookeeperClient.getContent(path), content);
+    }
+
+    @Test
+    public void testCreateContentTem() {
+        String path = "/ZkclientZookeeperClient/content.data";
+        String content = "createContentTest";
+        zkclientZookeeperClient.delete(path);
+        assertThat(zkclientZookeeperClient.checkExists(path), is(false));
+        assertNull(zkclientZookeeperClient.getContent(path));
+
+        zkclientZookeeperClient.create(path, content, true);
+        assertThat(zkclientZookeeperClient.checkExists(path), is(true));
+        assertEquals(zkclientZookeeperClient.getContent(path), content);
+    }
+
     @After
     public void tearDown() throws Exception {
         zkclientZookeeperClient.close();
         zkServer.stop();
     }
-}
\ No newline at end of file
+}
diff --git a/dubbo-rpc/dubbo-rpc-webservice/src/test/java/org/apache/dubbo/rpc/protocol/webservice/WebserviceProtocolTest.java b/dubbo-rpc/dubbo-rpc-webservice/src/test/java/org/apache/dubbo/rpc/protocol/webservice/WebserviceProtocolTest.java
index 5763026..632e12c 100644
--- a/dubbo-rpc/dubbo-rpc-webservice/src/test/java/org/apache/dubbo/rpc/protocol/webservice/WebserviceProtocolTest.java
+++ b/dubbo-rpc/dubbo-rpc-webservice/src/test/java/org/apache/dubbo/rpc/protocol/webservice/WebserviceProtocolTest.java
@@ -26,7 +26,7 @@ import org.junit.Test;
 import static junit.framework.Assert.assertEquals;
 
 /**
- * @author kimmking
+ *
  */
 
 public class WebserviceProtocolTest {
@@ -68,4 +68,4 @@ public class WebserviceProtocolTest {
     }
 
 
-}
\ No newline at end of file
+}