add register mode test
diff --git a/dubbo-samples-triple/README.MD b/dubbo-samples-triple/README.MD
index 736a402..bb53905 100644
--- a/dubbo-samples-triple/README.MD
+++ b/dubbo-samples-triple/README.MD
@@ -25,11 +25,11 @@
 ##### GRPC --> Dubbo
 
 1. Run `org.apache.dubbo.sample.tri.TriProvider`
-2. Run `org.apache.dubbo.sample.tri.GrpcConsumerTest`
+2. Run `org.apache.dubbo.sample.tri.grpc.GrpcConsumerTest`
 
 ##### Dubbo --> GRPC
 
-1. Run `org.apache.dubbo.sample.tri.GrpcProvider`
+1. Run `org.apache.dubbo.sample.tri.grpc.GrpcProvider`
 2. Run `org.apache.dubbo.sample.tri.TriPbConsumerTest`
 
 
diff --git a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java
index c3fbdd7..b62314c 100644
--- a/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java
+++ b/dubbo-samples-triple/src/main/java/org/apache/dubbo/sample/tri/TriSampleConstants.java
@@ -18,15 +18,26 @@
 package org.apache.dubbo.sample.tri;
 
 
+import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_ALL;
+import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_INSTANCE;
+import static org.apache.dubbo.common.constants.RegistryConstants.DEFAULT_REGISTER_MODE_INTERFACE;
+import static org.apache.dubbo.common.constants.RegistryConstants.REGISTER_MODE_KEY;
+
 public class TriSampleConstants {
 
     // macos 11 later the 50051 is occupied by system (pid=1!!!)
     public static final int SERVER_PORT = 50052;
 
-    public static final int DEFAULT_DUBBO_PORT=20880;
+    public static final int DEFAULT_DUBBO_PORT = 20880;
 
     public static final String ZK_ADDRESS = "zookeeper://127.0.0.1:2181";
 
+    public static final String ZK_ADDRESS_MODE_INSTANCE = "zookeeper://127.0.0.1:2181?" + REGISTER_MODE_KEY + "=" + DEFAULT_REGISTER_MODE_INSTANCE;
+
+    public static final String ZK_ADDRESS_MODE_INTERFACE = "zookeeper://127.0.0.1:2181?" + REGISTER_MODE_KEY + "=" + DEFAULT_REGISTER_MODE_INTERFACE;
+
+    public static final String ZK_ADDRESS_MODE_ALL = "zookeeper://127.0.0.1:2181?" + REGISTER_MODE_KEY + "=" + DEFAULT_REGISTER_MODE_ALL;
+
     public static final String HOST = "127.0.0.1";
 
     public static final String DEFAULT_ADDRESS = "tri://" + HOST + ":" + SERVER_PORT;
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/BasePbConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/BasePbConsumerTest.java
new file mode 100644
index 0000000..3f29262
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/BasePbConsumerTest.java
@@ -0,0 +1,134 @@
+package org.apache.dubbo.sample.tri;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.rpc.RpcContext;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author earthchen
+ * @date 2021/9/9
+ **/
+public abstract class BasePbConsumerTest {
+
+    protected static PbGreeter delegate;
+
+    protected static PbGreeterManual delegateManual;
+//
+//    @BeforeClass
+//    public static void init() {
+//        ReferenceConfig<PbGreeter> ref = new ReferenceConfig<>();
+//        ref.setInterface(PbGreeter.class);
+//        ref.setCheck(false);
+//        ref.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+//        ref.setProtocol(CommonConstants.TRIPLE);
+//        ref.setLazy(true);
+//        ref.setTimeout(10000);
+//
+//        ReferenceConfig<PbGreeterManual> ref2 = new ReferenceConfig<>();
+//        ref2.setInterface(PbGreeterManual.class);
+//        ref2.setCheck(false);
+//        ref2.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+//        ref2.setProtocol(CommonConstants.TRIPLE);
+//        ref2.setLazy(true);
+//        ref2.setTimeout(10000);
+//
+//        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+//        bootstrap.application(new ApplicationConfig("demo-consumer"))
+////                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
+//                .reference(ref)
+//                .reference(ref2)
+//                .start();
+//
+//        delegate = ref.get();
+//        delegateManual = ref2.get();
+//    }
+
+    @Test
+    public void serverStream() throws InterruptedException {
+        int n = 10;
+        CountDownLatch latch = new CountDownLatch(n);
+        final GreeterRequest request = GreeterRequest.newBuilder()
+                .setName("request")
+                .build();
+        delegate.greetServerStream(request, new StdoutStreamObserver<GreeterReply>("sayGreeterServerStream") {
+            @Override
+            public void onNext(GreeterReply data) {
+                super.onNext(data);
+                latch.countDown();
+            }
+        });
+        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void stream() throws InterruptedException {
+        int n = 10;
+        CountDownLatch latch = new CountDownLatch(n);
+        final GreeterRequest request = GreeterRequest.newBuilder()
+                .setName("stream request")
+                .build();
+        final StreamObserver<GreeterRequest> requestObserver = delegate.greetStream(new StdoutStreamObserver<GreeterReply>("sayGreeterStream") {
+            @Override
+            public void onNext(GreeterReply data) {
+                super.onNext(data);
+                latch.countDown();
+            }
+        });
+        for (int i = 0; i < n; i++) {
+            requestObserver.onNext(request);
+        }
+        requestObserver.onCompleted();
+        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void unaryGreeter() {
+        final GreeterReply reply = delegate.greet(GreeterRequest.newBuilder()
+                .setName("name")
+                .build());
+        Assert.assertNotNull(reply);
+    }
+
+
+    @Test(expected = RpcException.class)
+    @Ignore
+    public void clientSendLargeSizeHeader() {
+        StringBuilder sb = new StringBuilder("a");
+        for (int j = 0; j < 15; j++) {
+            sb.append(sb);
+        }
+        sb.setLength(8191);
+        RpcContext.getClientAttachment().setObjectAttachment("large-size-meta", sb.toString());
+        delegate.greet(GreeterRequest.newBuilder().setName("meta").build());
+        RpcContext.getClientAttachment().clearAttachments();
+    }
+
+    @Test
+    public void attachmentTest() {
+        final String key = "user-attachment";
+        final String value = "attachment-value";
+        RpcContext.removeClientAttachment();
+        RpcContext.getClientAttachment().setAttachment(key, value);
+        delegate.greetWithAttachment(GreeterRequest.newBuilder().setName("meta").build());
+        final String returned = (String) RpcContext.getServiceContext().getObjectAttachment(key);
+        Assert.assertEquals(value, returned);
+    }
+
+    @Test
+    public void methodNotFound() {
+        try {
+            delegateManual.methodNonExist(GreeterRequest.newBuilder().setName("meta").build());
+            TimeUnit.SECONDS.sleep(1);
+        } catch (RpcException | InterruptedException e) {
+            Assert.assertTrue(e.getMessage().contains("not found"));
+        }
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/BaseTriWrapConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/BaseTriWrapConsumerTest.java
new file mode 100644
index 0000000..3c9df9d
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/BaseTriWrapConsumerTest.java
@@ -0,0 +1,138 @@
+package org.apache.dubbo.sample.tri;
+
+import org.apache.dubbo.common.stream.StreamObserver;
+import org.apache.dubbo.rpc.RpcException;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+
+public class BaseTriWrapConsumerTest {
+
+    protected static WrapGreeter delegate;
+
+//    @BeforeClass
+//    public static void initStub() {
+//        ReferenceConfig<WrapGreeter> ref = new ReferenceConfig<>();
+//        ref.setInterface(WrapGreeter.class);
+//        ref.setCheck(false);
+//        ref.setTimeout(3000);
+//        ref.setProtocol(CommonConstants.TRIPLE);
+//        ref.setLazy(true);
+//
+//        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+//        bootstrap.application(new ApplicationConfig("demo-consumer"))
+//                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS))
+//                .reference(ref)
+//                .start();
+//        delegate = ref.get();
+//    }
+
+    @Test
+    public void sayHelloUnaryRequestVoid() {
+        Assert.assertEquals("hello!void", delegate.sayHelloRequestVoid());
+    }
+
+    @Test
+    public void sayHelloUnaryResponseVoid() {
+        delegate.sayHelloResponseVoid("void");
+    }
+
+    @Test
+    public void sayHelloUnary() {
+        Assert.assertEquals("hello,unary", delegate.sayHello("unary"));
+    }
+
+    @Test(expected = RpcException.class)
+    public void sayHelloException() {
+        delegate.sayHelloException("exception");
+    }
+
+    @Test
+    public void sayHelloServerStream() throws InterruptedException {
+        int n = 10;
+        CountDownLatch latch = new CountDownLatch(n);
+        delegate.sayHelloServerStream("server stream", new StdoutStreamObserver<String>("sayHelloServerStream") {
+            @Override
+            public void onNext(String data) {
+                super.onNext(data);
+                latch.countDown();
+            }
+        });
+        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+
+
+        delegate.sayHelloServerStream("server stream", new StreamObserver<String>() {
+            @Override
+            public void onNext(String data) {
+                System.out.println(data);
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                throwable.printStackTrace();
+            }
+
+            @Override
+            public void onCompleted() {
+                System.out.println("onCompleted");
+            }
+        });
+
+
+        StreamObserver<String> request = delegate.sayHelloStream(new StreamObserver<String>() {
+            @Override
+            public void onNext(String data) {
+                System.out.println(data);
+            }
+
+            @Override
+            public void onError(Throwable throwable) {
+                throwable.printStackTrace();
+            }
+
+            @Override
+            public void onCompleted() {
+                System.out.println("onCompleted");
+            }
+        });
+        for (int i = 0; i < n; i++) {
+            request.onNext("stream request" + i);
+        }
+        request.onCompleted();
+
+
+    }
+
+    @Test
+    public void sayHelloStream() throws InterruptedException {
+        int n = 10;
+        CountDownLatch latch = new CountDownLatch(n);
+        final StreamObserver<String> request = delegate.sayHelloStream(new StdoutStreamObserver<String>("sayHelloStream") {
+            @Override
+            public void onNext(String data) {
+                super.onNext(data);
+                latch.countDown();
+            }
+        });
+        for (int i = 0; i < n; i++) {
+            request.onNext("stream request");
+        }
+        request.onCompleted();
+        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
+    }
+
+    @Test
+    public void sayHelloLong() {
+        int power = 25;
+        for (int i = 0; i < power; i++) {
+            final int len = (1 << i);
+            final String response = delegate.sayHelloLong(len);
+            System.out.println("Response len:" + response.length());
+            Assert.assertEquals(len, response.length());
+        }
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java
index 74d6d2c..c274649 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriPbConsumerTest.java
@@ -1,34 +1,21 @@
 package org.apache.dubbo.sample.tri;
 
 import org.apache.dubbo.common.constants.CommonConstants;
-import org.apache.dubbo.common.stream.StreamObserver;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
 import org.apache.dubbo.config.bootstrap.DubboBootstrap;
-import org.apache.dubbo.rpc.RpcContext;
-import org.apache.dubbo.rpc.RpcException;
 import org.apache.dubbo.sample.tri.service.PbGreeterManual;
 
-import org.junit.Assert;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.junit.Test;
 
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-public class TriPbConsumerTest {
-
-    private static PbGreeter delegate;
-
-    private static PbGreeterManual delegateManual;
+public class TriPbConsumerTest extends BasePbConsumerTest {
 
     @BeforeClass
     public static void init() {
         ReferenceConfig<PbGreeter> ref = new ReferenceConfig<>();
         ref.setInterface(PbGreeter.class);
         ref.setCheck(false);
-        ref.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
         ref.setProtocol(CommonConstants.TRIPLE);
         ref.setLazy(true);
         ref.setTimeout(10000);
@@ -36,14 +23,13 @@
         ReferenceConfig<PbGreeterManual> ref2 = new ReferenceConfig<>();
         ref2.setInterface(PbGreeterManual.class);
         ref2.setCheck(false);
-        ref2.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
         ref2.setProtocol(CommonConstants.TRIPLE);
         ref2.setLazy(true);
         ref2.setTimeout(10000);
 
         DubboBootstrap bootstrap = DubboBootstrap.getInstance();
         bootstrap.application(new ApplicationConfig("demo-consumer"))
-//                .registry(new RegistryConfig("zookeeper://127.0.0.1:2181"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS))
                 .reference(ref)
                 .reference(ref2)
                 .start();
@@ -51,85 +37,4 @@
         delegate = ref.get();
         delegateManual = ref2.get();
     }
-
-    @Test
-    public void serverStream() throws InterruptedException {
-        int n = 10;
-        CountDownLatch latch = new CountDownLatch(n);
-        final GreeterRequest request = GreeterRequest.newBuilder()
-                .setName("request")
-                .build();
-        delegate.greetServerStream(request, new StdoutStreamObserver<GreeterReply>("sayGreeterServerStream") {
-            @Override
-            public void onNext(GreeterReply data) {
-                super.onNext(data);
-                latch.countDown();
-            }
-        });
-        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void stream() throws InterruptedException {
-        int n = 10;
-        CountDownLatch latch = new CountDownLatch(n);
-        final GreeterRequest request = GreeterRequest.newBuilder()
-                .setName("stream request")
-                .build();
-        final StreamObserver<GreeterRequest> requestObserver = delegate.greetStream(new StdoutStreamObserver<GreeterReply>("sayGreeterStream") {
-            @Override
-            public void onNext(GreeterReply data) {
-                super.onNext(data);
-                latch.countDown();
-            }
-        });
-        for (int i = 0; i < n; i++) {
-            requestObserver.onNext(request);
-        }
-        requestObserver.onCompleted();
-        Assert.assertTrue(latch.await(3, TimeUnit.SECONDS));
-    }
-
-    @Test
-    public void unaryGreeter() {
-        final GreeterReply reply = delegate.greet(GreeterRequest.newBuilder()
-                .setName("name")
-                .build());
-        Assert.assertNotNull(reply);
-    }
-
-
-    @Test(expected = RpcException.class)
-    @Ignore
-    public void clientSendLargeSizeHeader() {
-        StringBuilder sb = new StringBuilder("a");
-        for (int j = 0; j < 15; j++) {
-            sb.append(sb);
-        }
-        sb.setLength(8191);
-        RpcContext.getClientAttachment().setObjectAttachment("large-size-meta", sb.toString());
-        delegate.greet(GreeterRequest.newBuilder().setName("meta").build());
-        RpcContext.getClientAttachment().clearAttachments();
-    }
-
-    @Test
-    public void attachmentTest() {
-        final String key = "user-attachment";
-        final String value = "attachment-value";
-        RpcContext.removeClientAttachment();
-        RpcContext.getClientAttachment().setAttachment(key, value);
-        delegate.greetWithAttachment(GreeterRequest.newBuilder().setName("meta").build());
-        final String returned = (String) RpcContext.getServiceContext().getObjectAttachment(key);
-        Assert.assertEquals(value, returned);
-    }
-
-    @Test
-    public void methodNotFound() {
-        try {
-            delegateManual.methodNonExist(GreeterRequest.newBuilder().setName("meta").build());
-            TimeUnit.SECONDS.sleep(1);
-        } catch (RpcException | InterruptedException e) {
-            Assert.assertTrue(e.getMessage().contains("not found"));
-        }
-    }
 }
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java
index 29656b7..75d360b 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriProvider.java
@@ -13,6 +13,7 @@
 
 
 public class TriProvider {
+
     public static void main(String[] args) {
         ServiceConfig<PbGreeter> pbService = new ServiceConfig<>();
         pbService.setInterface(PbGreeter.class);
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java
index 93f39ef..3d91db9 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/TriWrapConsumerTest.java
@@ -1,5 +1,6 @@
 package org.apache.dubbo.sample.tri;
 
+import org.apache.dubbo.common.constants.CommonConstants;
 import org.apache.dubbo.common.stream.StreamObserver;
 import org.apache.dubbo.config.ApplicationConfig;
 import org.apache.dubbo.config.ReferenceConfig;
@@ -25,7 +26,7 @@
         ref.setInterface(WrapGreeter.class);
         ref.setCheck(false);
         ref.setTimeout(3000);
-        ref.setProtocol("tri");
+        ref.setProtocol(CommonConstants.TRIPLE);
         ref.setLazy(true);
 
         DubboBootstrap bootstrap = DubboBootstrap.getInstance();
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/all/TriAllProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/all/TriAllProvider.java
new file mode 100644
index 0000000..3368479
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/all/TriAllProvider.java
@@ -0,0 +1,44 @@
+package org.apache.dubbo.sample.tri.all;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+import org.apache.dubbo.sample.tri.service.impl.PbGreeterImpl;
+import org.apache.dubbo.sample.tri.service.impl.WrapGreeterImpl;
+
+
+public class TriAllProvider {
+
+    public static void main(String[] args) {
+        ServiceConfig<PbGreeter> pbService = new ServiceConfig<>();
+        pbService.setInterface(PbGreeter.class);
+        PbGreeterImpl greeterImpl = new PbGreeterImpl();
+        pbService.setRef(greeterImpl);
+
+        ServiceConfig<PbGreeterManual> pbManualService = new ServiceConfig<>();
+        pbManualService.setInterface(PbGreeterManual.class);
+        pbManualService.setRef(new PbGreeterImpl());
+
+        ServiceConfig<WrapGreeter> wrapService = new ServiceConfig<>();
+        wrapService.setInterface(WrapGreeter.class);
+        wrapService.setRef(new WrapGreeterImpl());
+
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-provider"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_ALL))
+                .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT))
+                .service(pbService)
+                .service(pbManualService)
+                .service(wrapService)
+                .start()
+                .await();
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppPbConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppPbConsumerTest.java
new file mode 100644
index 0000000..2ff92b3
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppPbConsumerTest.java
@@ -0,0 +1,42 @@
+package org.apache.dubbo.sample.tri.application;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.BasePbConsumerTest;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+
+import org.junit.BeforeClass;
+
+public class TriAppPbConsumerTest extends BasePbConsumerTest {
+
+    @BeforeClass
+    public static void init() {
+        ReferenceConfig<PbGreeter> ref = new ReferenceConfig<>();
+        ref.setInterface(PbGreeter.class);
+        ref.setCheck(false);
+        ref.setProtocol(CommonConstants.TRIPLE);
+        ref.setLazy(true);
+        ref.setTimeout(10000);
+
+        ReferenceConfig<PbGreeterManual> ref2 = new ReferenceConfig<>();
+        ref2.setInterface(PbGreeterManual.class);
+        ref2.setCheck(false);
+        ref2.setProtocol(CommonConstants.TRIPLE);
+        ref2.setLazy(true);
+        ref2.setTimeout(10000);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-consumer"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_INSTANCE))
+                .reference(ref)
+                .reference(ref2)
+                .start();
+        delegate = ref.get();
+        delegateManual = ref2.get();
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppProvider.java
new file mode 100644
index 0000000..214a6f8
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppProvider.java
@@ -0,0 +1,43 @@
+package org.apache.dubbo.sample.tri.application;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+import org.apache.dubbo.sample.tri.service.impl.PbGreeterImpl;
+import org.apache.dubbo.sample.tri.service.impl.WrapGreeterImpl;
+
+
+public class TriAppProvider {
+    public static void main(String[] args) {
+        ServiceConfig<PbGreeter> pbService = new ServiceConfig<>();
+        pbService.setInterface(PbGreeter.class);
+        PbGreeterImpl greeterImpl = new PbGreeterImpl();
+        pbService.setRef(greeterImpl);
+
+        ServiceConfig<PbGreeterManual> pbManualService = new ServiceConfig<>();
+        pbManualService.setInterface(PbGreeterManual.class);
+        pbManualService.setRef(new PbGreeterImpl());
+
+        ServiceConfig<WrapGreeter> wrapService = new ServiceConfig<>();
+        wrapService.setInterface(WrapGreeter.class);
+        wrapService.setRef(new WrapGreeterImpl());
+
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-provider"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_INSTANCE))
+                .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT))
+                .service(pbService)
+                .service(pbManualService)
+                .service(wrapService)
+                .start()
+                .await();
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppWrapConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppWrapConsumerTest.java
new file mode 100644
index 0000000..d56d0d7
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/application/TriAppWrapConsumerTest.java
@@ -0,0 +1,34 @@
+package org.apache.dubbo.sample.tri.application;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.BaseTriWrapConsumerTest;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+
+import org.junit.BeforeClass;
+
+public class TriAppWrapConsumerTest extends BaseTriWrapConsumerTest {
+
+    @BeforeClass
+    public static void initStub() {
+        ReferenceConfig<WrapGreeter> ref = new ReferenceConfig<>();
+        ref.setInterface(WrapGreeter.class);
+        ref.setCheck(false);
+        ref.setTimeout(3000);
+        ref.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+        ref.setProtocol(CommonConstants.TRIPLE);
+        ref.setLazy(true);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-consumer"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_INSTANCE))
+                .reference(ref)
+                .start();
+        delegate = ref.get();
+    }
+
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/direct/TriDirectPbConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/direct/TriDirectPbConsumerTest.java
new file mode 100644
index 0000000..c0b0aef
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/direct/TriDirectPbConsumerTest.java
@@ -0,0 +1,42 @@
+package org.apache.dubbo.sample.tri.direct;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.BasePbConsumerTest;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+
+import org.junit.BeforeClass;
+
+public class TriDirectPbConsumerTest extends BasePbConsumerTest {
+
+    @BeforeClass
+    public static void init() {
+        ReferenceConfig<PbGreeter> ref = new ReferenceConfig<>();
+        ref.setInterface(PbGreeter.class);
+        ref.setCheck(false);
+        ref.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+        ref.setProtocol(CommonConstants.TRIPLE);
+        ref.setLazy(true);
+        ref.setTimeout(10000);
+
+        ReferenceConfig<PbGreeterManual> ref2 = new ReferenceConfig<>();
+        ref2.setInterface(PbGreeterManual.class);
+        ref2.setCheck(false);
+        ref2.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+        ref2.setProtocol(CommonConstants.TRIPLE);
+        ref2.setLazy(true);
+        ref2.setTimeout(10000);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-consumer"))
+                .reference(ref)
+                .reference(ref2)
+                .start();
+        delegate = ref.get();
+        delegateManual = ref2.get();
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/direct/TriDirectWrapConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/direct/TriDirectWrapConsumerTest.java
new file mode 100644
index 0000000..c47afb5
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/direct/TriDirectWrapConsumerTest.java
@@ -0,0 +1,32 @@
+package org.apache.dubbo.sample.tri.direct;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.BaseTriWrapConsumerTest;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+
+import org.junit.BeforeClass;
+
+public class TriDirectWrapConsumerTest extends BaseTriWrapConsumerTest {
+
+    @BeforeClass
+    public static void initStub() {
+        ReferenceConfig<WrapGreeter> ref = new ReferenceConfig<>();
+        ref.setInterface(WrapGreeter.class);
+        ref.setCheck(false);
+        ref.setTimeout(3000);
+        ref.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+        ref.setProtocol(CommonConstants.TRIPLE);
+        ref.setLazy(true);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-consumer"))
+                .reference(ref)
+                .start();
+        delegate = ref.get();
+    }
+
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/grpc/GrpcConsumerTest.java
similarity index 92%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcConsumerTest.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/grpc/GrpcConsumerTest.java
index 684c733..f58dab3 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcConsumerTest.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/grpc/GrpcConsumerTest.java
@@ -1,4 +1,10 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.grpc;
+
+import org.apache.dubbo.sample.tri.GreeterReply;
+import org.apache.dubbo.sample.tri.GreeterRequest;
+import org.apache.dubbo.sample.tri.PbGreeterGrpc;
+import org.apache.dubbo.sample.tri.StdoutStreamObserver;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
 
 import io.grpc.ManagedChannel;
 import io.grpc.ManagedChannelBuilder;
@@ -38,7 +44,6 @@
         TimeUnit.SECONDS.sleep(1);
     }
 
-
     @Test
     public void serverStream() throws InterruptedException {
         int n = 10;
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/grpc/GrpcProvider.java
similarity index 96%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/grpc/GrpcProvider.java
index 0559fcf..6287b4e 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcProvider.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/grpc/GrpcProvider.java
@@ -1,5 +1,6 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.grpc;
 
+import org.apache.dubbo.sample.tri.TriSampleConstants;
 import org.apache.dubbo.sample.tri.service.impl.GrpcPbGreeterImpl;
 import org.apache.dubbo.sample.tri.service.impl.PbGreeterImpl;
 
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/helper/GrpcStreamObserverAdapter.java
similarity index 93%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/helper/GrpcStreamObserverAdapter.java
index af5985e..91cbef4 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/GrpcStreamObserverAdapter.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/helper/GrpcStreamObserverAdapter.java
@@ -1,4 +1,4 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.helper;
 
 
 import io.grpc.stub.StreamObserver;
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/StreamObserverAdapter.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/helper/StreamObserverAdapter.java
similarity index 92%
rename from dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/StreamObserverAdapter.java
rename to dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/helper/StreamObserverAdapter.java
index 5255c6e..614f213 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/StreamObserverAdapter.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/helper/StreamObserverAdapter.java
@@ -1,4 +1,4 @@
-package org.apache.dubbo.sample.tri;
+package org.apache.dubbo.sample.tri.helper;
 
 import org.apache.dubbo.common.stream.StreamObserver;
 
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfacePbConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfacePbConsumerTest.java
new file mode 100644
index 0000000..aea094d
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfacePbConsumerTest.java
@@ -0,0 +1,42 @@
+package org.apache.dubbo.sample.tri.inter;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.BasePbConsumerTest;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+
+import org.junit.BeforeClass;
+
+public class TriInterfacePbConsumerTest extends BasePbConsumerTest {
+
+    @BeforeClass
+    public static void init() {
+        ReferenceConfig<PbGreeter> ref = new ReferenceConfig<>();
+        ref.setInterface(PbGreeter.class);
+        ref.setCheck(false);
+        ref.setProtocol(CommonConstants.TRIPLE);
+        ref.setLazy(true);
+        ref.setTimeout(10000);
+
+        ReferenceConfig<PbGreeterManual> ref2 = new ReferenceConfig<>();
+        ref2.setInterface(PbGreeterManual.class);
+        ref2.setCheck(false);
+        ref2.setProtocol(CommonConstants.TRIPLE);
+        ref2.setLazy(true);
+        ref2.setTimeout(10000);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-consumer"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_INTERFACE))
+                .reference(ref)
+                .reference(ref2)
+                .start();
+        delegate = ref.get();
+        delegateManual = ref2.get();
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfaceProvider.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfaceProvider.java
new file mode 100644
index 0000000..c01e98e
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfaceProvider.java
@@ -0,0 +1,44 @@
+package org.apache.dubbo.sample.tri.inter;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ProtocolConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.ServiceConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.PbGreeter;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.PbGreeterManual;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+import org.apache.dubbo.sample.tri.service.impl.PbGreeterImpl;
+import org.apache.dubbo.sample.tri.service.impl.WrapGreeterImpl;
+
+
+public class TriInterfaceProvider {
+
+    public static void main(String[] args) {
+        ServiceConfig<PbGreeter> pbService = new ServiceConfig<>();
+        pbService.setInterface(PbGreeter.class);
+        PbGreeterImpl greeterImpl = new PbGreeterImpl();
+        pbService.setRef(greeterImpl);
+
+        ServiceConfig<PbGreeterManual> pbManualService = new ServiceConfig<>();
+        pbManualService.setInterface(PbGreeterManual.class);
+        pbManualService.setRef(new PbGreeterImpl());
+
+        ServiceConfig<WrapGreeter> wrapService = new ServiceConfig<>();
+        wrapService.setInterface(WrapGreeter.class);
+        wrapService.setRef(new WrapGreeterImpl());
+
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-provider"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_INTERFACE))
+                .protocol(new ProtocolConfig(CommonConstants.TRIPLE, TriSampleConstants.SERVER_PORT))
+                .service(pbService)
+                .service(pbManualService)
+                .service(wrapService)
+                .start()
+                .await();
+    }
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfaceWrapConsumerTest.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfaceWrapConsumerTest.java
new file mode 100644
index 0000000..e69b372
--- /dev/null
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/inter/TriInterfaceWrapConsumerTest.java
@@ -0,0 +1,34 @@
+package org.apache.dubbo.sample.tri.inter;
+
+import org.apache.dubbo.common.constants.CommonConstants;
+import org.apache.dubbo.config.ApplicationConfig;
+import org.apache.dubbo.config.ReferenceConfig;
+import org.apache.dubbo.config.RegistryConfig;
+import org.apache.dubbo.config.bootstrap.DubboBootstrap;
+import org.apache.dubbo.sample.tri.BaseTriWrapConsumerTest;
+import org.apache.dubbo.sample.tri.TriSampleConstants;
+import org.apache.dubbo.sample.tri.service.WrapGreeter;
+
+import org.junit.BeforeClass;
+
+public class TriInterfaceWrapConsumerTest extends BaseTriWrapConsumerTest {
+
+    @BeforeClass
+    public static void initStub() {
+        ReferenceConfig<WrapGreeter> ref = new ReferenceConfig<>();
+        ref.setInterface(WrapGreeter.class);
+        ref.setCheck(false);
+        ref.setTimeout(3000);
+        ref.setUrl(TriSampleConstants.DEFAULT_ADDRESS);
+        ref.setProtocol(CommonConstants.TRIPLE);
+        ref.setLazy(true);
+
+        DubboBootstrap bootstrap = DubboBootstrap.getInstance();
+        bootstrap.application(new ApplicationConfig("demo-consumer"))
+                .registry(new RegistryConfig(TriSampleConstants.ZK_ADDRESS_MODE_INTERFACE))
+                .reference(ref)
+                .start();
+        delegate = ref.get();
+    }
+
+}
diff --git a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java
index 30f0c7b..e0736e8 100644
--- a/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java
+++ b/dubbo-samples-triple/src/test/java/org/apache/dubbo/sample/tri/service/impl/GrpcPbGreeterImpl.java
@@ -2,10 +2,10 @@
 
 import org.apache.dubbo.sample.tri.GreeterReply;
 import org.apache.dubbo.sample.tri.GreeterRequest;
-import org.apache.dubbo.sample.tri.GrpcStreamObserverAdapter;
+import org.apache.dubbo.sample.tri.helper.GrpcStreamObserverAdapter;
 import org.apache.dubbo.sample.tri.PbGreeter;
 import org.apache.dubbo.sample.tri.PbGreeterGrpc;
-import org.apache.dubbo.sample.tri.StreamObserverAdapter;
+import org.apache.dubbo.sample.tri.helper.StreamObserverAdapter;
 
 import io.grpc.stub.StreamObserver;