You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by la...@apache.org on 2021/09/07 01:36:04 UTC

[dubbo-go-samples] branch config-enhance updated: Tst: Add integrated tests for rpc/triple/pb (#227)

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

laurence pushed a commit to branch config-enhance
in repository https://gitbox.apache.org/repos/asf/dubbo-go-samples.git


The following commit(s) were added to refs/heads/config-enhance by this push:
     new 49da12c  Tst: Add integrated tests for rpc/triple/pb (#227)
49da12c is described below

commit 49da12cd2ad3da17176d26e4523e540724ace34c
Author: XavierNiu <a...@nxw.name>
AuthorDate: Tue Sep 7 09:35:58 2021 +0800

    Tst: Add integrated tests for rpc/triple/pb (#227)
    
    * update docs
    
    * refactor rpc/triple/pb/dubbogo-grpc
    
    * integrated test for dubbogo-grpc
    
    * unify proto file
    
    * fix import paths
    
    * resolve proto namespace conflict
    
    * adjust directory structure
    
    * adjust to standard dir structure
    
    * adjust integrated test name of dubbogo-rpc
    
    * adjust to standard dir structure
    
    * reopen all integrated tests
    
    * add run.xml
---
 .run/rpc/triple-pb-dubbogo-grpc-go-client.run.xml  |  14 +
 .run/rpc/triple-pb-dubbogo-grpc-go-server.run.xml  |  14 +
 .run/rpc/triple-pb-dubbogo-java-go-client.run.xml  |  14 +
 .run/rpc/triple-pb-dubbogo-java-go-server.run.xml  |  14 +
 .run/triple/gojava-go-client.run.xml               |  15 -
 .run/triple/gojava-go-server.run.xml               |  15 -
 .run/triple/triple-stream-client.run.xml           |  15 -
 .run/triple/triple-unary-client.run.xml            |  15 -
 api/generate.sh                                    |   0
 api/samples_api.pb.go                              |  88 ++++-
 api/samples_api.proto                              |   4 +
 .../integration/grpc_test_proto/helloworld.pb.go   | 412 --------------------
 .../pb/dubbogo-grpc/tests/integration/main_test.go |   6 +-
 .../tests/integration/userprovider_test.go         |   8 +-
 .../pb/dubbogo-java/docker/docker-compose.yml      |   9 -
 .../pb/dubbogo-java/tests/integration/main_test.go |  52 ---
 .../tests/integration/userprovider_test.go         |  49 ---
 rpc/triple/README.md                               |  30 +-
 rpc/triple/README_zh.md                            |  30 +-
 rpc/triple/pb/dubbogo-grpc/README.md               | 187 ++-------
 rpc/triple/pb/dubbogo-grpc/README_zh.md            | 191 ++--------
 .../dubbogo-client => go-client}/cmd/client.go     |  30 +-
 .../dubbogo-client => go-client}/conf/dubbogo.yml  |   2 +-
 .../dubbogo-server => go-server}/cmd/server.go     |   2 +-
 .../dubbogo-server => go-server}/conf/dubbogo.yml  |   2 +-
 .../dubbogo-server => go-server}/pkg/greeter.go    |   2 +-
 .../grpcgo-client => grpc-client}/main.go          |  39 +-
 .../pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go |  51 +--
 .../pb/dubbogo-grpc/protobuf/grpc/helloworld.proto |   2 +-
 .../protobuf/grpc/helloworld_grpc.pb.go            |  23 +-
 .../dubbogo-grpc/protobuf/triple/helloworld.pb.go  | 417 ---------------------
 .../dubbogo-grpc/protobuf/triple/helloworld.proto  |  40 --
 .../pb/dubbogo-grpc/protobuf/triple/protobuf.mk    |  26 --
 .../pb/dubbogo-grpc/server/grpcgo-server/main.go   |  93 -----
 .../unary-client/dubbogo-client/cmd/client.go      |  66 ----
 .../unary-client/dubbogo-client/conf/dubbogo.yml   |  10 -
 .../unary-client/grpcgo-client/main.go             |  57 ---
 rpc/triple/pb/dubbogo-java/README.md               |  25 +-
 rpc/triple/pb/dubbogo-java/README_zh.md            |  23 +-
 rpc/triple/pb/dubbogo-java/go-client/cmd/client.go |   2 +-
 .../pb/dubbogo-java/go-server/pkg/greeter.go       |   2 +-
 .../pb/dubbogo-java/protobuf/helloworld.pb.go      | 322 ----------------
 .../pb/dubbogo-java/protobuf/helloworld.proto      |  39 --
 rpc/triple/pb/dubbogo-java/protobuf/protobuf.mk    |  26 --
 start_integrate_test.sh                            |   1 +
 45 files changed, 340 insertions(+), 2144 deletions(-)

diff --git a/.run/rpc/triple-pb-dubbogo-grpc-go-client.run.xml b/.run/rpc/triple-pb-dubbogo-grpc-go-client.run.xml
new file mode 100644
index 0000000..49fbc0f
--- /dev/null
+++ b/.run/rpc/triple-pb-dubbogo-grpc-go-client.run.xml
@@ -0,0 +1,14 @@
+<component name="ProjectRunConfigurationManager">
+    <configuration default="false" name="triple-pb-dubbogo-grpc-go-client" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="rpc">
+        <module name="dubbo-go-samples" />
+        <working_directory value="$PROJECT_DIR$" />
+        <envs>
+            <env name="DUBBO_GO_CONFIG_PATH" value="$PROJECT_DIR$/rpc/triple/pb/dubbogo-grpc/go-client/conf/dubbogo.yml" />
+        </envs>
+        <kind value="PACKAGE" />
+        <filePath value="$PROJECT_DIR$/general/dubbo3/rpc/triple/pb/dubbogo-grpc/go-client/cmd/client.go" />
+        <package value="github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/go-client/cmd" />
+        <directory value="$PROJECT_DIR$" />
+        <method v="2" />
+    </configuration>
+</component>
\ No newline at end of file
diff --git a/.run/rpc/triple-pb-dubbogo-grpc-go-server.run.xml b/.run/rpc/triple-pb-dubbogo-grpc-go-server.run.xml
new file mode 100644
index 0000000..09ab314
--- /dev/null
+++ b/.run/rpc/triple-pb-dubbogo-grpc-go-server.run.xml
@@ -0,0 +1,14 @@
+<component name="ProjectRunConfigurationManager">
+    <configuration default="false" name="triple-pb-dubbogo-grpc-go-server" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="rpc">
+        <module name="dubbo-go-samples" />
+        <working_directory value="$PROJECT_DIR$" />
+        <envs>
+            <env name="DUBBO_GO_CONFIG_PATH" value="$PROJECT_DIR$/rpc/triple/pb/dubbogo-grpc/go-server/conf/dubbogo.yml" />
+        </envs>
+        <kind value="PACKAGE" />
+        <filePath value="$PROJECT_DIR$/general/dubbo3/rpc/triple/pb/dubbogo-grpc/go-server/cmd/server.go" />
+        <package value="github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/go-server/cmd" />
+        <directory value="$PROJECT_DIR$" />
+        <method v="2" />
+    </configuration>
+</component>
\ No newline at end of file
diff --git a/.run/rpc/triple-pb-dubbogo-java-go-client.run.xml b/.run/rpc/triple-pb-dubbogo-java-go-client.run.xml
new file mode 100644
index 0000000..4b21cc1
--- /dev/null
+++ b/.run/rpc/triple-pb-dubbogo-java-go-client.run.xml
@@ -0,0 +1,14 @@
+<component name="ProjectRunConfigurationManager">
+    <configuration default="false" name="triple-pb-dubbogo-java-go-client" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="rpc">
+        <module name="dubbo-go-samples" />
+        <working_directory value="$PROJECT_DIR$" />
+        <envs>
+            <env name="DUBBO_GO_CONFIG_PATH" value="$PROJECT_DIR$/rpc/triple/pb/dubbogo-java/go-client/conf/dubbogo.yml" />
+        </envs>
+        <kind value="PACKAGE" />
+        <filePath value="$PROJECT_DIR$/general/dubbo3/rpc/triple/pb/dubbogo-java/go-client/cmd/client.go" />
+        <package value="github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-java/go-client/cmd" />
+        <directory value="$PROJECT_DIR$" />
+        <method v="2" />
+    </configuration>
+</component>
\ No newline at end of file
diff --git a/.run/rpc/triple-pb-dubbogo-java-go-server.run.xml b/.run/rpc/triple-pb-dubbogo-java-go-server.run.xml
new file mode 100644
index 0000000..564d9a7
--- /dev/null
+++ b/.run/rpc/triple-pb-dubbogo-java-go-server.run.xml
@@ -0,0 +1,14 @@
+<component name="ProjectRunConfigurationManager">
+    <configuration default="false" name="triple-pb-dubbogo-java-go-server" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="rpc">
+        <module name="dubbo-go-samples" />
+        <working_directory value="$PROJECT_DIR$" />
+        <envs>
+            <env name="DUBBO_GO_CONFIG_PATH" value="$PROJECT_DIR$/rpc/triple/pb/dubbogo-java/go-server/conf/dubbogo.yml" />
+        </envs>
+        <kind value="PACKAGE" />
+        <filePath value="$PROJECT_DIR$/general/dubbo3/rpc/triple/pb/dubbogo-java/go-server/cmd/server.go" />
+        <package value="github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-java/go-server/cmd" />
+        <directory value="$PROJECT_DIR$" />
+        <method v="2" />
+    </configuration>
+</component>
\ No newline at end of file
diff --git a/.run/triple/gojava-go-client.run.xml b/.run/triple/gojava-go-client.run.xml
deleted file mode 100644
index 1f38a81..0000000
--- a/.run/triple/gojava-go-client.run.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="gojava-go-client" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="triple">
-    <module name="dubbo-go-samples" />
-    <working_directory value="$PROJECT_DIR$" />
-    <envs>
-      <env name="APP_LOG_CONF_FILE" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-java/go-client/conf/log.yml" />
-      <env name="CONF_CONSUMER_FILE_PATH" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-java/go-client/conf/client.yml" />
-    </envs>
-    <kind value="PACKAGE" />
-    <package value="github.com/apache/dubbo-go-samples/rpc/dubbo3/api/dubbogo-java/go-client/cmd" />
-    <directory value="$PROJECT_DIR$" />
-    <filePath value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-java/go-client/cmd/client.go" />
-    <method v="2" />
-  </configuration>
-</component>
\ No newline at end of file
diff --git a/.run/triple/gojava-go-server.run.xml b/.run/triple/gojava-go-server.run.xml
deleted file mode 100644
index 4e00c18..0000000
--- a/.run/triple/gojava-go-server.run.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="gojava-go-server" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="triple">
-    <module name="dubbo-go-samples" />
-    <working_directory value="$PROJECT_DIR$" />
-    <envs>
-      <env name="APP_LOG_CONF_FILE" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-java/go-server/conf/log.yml" />
-      <env name="CONF_PROVIDER_FILE_PATH" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-java/go-server/conf/server.yml" />
-    </envs>
-    <kind value="PACKAGE" />
-    <package value="github.com/apache/dubbo-go-samples/rpc/dubbo3/api/dubbogo-java/go-server/cmd" />
-    <directory value="$PROJECT_DIR$" />
-    <filePath value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-java/go-server/cmd/server.go" />
-    <method v="2" />
-  </configuration>
-</component>
\ No newline at end of file
diff --git a/.run/triple/triple-stream-client.run.xml b/.run/triple/triple-stream-client.run.xml
deleted file mode 100644
index 259ba0b..0000000
--- a/.run/triple/triple-stream-client.run.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="triple-stream-client" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="triple">
-    <module name="dubbo-go-samples" />
-    <working_directory value="$PROJECT_DIR$" />
-    <envs>
-      <env name="APP_LOG_CONF_FILE" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-grpc/stream-client/dubbogo-client/conf/log.yml" />
-      <env name="CONF_CONSUMER_FILE_PATH" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-grpc/stream-client/dubbogo-client/conf/client.yml" />
-    </envs>
-    <kind value="PACKAGE" />
-    <package value="github.com/apache/dubbo-go-samples/rpc/dubbo3/api/dubbogo-grpc/stream-client/dubbogo-client/cmd" />
-    <directory value="$PROJECT_DIR$" />
-    <filePath value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-grpc/stream-client/dubbogo-client/cmd/client.go" />
-    <method v="2" />
-  </configuration>
-</component>
\ No newline at end of file
diff --git a/.run/triple/triple-unary-client.run.xml b/.run/triple/triple-unary-client.run.xml
deleted file mode 100644
index 1b397b9..0000000
--- a/.run/triple/triple-unary-client.run.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<component name="ProjectRunConfigurationManager">
-  <configuration default="false" name="triple-unary-client" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="triple">
-    <module name="dubbo-go-samples" />
-    <working_directory value="$PROJECT_DIR$" />
-    <envs>
-      <env name="APP_LOG_CONF_FILE" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-grpc/unary-client/dubbogo-client/conf/log.yml" />
-      <env name="CONF_CONSUMER_FILE_PATH" value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-grpc/unary-client/dubbogo-client/conf/client.yml" />
-    </envs>
-    <kind value="PACKAGE" />
-    <package value="github.com/apache/dubbo-go-samples/rpc/dubbo3/api/dubbogo-grpc/unary-client/dubbogo-client/cmd" />
-    <directory value="$PROJECT_DIR$" />
-    <filePath value="$PROJECT_DIR$/general/dubbo3/api/dubbogo-grpc/unary-client/dubbogo-client/cmd/client.go" />
-    <method v="2" />
-  </configuration>
-</component>
\ No newline at end of file
diff --git a/api/generate.sh b/api/generate.sh
old mode 100644
new mode 100755
diff --git a/api/samples_api.pb.go b/api/samples_api.pb.go
index a8ae83b..63e182d 100644
--- a/api/samples_api.pb.go
+++ b/api/samples_api.pb.go
@@ -135,17 +135,19 @@ func init() {
 func init() { proto.RegisterFile("samples_api.proto", fileDescriptor_67d196fe99e714eb) }
 
 var fileDescriptor_67d196fe99e714eb = []byte{
-	// 160 bytes of a gzipped FileDescriptorProto
+	// 189 bytes of a gzipped FileDescriptorProto
 	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2c, 0x4e, 0xcc, 0x2d,
 	0xc8, 0x49, 0x2d, 0x8e, 0x4f, 0x2c, 0xc8, 0xd4, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x4e,
 	0x2c, 0xc8, 0x54, 0x52, 0xe2, 0xe2, 0xf1, 0x48, 0xcd, 0xc9, 0xc9, 0x0f, 0x4a, 0x2d, 0x2c, 0x4d,
 	0x2d, 0x2e, 0x11, 0x12, 0xe2, 0x62, 0xc9, 0x4b, 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0,
 	0x0c, 0x02, 0xb3, 0x95, 0x6c, 0xb8, 0x58, 0x42, 0x8b, 0x53, 0x8b, 0xb0, 0xc9, 0x09, 0xf1, 0x71,
 	0x31, 0x65, 0xa6, 0x48, 0x30, 0x81, 0x45, 0x98, 0x32, 0x53, 0x84, 0x04, 0xb8, 0x98, 0x13, 0xd3,
-	0x53, 0x25, 0x98, 0x15, 0x18, 0x35, 0x58, 0x83, 0x40, 0x4c, 0x23, 0x53, 0x2e, 0x76, 0xf7, 0xa2,
+	0x53, 0x25, 0x98, 0x15, 0x18, 0x35, 0x58, 0x83, 0x40, 0x4c, 0xa3, 0x6c, 0x2e, 0x76, 0xf7, 0xa2,
 	0xd4, 0xd4, 0x92, 0xd4, 0x22, 0x21, 0x2d, 0x2e, 0x8e, 0xe0, 0xc4, 0x4a, 0xb0, 0x7d, 0x42, 0x82,
-	0x7a, 0x20, 0x97, 0x20, 0xdb, 0x2d, 0xc5, 0x09, 0x16, 0x02, 0x59, 0xa5, 0xc4, 0x90, 0xc4, 0x06,
-	0x76, 0xa4, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0x46, 0x82, 0xe3, 0x9f, 0xb9, 0x00, 0x00, 0x00,
+	0x7a, 0x20, 0x97, 0x20, 0xdb, 0x2d, 0xc5, 0x09, 0x16, 0x02, 0x59, 0xa5, 0xc4, 0x20, 0x64, 0xc2,
+	0xc5, 0x07, 0x53, 0x1b, 0x5c, 0x52, 0x94, 0x9a, 0x98, 0x4b, 0x48, 0x87, 0x06, 0xa3, 0x01, 0xa3,
+	0x13, 0x47, 0x14, 0x9b, 0x9e, 0xbe, 0x75, 0x62, 0x41, 0x66, 0x12, 0x1b, 0xd8, 0x93, 0xc6, 0x80,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0x0e, 0x66, 0xf8, 0x73, 0xf9, 0x00, 0x00, 0x00,
 }
 
 type greeterDubbo3Client struct {
@@ -160,6 +162,15 @@ func (c *greeterDubbo3Client) SayHello(ctx context.Context, in *HelloRequest, op
 	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
 	return out, c.cc.Invoke(ctx, "/"+interfaceKey+"/SayHello", in, out)
 }
+func (c *greeterDubbo3Client) SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
+	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
+	stream, err := c.cc.NewStream(ctx, "/"+interfaceKey+"/SayHelloStream", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &greeterSayHelloStreamClient{stream}
+	return x, nil
+}
 
 // GreeterClientImpl is the client API for Greeter service.
 //
@@ -167,11 +178,15 @@ func (c *greeterDubbo3Client) SayHello(ctx context.Context, in *HelloRequest, op
 type GreeterClient interface {
 	// Sends a greeting
 	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, common.ErrorWithAttachment)
+	// Sends a greeting via stream
+	SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error)
 }
 
 type GreeterClientImpl struct {
 	// Sends a greeting
 	SayHello func(ctx context.Context, in *HelloRequest) (*User, error)
+	// Sends a greeting via stream
+	SayHelloStream func(ctx context.Context) (Greeter_SayHelloStreamClient, error)
 }
 
 type Greeter_SayHelloClient interface {
@@ -194,6 +209,28 @@ func (x *greeterSayHelloClient) CloseAndRecv() (*User, error) {
 	return m, nil
 }
 
+type Greeter_SayHelloStreamClient interface {
+	Send(*HelloRequest) error
+	Recv() (*User, error)
+	grpc.ClientStream
+}
+
+type greeterSayHelloStreamClient struct {
+	grpc.ClientStream
+}
+
+func (x *greeterSayHelloStreamClient) Send(m *HelloRequest) error {
+	return x.ClientStream.SendMsg(m)
+}
+
+func (x *greeterSayHelloStreamClient) Recv() (*User, error) {
+	m := new(User)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
 func (c *GreeterClientImpl) Reference() string {
 	return "greeterImpl"
 }
@@ -206,6 +243,8 @@ func (c *GreeterClientImpl) GetDubboStub(cc *dubbo3.TripleConn) GreeterClient {
 type GreeterServer interface {
 	// Sends a greeting
 	SayHello(context.Context, *HelloRequest) (*User, error)
+	// Sends a greeting via stream
+	SayHelloStream(Greeter_SayHelloStreamServer) error
 }
 
 type GreeterProviderBase struct {
@@ -248,6 +287,38 @@ func _Triple_Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec
 	return interceptor(ctx, in, info, handler)
 }
 
+func _Triple_Greeter_SayHelloStream_Handler(srv interface{}, stream grpc.ServerStream) error {
+	_, ok := srv.(dgrpc.Dubbo3GrpcService)
+	invo := invocation.NewRPCInvocation("SayHelloStream", nil, nil)
+	if !ok {
+		fmt.Println(invo)
+		return nil
+	}
+	return srv.(GreeterServer).SayHelloStream(&greeterSayHelloStreamServer{stream})
+}
+
+type Greeter_SayHelloStreamServer interface {
+	Send(*User) error
+	Recv() (*HelloRequest, error)
+	grpc.ServerStream
+}
+
+type greeterSayHelloStreamServer struct {
+	grpc.ServerStream
+}
+
+func (x *greeterSayHelloStreamServer) Send(m *User) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func (x *greeterSayHelloStreamServer) Recv() (*HelloRequest, error) {
+	m := new(HelloRequest)
+	if err := x.ServerStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
 func (s *GreeterProviderBase) ServiceDesc() *grpc.ServiceDesc {
 	return &grpc.ServiceDesc{
 		ServiceName: "api.Greeter",
@@ -258,7 +329,14 @@ func (s *GreeterProviderBase) ServiceDesc() *grpc.ServiceDesc {
 				Handler:    _Triple_Greeter_SayHello_Handler,
 			},
 		},
-		Streams:  []grpc.StreamDesc{},
+		Streams: []grpc.StreamDesc{
+			{
+				StreamName:    "SayHelloStream",
+				Handler:       _Triple_Greeter_SayHelloStream_Handler,
+				ServerStreams: true,
+				ClientStreams: true,
+			},
+		},
 		Metadata: "samples_api.proto",
 	}
 }
diff --git a/api/samples_api.proto b/api/samples_api.proto
index 281a9d1..3620d5f 100644
--- a/api/samples_api.proto
+++ b/api/samples_api.proto
@@ -18,10 +18,14 @@
 syntax = "proto3";
 package api;
 
+option go_package = "./;api";
+
 // The greeting service definition.
 service Greeter {
   // Sends a greeting
   rpc SayHello (HelloRequest) returns (User) {}
+  // Sends a greeting via stream
+  rpc SayHelloStream (stream HelloRequest) returns (stream User) {}
 }
 
 // The request message containing the user's name.
diff --git a/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/grpc_test_proto/helloworld.pb.go b/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/grpc_test_proto/helloworld.pb.go
deleted file mode 100644
index ef09f0a..0000000
--- a/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/grpc_test_proto/helloworld.pb.go
+++ /dev/null
@@ -1,412 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: helloworld.proto
-
-package grpc_test_proto
-
-import (
-	context "context"
-	fmt "fmt"
-	math "math"
-)
-
-import (
-	"dubbo.apache.org/dubbo-go/v3/protocol"
-	dgrpc "dubbo.apache.org/dubbo-go/v3/protocol/dubbo3"
-	"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
-
-	tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
-	dubbo3 "github.com/dubbogo/triple/pkg/triple"
-
-	proto "github.com/golang/protobuf/proto"
-
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-)
-
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// The request message containing the user's name.
-type HelloRequest struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *HelloRequest) Reset()         { *m = HelloRequest{} }
-func (m *HelloRequest) String() string { return proto.CompactTextString(m) }
-func (*HelloRequest) ProtoMessage()    {}
-func (*HelloRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_17b8c58d586b62f2, []int{0}
-}
-
-func (m *HelloRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_HelloRequest.Unmarshal(m, b)
-}
-func (m *HelloRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_HelloRequest.Marshal(b, m, deterministic)
-}
-func (m *HelloRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_HelloRequest.Merge(m, src)
-}
-func (m *HelloRequest) XXX_Size() int {
-	return xxx_messageInfo_HelloRequest.Size(m)
-}
-func (m *HelloRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_HelloRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_HelloRequest proto.InternalMessageInfo
-
-func (m *HelloRequest) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-// The response message containing the greetings
-type User struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Id                   string   `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
-	Age                  int32    `protobuf:"varint,3,opt,name=age,proto3" json:"age,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *User) Reset()         { *m = User{} }
-func (m *User) String() string { return proto.CompactTextString(m) }
-func (*User) ProtoMessage()    {}
-func (*User) Descriptor() ([]byte, []int) {
-	return fileDescriptor_17b8c58d586b62f2, []int{1}
-}
-
-func (m *User) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_User.Unmarshal(m, b)
-}
-func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_User.Marshal(b, m, deterministic)
-}
-func (m *User) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_User.Merge(m, src)
-}
-func (m *User) XXX_Size() int {
-	return xxx_messageInfo_User.Size(m)
-}
-func (m *User) XXX_DiscardUnknown() {
-	xxx_messageInfo_User.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_User proto.InternalMessageInfo
-
-func (m *User) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *User) GetId() string {
-	if m != nil {
-		return m.Id
-	}
-	return ""
-}
-
-func (m *User) GetAge() int32 {
-	if m != nil {
-		return m.Age
-	}
-	return 0
-}
-
-var fileDescriptor_17b8c58d586b62f2 = []byte{
-	// 178 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x48, 0xcd, 0xc9,
-	0xc9, 0x2f, 0xcf, 0x2f, 0xca, 0x49, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53,
-	0x49, 0xa5, 0x69, 0x4a, 0x4a, 0x5c, 0x3c, 0x1e, 0x20, 0xd9, 0xa0, 0xd4, 0xc2, 0xd2, 0xd4, 0xe2,
-	0x12, 0x21, 0x21, 0x2e, 0x96, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20,
-	0x30, 0x5b, 0xc9, 0x86, 0x8b, 0x25, 0xb4, 0x38, 0xb5, 0x08, 0x9b, 0x9c, 0x10, 0x1f, 0x17, 0x53,
-	0x66, 0x8a, 0x04, 0x13, 0x58, 0x84, 0x29, 0x33, 0x45, 0x48, 0x80, 0x8b, 0x39, 0x31, 0x3d, 0x55,
-	0x82, 0x59, 0x81, 0x51, 0x83, 0x35, 0x08, 0xc4, 0x34, 0xaa, 0xe7, 0x62, 0x77, 0x2f, 0x4a, 0x4d,
-	0x2d, 0x49, 0x2d, 0x12, 0x32, 0xe1, 0xe2, 0x08, 0x4e, 0xac, 0x04, 0xdb, 0x27, 0x24, 0xa6, 0x07,
-	0x73, 0x83, 0x1e, 0xb2, 0x03, 0xa4, 0xf8, 0x10, 0xe2, 0x20, 0x4b, 0x95, 0x18, 0x84, 0xec, 0xb8,
-	0xf8, 0x60, 0xba, 0x82, 0x4b, 0x8a, 0x52, 0x13, 0x73, 0x89, 0xd7, 0xab, 0xc1, 0x68, 0xc0, 0x98,
-	0xc4, 0x06, 0x16, 0x34, 0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x98, 0x59, 0x9f, 0x6b, 0x07, 0x01,
-	0x00, 0x00,
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConnInterface
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
-
-// GreeterClient is the client API for Greeter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GreeterClient interface {
-	// Sends a greeting
-	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error)
-	SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error)
-}
-
-type greeterClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
-	return &greeterClient{cc}
-}
-
-func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	err := c.cc.Invoke(ctx, "/protobuf.Greeter/SayHello", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *greeterClient) SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[0], "/protobuf.Greeter/SayHelloStream", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &greeterSayHelloStreamClient{stream}
-	return x, nil
-}
-
-type Greeter_SayHelloStreamClient interface {
-	Send(*HelloRequest) error
-	Recv() (*User, error)
-	grpc.ClientStream
-}
-
-type greeterSayHelloStreamClient struct {
-	grpc.ClientStream
-}
-
-func (x *greeterSayHelloStreamClient) Send(m *HelloRequest) error {
-	return x.ClientStream.SendMsg(m)
-}
-
-func (x *greeterSayHelloStreamClient) Recv() (*User, error) {
-	m := new(User)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-// GreeterServer is the server API for Greeter service.
-type GreeterServer interface {
-	// Sends a greeting
-	SayHello(context.Context, *HelloRequest) (*User, error)
-	SayHelloStream(Greeter_SayHelloStreamServer) error
-}
-
-// UnimplementedGreeterServer can be embedded to have forward compatible implementations.
-type UnimplementedGreeterServer struct {
-}
-
-func (*UnimplementedGreeterServer) SayHello(ctx context.Context, req *HelloRequest) (*User, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
-}
-func (*UnimplementedGreeterServer) SayHelloStream(srv Greeter_SayHelloStreamServer) error {
-	return status.Errorf(codes.Unimplemented, "method SayHelloStream not implemented")
-}
-
-func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {
-	s.RegisterService(&_Greeter_serviceDesc, srv)
-}
-
-func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GreeterServer).SayHello(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/protobuf.Greeter/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Greeter_SayHelloStream_Handler(srv interface{}, stream grpc.ServerStream) error {
-	return srv.(GreeterServer).SayHelloStream(&greeterSayHelloStreamServer{stream})
-}
-
-type Greeter_SayHelloStreamServer interface {
-	Send(*User) error
-	Recv() (*HelloRequest, error)
-	grpc.ServerStream
-}
-
-type greeterSayHelloStreamServer struct {
-	grpc.ServerStream
-}
-
-func (x *greeterSayHelloStreamServer) Send(m *User) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-func (x *greeterSayHelloStreamServer) Recv() (*HelloRequest, error) {
-	m := new(HelloRequest)
-	if err := x.ServerStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-var _Greeter_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "protobuf.Greeter",
-	HandlerType: (*GreeterServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "SayHello",
-			Handler:    _Greeter_SayHello_Handler,
-		},
-	},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "SayHelloStream",
-			Handler:       _Greeter_SayHelloStream_Handler,
-			ServerStreams: true,
-			ClientStreams: true,
-		},
-	},
-	Metadata: "helloworld.proto",
-}
-
-type greeterDubbo3Client struct {
-	cc *dubbo3.TripleConn
-}
-
-func NewGreeterDubbo3Client(cc *dubbo3.TripleConn) GreeterClient {
-	return &greeterDubbo3Client{cc}
-}
-func (c *greeterDubbo3Client) SayHello(ctx context.Context, in *HelloRequest, opt ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
-	err := c.cc.Invoke(ctx, "/"+interfaceKey+"/SayHello", in, out)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-func (c *greeterDubbo3Client) SayHelloStream(ctx context.Context, opt ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
-	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
-	stream, err := c.cc.NewStream(ctx, "/"+interfaceKey+"/SayHelloStream", opt...)
-	if err != nil {
-		return nil, err
-	}
-	x := &greeterSayHelloStreamClient{stream}
-	return x, nil
-}
-
-// GreeterClientImpl is the client API for Greeter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GreeterClientImpl struct {
-	// Sends a greeting
-	SayHello       func(ctx context.Context, in *HelloRequest, out *User) error
-	SayHelloStream func(ctx context.Context) (Greeter_SayHelloStreamClient, error)
-}
-
-func (c *GreeterClientImpl) Reference() string {
-	return "greeterImpl"
-}
-
-func (c *GreeterClientImpl) GetDubboStub(cc *dubbo3.TripleConn) GreeterClient {
-	return NewGreeterDubbo3Client(cc)
-}
-
-type GreeterProviderBase struct {
-	proxyImpl protocol.Invoker
-}
-
-func (s *GreeterProviderBase) SetProxyImpl(impl protocol.Invoker) {
-	s.proxyImpl = impl
-}
-
-func (s *GreeterProviderBase) GetProxyImpl() protocol.Invoker {
-	return s.proxyImpl
-}
-
-func (c *GreeterProviderBase) Reference() string {
-	return "greeterImpl"
-}
-
-func _DUBBO_Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	base := srv.(dgrpc.Dubbo3GrpcService)
-	args := []interface{}{}
-	args = append(args, in)
-	invo := invocation.NewRPCInvocation("SayHello", args, nil)
-	if interceptor == nil {
-		result := base.GetProxyImpl().Invoke(ctx, invo)
-		return result.Result(), result.Error()
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/protobuf.Greeter/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		result := base.GetProxyImpl().Invoke(context.Background(), invo)
-		return result.Result(), result.Error()
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _DUBBO_Greeter_SayHelloStream_Handler(srv interface{}, stream grpc.ServerStream) error {
-	_, ok := srv.(dgrpc.Dubbo3GrpcService)
-	invo := invocation.NewRPCInvocation("SayHelloStream", nil, nil)
-	if !ok {
-		fmt.Println(invo)
-	}
-	return srv.(GreeterServer).SayHelloStream(&greeterSayHelloStreamServer{stream})
-}
-
-func (s *GreeterProviderBase) ServiceDesc() *grpc.ServiceDesc {
-	return &grpc.ServiceDesc{
-		ServiceName: "protobuf.Greeter",
-		HandlerType: (*GreeterServer)(nil),
-		Methods: []grpc.MethodDesc{
-			{
-				MethodName: "SayHello",
-				Handler:    _DUBBO_Greeter_SayHello_Handler,
-			},
-		},
-		Streams: []grpc.StreamDesc{
-			{
-				StreamName:    "SayHelloStream",
-				Handler:       _DUBBO_Greeter_SayHelloStream_Handler,
-				ServerStreams: true,
-				ClientStreams: true,
-			},
-		},
-		Metadata: "helloworld.proto",
-	}
-}
diff --git a/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/main_test.go b/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/main_test.go
index 5973644..bdf36e2 100644
--- a/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/main_test.go
+++ b/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/main_test.go
@@ -36,14 +36,16 @@ import (
 )
 
 import (
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/triple"
+	triplepb "github.com/apache/dubbo-go-samples/api"
 )
 
 var greeterProvider = new(triplepb.GreeterClientImpl)
 
 func TestMain(m *testing.M) {
 	config.SetConsumerService(greeterProvider)
-	config.Load()
+	if err := config.Load(); err != nil {
+		panic(err)
+	}
 	time.Sleep(3 * time.Second)
 
 	os.Exit(m.Run())
diff --git a/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/userprovider_test.go b/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/userprovider_test.go
index 12252fb..3590dea 100644
--- a/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/userprovider_test.go
+++ b/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/userprovider_test.go
@@ -31,8 +31,8 @@ import (
 )
 
 import (
-	grpcpb "github.com/apache/dubbo-go-samples/integrate_test/rpc/triple/pb/dubbogo-grpc/tests/integration/grpc_test_proto"
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/triple"
+	triplepb "github.com/apache/dubbo-go-samples/api"
+	grpcpb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/grpc"
 )
 
 func TestSayHello(t *testing.T) {
@@ -82,7 +82,7 @@ func TestStreamSayHello(t *testing.T) {
 
 func TestGRPCClientHello(t *testing.T) {
 	// Set up a connection to the client.
-	conn, err := grpc.Dial("127.0.0.1:20001", grpc.WithInsecure())
+	conn, err := grpc.Dial("127.0.0.1:20000", grpc.WithInsecure())
 	assert.Nil(t, err)
 	defer conn.Close()
 	c := grpcpb.NewGreeterClient(conn)
@@ -99,7 +99,7 @@ func TestGRPCClientHello(t *testing.T) {
 }
 
 func TestGRPCClientStreamSayHello(t *testing.T) {
-	conn, err := grpc.Dial("127.0.0.1:20001", grpc.WithInsecure())
+	conn, err := grpc.Dial("127.0.0.1:20000", grpc.WithInsecure())
 	assert.Nil(t, err)
 	defer conn.Close()
 	c := grpcpb.NewGreeterClient(conn)
diff --git a/integrate_test/rpc/triple/pb/dubbogo-java/docker/docker-compose.yml b/integrate_test/rpc/triple/pb/dubbogo-java/docker/docker-compose.yml
deleted file mode 100644
index 8724179..0000000
--- a/integrate_test/rpc/triple/pb/dubbogo-java/docker/docker-compose.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-version: '3'
-
-services:
-  zookeeper:
-    image: zookeeper
-    ports:
-      - 2181:2181
-    restart: on-failure
-
diff --git a/integrate_test/rpc/triple/pb/dubbogo-java/tests/integration/main_test.go b/integrate_test/rpc/triple/pb/dubbogo-java/tests/integration/main_test.go
deleted file mode 100644
index d25080e..0000000
--- a/integrate_test/rpc/triple/pb/dubbogo-java/tests/integration/main_test.go
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package integration
-
-import (
-	"os"
-	"testing"
-	"time"
-)
-
-import (
-	_ "dubbo.apache.org/dubbo-go/v3/cluster/cluster_impl"
-	_ "dubbo.apache.org/dubbo-go/v3/cluster/loadbalance"
-	_ "dubbo.apache.org/dubbo-go/v3/common/proxy/proxy_factory"
-	"dubbo.apache.org/dubbo-go/v3/config"
-	_ "dubbo.apache.org/dubbo-go/v3/filter/filter_impl"
-	_ "dubbo.apache.org/dubbo-go/v3/metadata/service/local"
-	_ "dubbo.apache.org/dubbo-go/v3/protocol/dubbo"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/protocol"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/zookeeper"
-)
-
-import (
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-java/protobuf"
-)
-
-var greeterProvider = new(triplepb.GreeterClientImpl)
-
-
-func TestMain(m *testing.M) {
-	config.SetConsumerService(greeterProvider)
-	config.Load()
-	time.Sleep(3 * time.Second)
-
-	os.Exit(m.Run())
-}
-
diff --git a/integrate_test/rpc/triple/pb/dubbogo-java/tests/integration/userprovider_test.go b/integrate_test/rpc/triple/pb/dubbogo-java/tests/integration/userprovider_test.go
deleted file mode 100644
index 0d9e16b..0000000
--- a/integrate_test/rpc/triple/pb/dubbogo-java/tests/integration/userprovider_test.go
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package integration
-
-import (
-	"context"
-	"testing"
-)
-
-import (
-	"github.com/stretchr/testify/assert"
-)
-
-import (
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-java/protobuf"
-)
-
-func TestSayHello(t *testing.T) {
-	req := &triplepb.HelloRequest{
-		Name: "laurence",
-	}
-
-	reply := &triplepb.User{}
-
-	ctx := context.Background()
-	ctx = context.WithValue(ctx, "tri-req-id", "test_value_XXXXXXXX")
-
-	err := greeterProvider.SayHello(ctx, req, reply)
-
-	assert.Nil(t, err)
-	assert.Equal(t, "Hello laurence", reply.Name)
-	assert.Equal(t, "12345", reply.Id)
-	assert.Equal(t, int32(21), reply.Age)
-}
diff --git a/rpc/triple/README.md b/rpc/triple/README.md
index 08f6ea5..ef9fe22 100644
--- a/rpc/triple/README.md
+++ b/rpc/triple/README.md
@@ -1,24 +1,12 @@
-# Triple-go (Dubbo-go3.0) example
+# Triple Samples
 
-Triple-go is a network protocol library released in version 3.0 based on the existing Dubbo service management capabilities.
+Triple-go is a network protocol library released in version 3.0 based on the existing Dubbo service management capabilities. You may refer to [dubbogo/triple](https://github.com/dubbogo/triple) for more details.
 
-## Triple protocol introduction and source code:
-
-https://github.com/dubbogo/triple
-
-
-## Triple-go provides capabilities:
--Intercommunication with Grpc, supporting normal calls and streaming calls
-
-[Example](./api/dubbogo-grpc/README.md)
-
--Intercommunication with Triple-java, currently the java side supports ordinary calls
-
-[Example](./api/dubbogo-java/README.md)
-
-
--Support Pb serialization and Hessian serialization. After Hessian serialization, it can be serialized again by nesting the following api:
-https://github.com/dubbogo/triple/blob/master/internal/codec/proto/triple_wrapper.proto
-
-[Example](./hessian2/README.md)
+## Contents
 
+- [codec-extension](./codec-extension): TODO: ~~code-extension~~
+- [hessian2](./hessian2): TODO: ~~hessian2 introduction~~
+- [msgpack](./msgpack): TODO: ~~msgpack introduction~~
+- [pb](./pb): Triple samples using ProtoBuf(PB) serialization
+    - [dubbogo-grpc](./pb/dubbogo-grpc): Samples for communication between Dubbo-go using triple protocol and original gRPC(triple-go <-> grpc).
+    - [dubbogo-java](./pb/dubbogo-java): Samples for communication between Dubbo-go and Dubbo-java using Triple protocol(triple-go <-> triple-java).
diff --git a/rpc/triple/README_zh.md b/rpc/triple/README_zh.md
index 33f8389..cfd5cf2 100644
--- a/rpc/triple/README_zh.md
+++ b/rpc/triple/README_zh.md
@@ -1,24 +1,12 @@
-# Triple-go(Dubbo-go3.0) 示例
+# Triple 示例
 
-Triple-go 是在已有Dubbo服务治理能力的基础上,3.0 版本发布的网络协议库。
+Triple-go 是在已有 Dubbo 服务治理能力的基础上,3.0 版本发布的网络协议库。获取更多信息请查看 [dubbogo/triple](https://github.com/dubbogo/triple) 仓库。
 
-## Triple 协议介绍以及源码:
-
-https://github.com/dubbogo/triple
-
-
-## Triple-go 提供能力:
-- 与 Grpc 互通,支持普通调用和流式调用
-  
-  [例子](./api/dubbogo-grpc/README_zh.md)
-  
-- 与 Triple-java 互通,目前java端支持普通调用
-
-  [例子](./api/dubbogo-java/README_zh.md)
-  
-
-- 支持 Pb 序列化和 Hessian 序列化,Hessian 序列化后通过嵌套入如下 api,再次进行序列化:
-  https://github.com/dubbogo/triple/blob/master/internal/codec/proto/triple_wrapper.proto
-  
-  [例子](./hessian2/README_zh.md)
+## 内容
 
+- [codec-extension](./codec-extension): TODO: ~~code-extension~~
+- [hessian2](./hessian2): TODO: ~~hessian2 introduction~~
+- [msgpack](./msgpack): TODO: ~~msgpack introduction~~
+- [pb](./pb): 使用 ProtoBuf(PB) 序列化方案的示例
+  - [dubbogo-grpc](./pb/dubbogo-grpc): Triple 和 gRPC 互通案例
+  - [dubbogo-java](./pb/dubbogo-java): Triple-java 和 Triple-go 互通案例
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/README.md b/rpc/triple/pb/dubbogo-grpc/README.md
index 32208b7..5744fe7 100644
--- a/rpc/triple/pb/dubbogo-grpc/README.md
+++ b/rpc/triple/pb/dubbogo-grpc/README.md
@@ -1,186 +1,55 @@
-# Triple-Grpc interactive example
+# dubbogo-grpc
 
-## Example structure
+## Contents
 
-In this example, we provide proto protocol, server, unary RPC client, streaming rpc client for triple and grpc respectively.
+- protobuf: proto files for grpc and triple respectively;
+- dubbogo-server
+- dubbogo-client
+- grpcgo-server
+- grpcgo-client
 
-Any group of client and server can be used interchangeably to implement RPC calls.
+Please note that neither server streaming RPC nor client streaming RPC are not supported by Triple so far.
 
-## Triple service start
+What combination we tested are:
 
-### api generation
-1. First write the proto file
+- [x] grpcgo-client -> dubbogo-server
+- [x] dubbogo-client -> dubbogo-server
 
-```protobuf
-syntax = "proto3";
+## Getting Started
 
-option go_package = "protobuf/triple";
-package protobuf;
+### Server
 
-// The greeting service definition.
-service Greeter {
-  // Sends a greeting
-  rpc SayHello (HelloRequest) returns (User) {}
-  rpc SayHelloStream (stream HelloRequest) returns (stream User) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
-  string name = 1;
-}
-
-// The response message containing the greetings
-message User {
-  string name = 1;
-  string id = 2;
-  int32 age = 3;
-}
-
-```
-2. Install the protoc cli tool
-    
-3. Install protoc-gen-dubbo3 (used to generate a stub suitable for triple)    
-```shell
-    go get -u dubbo.apache.org/dubbo-go/v3/protocol/triple/protoc-gen-triple@3.0
-```
+1. Edit your own proto file, please refer to [helloworld.proto](./protobuf/triple/helloworld.proto).
+2. Install `protoc` tool, please refer to [ProtoBuf documentation](https://developers.google.com/protocol-buffers/docs/gotutorial).
+3. Install `protoc-gen-dubbo3` which is used to generate a stub suitable for triple.
 
-4. generate api file
 ```shell
-    protoc -I . helloworld.proto --dubbo3_out=plugins=grpc+dubbo:.
+go get -u github.com/dubbogo/tools/cmd/protoc-gen-triple
 ```
 
-### Server start
-1. Provider structure definition
-```go
-package pkg
-
-import (
-    "context"
-    "fmt"
-)
-
-import (
-    "dubbo.apache.org/dubbo-go/v3/common/logger"
-)
+4. Compile the proto file.
 
-import (
-    dubbo3 "github.com/apache/dubbo-go-samples/rpc/triple/api/dubbogo-grpc/protobuf/grpc"
-)
-
-type GreeterProvider struct {
-// Introduce triple provider base
-    *dubbo3.GreeterProviderBase
-}
-
-func NewGreeterProvider() *GreeterProvider {
-    return &GreeterProvider{// Initialize base with the instance in the generated api
-        GreeterProviderBase: &dubbo3.GreeterProviderBase{},
-    }
-}
-// SayHelloStream provides functions for streaming RPC calls
-func (s *GreeterProvider) SayHelloStream(svr dubbo3.Greeter_SayHelloStreamServer) error {
-    c, err := svr.Recv()
-    if err != nil {
-        return err
-    }
-    logger.Infof("Dubbo-go3 GreeterProvider recv 1 user, name = %s\n", c.Name)
-    c2, err := svr.Recv()
-    if err != nil {
-        return err
-    }
-    logger.Infof("Dubbo-go3 GreeterProvider recv 2 user, name = %s\n", c2.Name)
-    c3, err := svr.Recv()
-    if err != nil {
-        return err
-    }
-    logger.Infof("Dubbo-go3 GreeterProvider recv 3 user, name = %s\n", c3.Name)
-    
-    svr.Send(&dubbo3.User{
-        Name: "hello "+ c.Name,
-        Age: 18,
-        Id: "123456789",
-    })
-    svr.Send(&dubbo3.User{
-        Name: "hello "+ c2.Name,
-        Age: 19,
-        Id: "123456789",
-    })
-    return nil
-}
-
-// SayHello provides service functions called by ordinary rpc
-func (s *GreeterProvider) SayHello(ctx context.Context, in *dubbo3.HelloRequest) (*dubbo3.User, error) {
-    logger.Infof("Dubbo3 GreeterProvider get user name = %s\n" + in.Name)
-    fmt.Println("get triple header tri-req-id = ", ctx.Value("tri-req-id"))
-    fmt.Println("get triple header tri-service-version = ", ctx.Value("tri-service-version"))
-    return &dubbo3.User{Name: "Hello "+ in.Name, Id: "12345", Age: 21}, nil
-}
-
-// Reference needs to correspond to the Reference key in config
-func (g *GreeterProvider) Reference() string {
-    return "GreeterProvider"
-}
-```
-2. Configuration file
-   server/dubbogo-server/conf/server.yml
-```yaml
-# service config
-services:
-  "GreeterProvider":
-    registry: "demoZK"
-    protocol: "tri" # Use triple protocol
-    interface: "protobuf.Greeter" # Same as the interface name generated by grpc, as follows
+```shell
+protoc -I . helloworld.proto --triple_out=plugins=triple:.
 ```
 
-The interface name of the Grpc api file can be seen as protobuf.Greeter, which is defined by the user as required.
-In order for triple-go to get through with grpc, it must be the same as the grpc interface name and correctly configured in the yaml file.
+5. Edit the configuration for server, please refer to [dubbogo.yml](go-server/conf/dubbogo.yml).
+6. Launch the server.
 
-protobuf/grpc/helloworld.api.go:
-```go
-func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error) {
-    out := new(User)
-    err := c.cc.Invoke(ctx, "/protobuf.Greeter/SayHello", in, out, opts...)
-    if err != nil {
-        return nil, err
-    }
-    return out, nil
-}
-```
+### Client
 
-3. Start the server
+Please note that the start-up process is the same for both the unary RPC and the stream RPC.
 
-goland run
-triple/triple-server
+1. Register RPC services.
 
-## Client (take ordinary rpc call as an example, the same for streaming RPC)
-
-1. Consumer end structure definition
-   The Consumer structure has been implemented in the api file and can be imported directly
 ```go
-import (
-    dubbo3pb "github.com/apache/dubbo-go-samples/rpc/triple/api/dubbogo-grpc/protobuf/triple"
-)
-
 // Directly introduce the GreeterClientImpl structure, you can enter the structure, and see the Reference as "greeterImpl"
-var greeterProvider = new(dubbo3pb.GreeterClientImpl)
-
+var greeterProvider = new(triplepb.GreeterClientImpl)
 func init() {
     config.SetConsumerService(greeterProvider)
 }
 ```
 
-The corresponding reference key is defined in the configuration file
-```yaml
-# reference config
-references:
-  "greeterImpl":
-    registry: "demoZk"
-    protocol: "tri"
-    interface: "protobuf.Greeter"
-    url: tri://localhost:20001
-```
-
-2. Start the client
+2. Edit the configuration for client, please refer to [dubbogo.yml](go-client/conf/dubbogo.yml)
 
-goland run
-triple/triple-unary-client
\ No newline at end of file
+3. Launch the client.
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/README_zh.md b/rpc/triple/pb/dubbogo-grpc/README_zh.md
index e20988f..49a8521 100644
--- a/rpc/triple/pb/dubbogo-grpc/README_zh.md
+++ b/rpc/triple/pb/dubbogo-grpc/README_zh.md
@@ -1,187 +1,56 @@
-# Triple-Grpc 互通示例
+# dubbogo-grpc
 
-## 示例结构
+## Contents
 
-在本示例中,我们针对 triple 和 grpc ,分别提供了 proto 协议、服务端、普通 RPC 客户端、流式调用而客户端。
+- protobuf: 使用 proto 文件的结构体定义
+- server
+- stream-client: 使用流式调用的客户端
+- unary-client: 使用普通调用的客户端
 
-可以交叉使用任一组客户端和服务端,实现 RPC 调用。 
+请注意,到目前为止,Triple还不支持服务器流式RPC和客户端流式RPC。
 
-## Triple 服务启动
+我们测试的组合包括:
 
-### api 生成
-1. 首先编写 proto 文件
-  
-```protobuf
-syntax = "proto3";
+- [x] grpcgo-client(stream) -> dubbogo-server
+- [x] grpcgo-client(unary) -> dubbogo-server
+- [x] dubbogo-client(stream) -> dubbogo-server
+- [x] dubbogo-client(unary) -> dubbogo-server
 
-option go_package = "protobuf/triple";
-package protobuf;
+## 运行
 
-// The greeting service definition.
-service Greeter {
-  // Sends a greeting
-  rpc SayHello (HelloRequest) returns (User) {}
-  rpc SayHelloStream (stream HelloRequest) returns (stream User) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
-  string name = 1;
-}
+### 服务端
 
-// The response message containing the greetings
-message User {
-  string name = 1;
-  string id = 2;
-  int32 age = 3;
-}
-```
+1. 编辑你自己的 proto 文件,请参考 [helloworld.proto](./protobuf/triple/helloworld.proto)。
+2. 安装 `protoc` 工具,请参考 [ProtoBuf 文档](https://developers.google.com/protocol-buffers/docs/gotutorial)。
+3. 安装 `protoc-gen-dubbo3`,用于生成适用于 triple 的 stub。
 
-2. 安装 protoc cli 工具
-   
-3. 安装 protoc-gen-dubbo3(用于生成适配于triple的stub)
-```shell
-go get -u dubbo.apache.org/dubbo-go/v3/protocol/triple/protoc-gen-triple@3.0
-```
-4. 生成 api 文件
 ```shell
-    protoc -I . helloworld.proto --dubbo3_out=plugins=grpc+dubbo:.
+go get -u github.com/dubbogo/tools/cmd/protoc-gen-triple
 ```
 
-### 服务端启动
-1. Provider 结构定义
-```go
-package pkg
-
-import (
-	"context"
-	"fmt"
-)
-
-import (
-	"dubbo.apache.org/dubbo-go/v3/common/logger"
-)
-
-import (
-	dubbo3 "github.com/apache/dubbo-go-samples/rpc/triple/api/dubbogo-grpc/protobuf/triple"
-)
-
-type GreeterProvider struct {
-	// 引入dubbo3 provider base
-	*dubbo3.GreeterProviderBase
-}
-
-func NewGreeterProvider() *GreeterProvider {
-	return &GreeterProvider{// 使用生成的pb中的实例初始化base
-		GreeterProviderBase: &dubbo3.GreeterProviderBase{},
-	}
-}
+4. 编译 proto 文件。
 
-// SayHelloStream 提供流式RPC调用的函数
-func (s *GreeterProvider) SayHelloStream(svr dubbo3.Greeter_SayHelloStreamServer) error {
-	c, err := svr.Recv()
-	if err != nil {
-		return err
-	}
-	logger.Infof("Dubbo-go3 GreeterProvider recv 1 user, name = %s\n", c.Name)
-	c2, err := svr.Recv()
-	if err != nil {
-		return err
-	}
-	logger.Infof("Dubbo-go3 GreeterProvider recv 2 user, name = %s\n", c2.Name)
-	c3, err := svr.Recv()
-	if err != nil {
-		return err
-	}
-	logger.Infof("Dubbo-go3 GreeterProvider recv 3 user, name = %s\n", c3.Name)
-
-	svr.Send(&dubbo3.User{
-		Name: "hello " + c.Name,
-		Age:  18,
-		Id:   "123456789",
-	})
-	svr.Send(&dubbo3.User{
-		Name: "hello " + c2.Name,
-		Age:  19,
-		Id:   "123456789",
-	})
-	return nil
-}
-
-// SayHello 提供普通rpc调用的服务函数
-func (s *GreeterProvider) SayHello(ctx context.Context, in *dubbo3.HelloRequest) (*dubbo3.User, error) {
-	logger.Infof("Dubbo3 GreeterProvider get user name = %s\n" + in.Name)
-	fmt.Println("get triple header tri-req-id = ", ctx.Value("tri-req-id"))
-	fmt.Println("get triple header tri-service-version = ", ctx.Value("tri-service-version"))
-	return &dubbo3.User{Name: "Hello " + in.Name, Id: "12345", Age: 21}, nil
-}
-
-// Reference 需要和config中Reference key 对应
-func (g *GreeterProvider) Reference() string {
-	return "GreeterProvider"
-}
-```
-2. 配置文件
-server/dubbogo-server/conf/server.yml
-```yaml
-# service config
-services:
-  "GreeterProvider":
-    registry: "demoZK"
-    protocol: "tri" # 使用triple协议
-    interface: "protobuf.Greeter" # 和grpc生成的的接口名一致,如下
+```shell
+protoc -I . helloworld.proto --triple_out=plugins=triple:.
 ```
 
-Grpc api 文件的接口名可见为 protobuf.Greeter, 是用户根据需要定义的。
-triple-go 要想和 grpc 打通,一定要和 grpc 的接口名一致,并正确配置在 yaml 文件中。
+5. 编辑服务端配置文件,请参考 [dubbogo.yml](go-server/conf/dubbogo.yml)。
+6. 启动服务端。
 
-protobuf/grpc/helloworld.api.go:
-```go
-func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	err := c.cc.Invoke(ctx, "/protobuf.Greeter/SayHello", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-```
-
-3. 启动服务端
+### 客户端
 
-goland 运行
-triple/triple-server
+请注意,普通调用的 RPC 和流式 RPC 的启动过程是相同的。
 
-## 客户端(以普通rpc调用为例, 流式RPC同理)
+1. 注册 RPC 服务。
 
-1. Consumer 端结构定义
-Consumer 结构已经在pb文件中实现好,可直接引入
 ```go
-import (
-    dubbo3pb "github.com/apache/dubbo-go-samples/general/triple/api/dubbogo-grpc/protobuf/triple"
-)
-
-// 直接引入GreeterClientImpl 结构,可以进入该结构,查看Reference为“greeterImpl”
-var greeterProvider = new(dubbo3pb.GreeterClientImpl)
-
+// Directly introduce the GreeterClientImpl structure, you can enter the structure, and see the Reference as "greeterImpl"
+var greeterProvider = new(triplepb.GreeterClientImpl)
 func init() {
     config.SetConsumerService(greeterProvider)
 }
 ```
 
-配置文件中定义好对应 reference key
-```yaml
-# reference config
-references:
-  "greeterImpl":
-    registry: "demoZk"
-    protocol: "tri"
-    interface: "protobuf.Greeter"
-    url: tri://localhost:20001
-```
-
-2. 启动客户端
-
-goland 运行
-triple/triple-unary-client
+2. 编辑客户端配置文件,请参考 [dubbogo.yml](go-client/conf/dubbogo.yml)。
 
+3. 启动客户端。
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/cmd/client.go b/rpc/triple/pb/dubbogo-grpc/go-client/cmd/client.go
similarity index 76%
rename from rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/cmd/client.go
rename to rpc/triple/pb/dubbogo-grpc/go-client/cmd/client.go
index 46033d2..1e2726e 100644
--- a/rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/cmd/client.go
+++ b/rpc/triple/pb/dubbogo-grpc/go-client/cmd/client.go
@@ -26,10 +26,12 @@ import (
 	"dubbo.apache.org/dubbo-go/v3/common/logger"
 	"dubbo.apache.org/dubbo-go/v3/config"
 	_ "dubbo.apache.org/dubbo-go/v3/imports"
+
+	tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
 )
 
 import (
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/triple"
+	triplepb "github.com/apache/dubbo-go-samples/api"
 )
 
 var greeterProvider = new(triplepb.GreeterClientImpl)
@@ -38,17 +40,20 @@ func init() {
 	config.SetConsumerService(greeterProvider)
 }
 
-// export DUBBO_GO_CONFIG_PATH=$PATH_TO_SAMPLES/rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/conf/dubbogo.yml
+// export DUBBO_GO_CONFIG_PATH=$PATH_TO_SAMPLES/rpc/triple/pb/dubbogo-grpc/stream-client/go-client/conf/dubbogo.yml
 func main() {
 	if err := config.Load(); err != nil {
 		panic(err)
 	}
 	time.Sleep(time.Second * 3)
 
-	testSayHello()
+	stream()
+	unary()
 }
 
-func testSayHello() {
+func stream() {
+	logger.Infof(">>>>> Dubbo-go client is about to call to SayHelloStream")
+
 	ctx := context.Background()
 	ctx = context.WithValue(ctx, "tri-req-id", "triple-request-id-demo")
 
@@ -85,3 +90,20 @@ func testSayHello() {
 	}
 	logger.Infof("Receive 2 user = %+v\n", rspUser2)
 }
+
+func unary() {
+	logger.Infof(">>>>> Dubbo-go client is about to call to SayHello")
+
+	ctx := context.Background()
+	ctx = context.WithValue(ctx, tripleConstant.TripleCtxKey(tripleConstant.TripleRequestID), "triple-request-id-demo")
+
+	req := triplepb.HelloRequest{
+		Name: "laurence",
+	}
+	user, err := greeterProvider.SayHello(ctx, &req)
+	if err != nil {
+		panic(err)
+	}
+
+	logger.Infof("Receive user = %+v\n", user)
+}
diff --git a/rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/conf/dubbogo.yml b/rpc/triple/pb/dubbogo-grpc/go-client/conf/dubbogo.yml
similarity index 76%
rename from rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/conf/dubbogo.yml
rename to rpc/triple/pb/dubbogo-grpc/go-client/conf/dubbogo.yml
index 89b9dd2..533583a 100644
--- a/rpc/triple/pb/dubbogo-grpc/stream-client/dubbogo-client/conf/dubbogo.yml
+++ b/rpc/triple/pb/dubbogo-grpc/go-client/conf/dubbogo.yml
@@ -7,4 +7,4 @@ dubbo:
     references:
       greeterImpl:
         protocol: tri
-        interface: org.apache.dubbo.Greeter
\ No newline at end of file
+        interface: org.apache.dubbo.demo.Greeter
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/cmd/server.go b/rpc/triple/pb/dubbogo-grpc/go-server/cmd/server.go
similarity index 98%
rename from rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/cmd/server.go
rename to rpc/triple/pb/dubbogo-grpc/go-server/cmd/server.go
index 0865203..8d493e5 100644
--- a/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/cmd/server.go
+++ b/rpc/triple/pb/dubbogo-grpc/go-server/cmd/server.go
@@ -34,7 +34,7 @@ import (
 )
 
 import (
-	"github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/pkg"
+	"github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/go-server/pkg"
 )
 
 var (
diff --git a/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/conf/dubbogo.yml b/rpc/triple/pb/dubbogo-grpc/go-server/conf/dubbogo.yml
similarity index 87%
rename from rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/conf/dubbogo.yml
rename to rpc/triple/pb/dubbogo-grpc/go-server/conf/dubbogo.yml
index ba654af..4a85e0a 100644
--- a/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/conf/dubbogo.yml
+++ b/rpc/triple/pb/dubbogo-grpc/go-server/conf/dubbogo.yml
@@ -13,4 +13,4 @@ dubbo:
       greeterImpl:
         protocol: triple
         # interface is for registry
-        interface: org.apache.dubbo.Greeter
\ No newline at end of file
+        interface: org.apache.dubbo.demo.Greeter
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/pkg/greeter.go b/rpc/triple/pb/dubbogo-grpc/go-server/pkg/greeter.go
similarity index 96%
rename from rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/pkg/greeter.go
rename to rpc/triple/pb/dubbogo-grpc/go-server/pkg/greeter.go
index 6f21629..7a6ac60 100644
--- a/rpc/triple/pb/dubbogo-grpc/server/dubbogo-server/pkg/greeter.go
+++ b/rpc/triple/pb/dubbogo-grpc/go-server/pkg/greeter.go
@@ -29,7 +29,7 @@ import (
 )
 
 import (
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/triple"
+	triplepb "github.com/apache/dubbo-go-samples/api"
 )
 
 type GreeterProvider struct {
diff --git a/rpc/triple/pb/dubbogo-grpc/stream-client/grpcgo-client/main.go b/rpc/triple/pb/dubbogo-grpc/grpc-client/main.go
similarity index 75%
rename from rpc/triple/pb/dubbogo-grpc/stream-client/grpcgo-client/main.go
rename to rpc/triple/pb/dubbogo-grpc/grpc-client/main.go
index 68aa040..ff4e22a 100644
--- a/rpc/triple/pb/dubbogo-grpc/stream-client/grpcgo-client/main.go
+++ b/rpc/triple/pb/dubbogo-grpc/grpc-client/main.go
@@ -42,18 +42,31 @@ func main() {
 	if err != nil {
 		log.Fatalf("did not connect: %v", err)
 	}
-	defer conn.Close()
+
 	c := pb.NewGreeterClient(conn)
 
-	BigDataReq := &pb.HelloRequest{
-		Name: "Laurence",
-	}
+	defer func() {
+		_ = conn.Close()
+	}()
+
+	stream(c)
+	unary(c)
+}
+
+func stream(c pb.GreeterClient) {
+	fmt.Printf(">>>>> gRPC-go client is about to call SayHelloStream\n")
+
 	clientStream, err := c.SayHelloStream(context.Background())
 	if err != nil {
 		panic(err)
 	}
+
+	BigDataReq := &pb.HelloRequest{
+		Name: "Laurence",
+	}
+
 	for i := 0; i < 2; i++ {
-		clientStream.Send(BigDataReq)
+		_ = clientStream.Send(BigDataReq)
 	}
 	user1, err := clientStream.Recv()
 	if err != nil {
@@ -61,7 +74,7 @@ func main() {
 	}
 	fmt.Printf("get 1 received user = %+v\n", user1)
 
-	clientStream.Send(BigDataReq)
+	_ = clientStream.Send(BigDataReq)
 
 	user2, err := clientStream.Recv()
 	if err != nil {
@@ -69,3 +82,17 @@ func main() {
 	}
 	fmt.Printf("get 2 received user = %+v\n", user2)
 }
+
+func unary(c pb.GreeterClient) {
+	fmt.Printf(">>>>> gRPC-go client is about to call SayHello\n")
+
+	req := &pb.HelloRequest{
+		Name: "laurence",
+	}
+	ctx := context.Background()
+	rsp, err := c.SayHello(ctx, req)
+	if err != nil {
+		panic(err)
+	}
+	fmt.Printf("get received user = %+v\n", rsp)
+}
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go
index 1899aac..9ac15e7 100644
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go
+++ b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.pb.go
@@ -1,3 +1,4 @@
+//
 // Licensed to the Apache Software Foundation (ASF) under one or more
 // contributor license agreements.  See the NOTICE file distributed with
 // this work for additional information regarding copyright ownership.
@@ -151,25 +152,27 @@ var File_helloworld_proto protoreflect.FileDescriptor
 
 var file_helloworld_proto_rawDesc = []byte{
 	0x0a, 0x10, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x2e, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x12, 0x10, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64,
-	0x75, 0x62, 0x62, 0x6f, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71,
-	0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01,
-	0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72,
-	0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04,
-	0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
-	0x05, 0x52, 0x03, 0x61, 0x67, 0x65, 0x32, 0x9f, 0x01, 0x0a, 0x07, 0x47, 0x72, 0x65, 0x65, 0x74,
-	0x65, 0x72, 0x12, 0x44, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x1e,
-	0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x75, 0x62, 0x62,
-	0x6f, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16,
+	0x74, 0x6f, 0x12, 0x15, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64,
+	0x75, 0x62, 0x62, 0x6f, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c,
+	0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d,
+	0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3c, 0x0a,
+	0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x67, 0x65,
+	0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x61, 0x67, 0x65, 0x32, 0xb3, 0x01, 0x0a, 0x07,
+	0x47, 0x72, 0x65, 0x65, 0x74, 0x65, 0x72, 0x12, 0x4e, 0x0a, 0x08, 0x53, 0x61, 0x79, 0x48, 0x65,
+	0x6c, 0x6c, 0x6f, 0x12, 0x23, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65,
+	0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x48, 0x65, 0x6c, 0x6c,
+	0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61,
+	0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x64, 0x65, 0x6d, 0x6f,
+	0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x58, 0x0a, 0x0e, 0x53, 0x61, 0x79, 0x48, 0x65,
+	0x6c, 0x6c, 0x6f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x23, 0x2e, 0x6f, 0x72, 0x67, 0x2e,
+	0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x64, 0x65, 0x6d,
+	0x6f, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b,
 	0x2e, 0x6f, 0x72, 0x67, 0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x75, 0x62, 0x62,
-	0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x12, 0x4e, 0x0a, 0x0e, 0x53, 0x61, 0x79, 0x48,
-	0x65, 0x6c, 0x6c, 0x6f, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x12, 0x1e, 0x2e, 0x6f, 0x72, 0x67,
-	0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x48, 0x65,
-	0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6f, 0x72, 0x67,
-	0x2e, 0x61, 0x70, 0x61, 0x63, 0x68, 0x65, 0x2e, 0x64, 0x75, 0x62, 0x62, 0x6f, 0x2e, 0x55, 0x73,
-	0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x3b, 0x67,
-	0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
+	0x6f, 0x2e, 0x64, 0x65, 0x6d, 0x6f, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x00, 0x28, 0x01, 0x30,
+	0x01, 0x42, 0x09, 0x5a, 0x07, 0x2e, 0x2f, 0x3b, 0x67, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72,
+	0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -186,14 +189,14 @@ func file_helloworld_proto_rawDescGZIP() []byte {
 
 var file_helloworld_proto_msgTypes = make([]protoimpl.MessageInfo, 2)
 var file_helloworld_proto_goTypes = []interface{}{
-	(*HelloRequest)(nil), // 0: org.apache.dubbo.HelloRequest
-	(*User)(nil),         // 1: org.apache.dubbo.User
+	(*HelloRequest)(nil), // 0: org.apache.dubbo.demo.HelloRequest
+	(*User)(nil),         // 1: org.apache.dubbo.demo.User
 }
 var file_helloworld_proto_depIdxs = []int32{
-	0, // 0: org.apache.dubbo.Greeter.SayHello:input_type -> org.apache.dubbo.HelloRequest
-	0, // 1: org.apache.dubbo.Greeter.SayHelloStream:input_type -> org.apache.dubbo.HelloRequest
-	1, // 2: org.apache.dubbo.Greeter.SayHello:output_type -> org.apache.dubbo.User
-	1, // 3: org.apache.dubbo.Greeter.SayHelloStream:output_type -> org.apache.dubbo.User
+	0, // 0: org.apache.dubbo.demo.Greeter.SayHello:input_type -> org.apache.dubbo.demo.HelloRequest
+	0, // 1: org.apache.dubbo.demo.Greeter.SayHelloStream:input_type -> org.apache.dubbo.demo.HelloRequest
+	1, // 2: org.apache.dubbo.demo.Greeter.SayHello:output_type -> org.apache.dubbo.demo.User
+	1, // 3: org.apache.dubbo.demo.Greeter.SayHelloStream:output_type -> org.apache.dubbo.demo.User
 	2, // [2:4] is the sub-list for method output_type
 	0, // [0:2] is the sub-list for method input_type
 	0, // [0:0] is the sub-list for extension type_name
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.proto b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.proto
index d6c47ef..5076208 100644
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.proto
+++ b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld.proto
@@ -16,7 +16,7 @@
  */
 syntax = "proto3";
 
-package org.apache.dubbo;
+package org.apache.dubbo.demo;
 
 option go_package = "./;grpc";
 
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go
index ab1d31e..4fb0b92 100644
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go
+++ b/rpc/triple/pb/dubbogo-grpc/protobuf/grpc/helloworld_grpc.pb.go
@@ -1,18 +1,3 @@
-// Licensed to the Apache Software Foundation (ASF) under one or more
-// contributor license agreements.  See the NOTICE file distributed with
-// this work for additional information regarding copyright ownership.
-// The ASF licenses this file to You under the Apache License, Version 2.0
-// (the "License"); you may not use this file except in compliance with
-// the License.  You may obtain a copy of the License at
-//
-//     http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
 // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
 
 package grpc
@@ -48,7 +33,7 @@ func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
 
 func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error) {
 	out := new(User)
-	err := c.cc.Invoke(ctx, "/org.apache.dubbo.Greeter/SayHello", in, out, opts...)
+	err := c.cc.Invoke(ctx, "/org.apache.dubbo.demo.Greeter/SayHello", in, out, opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -56,7 +41,7 @@ func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...
 }
 
 func (c *greeterClient) SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
-	stream, err := c.cc.NewStream(ctx, &Greeter_ServiceDesc.Streams[0], "/org.apache.dubbo.Greeter/SayHelloStream", opts...)
+	stream, err := c.cc.NewStream(ctx, &Greeter_ServiceDesc.Streams[0], "/org.apache.dubbo.demo.Greeter/SayHelloStream", opts...)
 	if err != nil {
 		return nil, err
 	}
@@ -129,7 +114,7 @@ func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(in
 	}
 	info := &grpc.UnaryServerInfo{
 		Server:     srv,
-		FullMethod: "/org.apache.dubbo.Greeter/SayHello",
+		FullMethod: "/org.apache.dubbo.demo.Greeter/SayHello",
 	}
 	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
 		return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
@@ -167,7 +152,7 @@ func (x *greeterSayHelloStreamServer) Recv() (*HelloRequest, error) {
 // It's only intended for direct use with grpc.RegisterService,
 // and not to be introspected or modified (even as a copy)
 var Greeter_ServiceDesc = grpc.ServiceDesc{
-	ServiceName: "org.apache.dubbo.Greeter",
+	ServiceName: "org.apache.dubbo.demo.Greeter",
 	HandlerType: (*GreeterServer)(nil),
 	Methods: []grpc.MethodDesc{
 		{
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/triple/helloworld.pb.go b/rpc/triple/pb/dubbogo-grpc/protobuf/triple/helloworld.pb.go
deleted file mode 100644
index 0257779..0000000
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/triple/helloworld.pb.go
+++ /dev/null
@@ -1,417 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: helloworld.proto
-
-package triple
-
-import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-	math "math"
-)
-
-import (
-	"dubbo.apache.org/dubbo-go/v3/protocol"
-	dgrpc "dubbo.apache.org/dubbo-go/v3/protocol/dubbo3"
-	"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
-	tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
-	dubbo3 "github.com/dubbogo/triple/pkg/triple"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// The request message containing the user's name.
-type HelloRequest struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *HelloRequest) Reset()         { *m = HelloRequest{} }
-func (m *HelloRequest) String() string { return proto.CompactTextString(m) }
-func (*HelloRequest) ProtoMessage()    {}
-func (*HelloRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_17b8c58d586b62f2, []int{0}
-}
-
-func (m *HelloRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_HelloRequest.Unmarshal(m, b)
-}
-func (m *HelloRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_HelloRequest.Marshal(b, m, deterministic)
-}
-func (m *HelloRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_HelloRequest.Merge(m, src)
-}
-func (m *HelloRequest) XXX_Size() int {
-	return xxx_messageInfo_HelloRequest.Size(m)
-}
-func (m *HelloRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_HelloRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_HelloRequest proto.InternalMessageInfo
-
-func (m *HelloRequest) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-// The response message containing the greetings
-type User struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Id                   string   `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
-	Age                  int32    `protobuf:"varint,3,opt,name=age,proto3" json:"age,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *User) Reset()         { *m = User{} }
-func (m *User) String() string { return proto.CompactTextString(m) }
-func (*User) ProtoMessage()    {}
-func (*User) Descriptor() ([]byte, []int) {
-	return fileDescriptor_17b8c58d586b62f2, []int{1}
-}
-
-func (m *User) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_User.Unmarshal(m, b)
-}
-func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_User.Marshal(b, m, deterministic)
-}
-func (m *User) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_User.Merge(m, src)
-}
-func (m *User) XXX_Size() int {
-	return xxx_messageInfo_User.Size(m)
-}
-func (m *User) XXX_DiscardUnknown() {
-	xxx_messageInfo_User.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_User proto.InternalMessageInfo
-
-func (m *User) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *User) GetId() string {
-	if m != nil {
-		return m.Id
-	}
-	return ""
-}
-
-func (m *User) GetAge() int32 {
-	if m != nil {
-		return m.Age
-	}
-	return 0
-}
-
-func init() {
-	proto.RegisterType((*HelloRequest)(nil), "protobuf.HelloRequest")
-	proto.RegisterType((*User)(nil), "protobuf.User")
-}
-
-func init() { proto.RegisterFile("helloworld.proto", fileDescriptor_17b8c58d586b62f2) }
-
-var fileDescriptor_17b8c58d586b62f2 = []byte{
-	// 191 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x48, 0xcd, 0xc9,
-	0xc9, 0x2f, 0xcf, 0x2f, 0xca, 0x49, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0xe2, 0x00, 0x53,
-	0x49, 0xa5, 0x69, 0x4a, 0x4a, 0x5c, 0x3c, 0x1e, 0x20, 0xd9, 0xa0, 0xd4, 0xc2, 0xd2, 0xd4, 0xe2,
-	0x12, 0x21, 0x21, 0x2e, 0x96, 0xbc, 0xc4, 0xdc, 0x54, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20,
-	0x30, 0x5b, 0xc9, 0x86, 0x8b, 0x25, 0xb4, 0x38, 0xb5, 0x08, 0x9b, 0x9c, 0x10, 0x1f, 0x17, 0x53,
-	0x66, 0x8a, 0x04, 0x13, 0x58, 0x84, 0x29, 0x33, 0x45, 0x48, 0x80, 0x8b, 0x39, 0x31, 0x3d, 0x55,
-	0x82, 0x59, 0x81, 0x51, 0x83, 0x35, 0x08, 0xc4, 0x34, 0xaa, 0xe7, 0x62, 0x77, 0x2f, 0x4a, 0x4d,
-	0x2d, 0x49, 0x2d, 0x12, 0x32, 0xe1, 0xe2, 0x08, 0x4e, 0xac, 0x04, 0xdb, 0x27, 0x24, 0xa6, 0x07,
-	0x73, 0x83, 0x1e, 0xb2, 0x03, 0xa4, 0xf8, 0x10, 0xe2, 0x20, 0x4b, 0x95, 0x18, 0x84, 0xec, 0xb8,
-	0xf8, 0x60, 0xba, 0x82, 0x4b, 0x8a, 0x52, 0x13, 0x73, 0x89, 0xd7, 0xab, 0xc1, 0x68, 0xc0, 0xe8,
-	0xc4, 0x1d, 0xc5, 0xa9, 0xa7, 0x6f, 0x5d, 0x52, 0x94, 0x59, 0x90, 0x93, 0x9a, 0xc4, 0x06, 0x56,
-	0x61, 0x0c, 0x08, 0x00, 0x00, 0xff, 0xff, 0x12, 0x44, 0x1c, 0xfd, 0x14, 0x01, 0x00, 0x00,
-}
-
-type greeterDubbo3Client struct {
-	cc *dubbo3.TripleConn
-}
-
-func NewGreeterDubbo3Client(cc *dubbo3.TripleConn) GreeterClient {
-	return &greeterDubbo3Client{cc}
-}
-func (c *greeterDubbo3Client) SayHello(ctx context.Context, in *HelloRequest, opt ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
-	err := c.cc.Invoke(ctx, "/"+interfaceKey+"/SayHello", in, out)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-func (c *greeterDubbo3Client) SayHelloStream(ctx context.Context, opt ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
-	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
-	stream, err := c.cc.NewStream(ctx, "/"+interfaceKey+"/SayHelloStream", opt...)
-	if err != nil {
-		return nil, err
-	}
-	x := &greeterSayHelloStreamClient{stream}
-	return x, nil
-}
-
-// GreeterClientImpl is the client API for Greeter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GreeterClientImpl struct {
-	// Sends a greeting
-	SayHello       func(ctx context.Context, in *HelloRequest) (*User, error)
-	SayHelloStream func(ctx context.Context) (Greeter_SayHelloStreamClient, error)
-}
-
-func (c *GreeterClientImpl) Reference() string {
-	return "greeterImpl"
-}
-
-func (c *GreeterClientImpl) GetDubboStub(cc *dubbo3.TripleConn) GreeterClient {
-	return NewGreeterDubbo3Client(cc)
-}
-
-type GreeterProviderBase struct {
-	proxyImpl protocol.Invoker
-}
-
-func (s *GreeterProviderBase) SetProxyImpl(impl protocol.Invoker) {
-	s.proxyImpl = impl
-}
-
-func (s *GreeterProviderBase) GetProxyImpl() protocol.Invoker {
-	return s.proxyImpl
-}
-
-func (c *GreeterProviderBase) Reference() string {
-	return "greeterImpl"
-}
-
-func _DUBBO_Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	base := srv.(dgrpc.Dubbo3GrpcService)
-	args := []interface{}{}
-	args = append(args, in)
-	invo := invocation.NewRPCInvocation("SayHello", args, nil)
-	if interceptor == nil {
-		result := base.GetProxyImpl().Invoke(ctx, invo)
-		return result.Result(), result.Error()
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/protobuf.Greeter/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		result := base.GetProxyImpl().Invoke(context.Background(), invo)
-		return result.Result(), result.Error()
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _DUBBO_Greeter_SayHelloStream_Handler(srv interface{}, stream grpc.ServerStream) error {
-	_, ok := srv.(dgrpc.Dubbo3GrpcService)
-	invo := invocation.NewRPCInvocation("SayHelloStream", nil, nil)
-	if !ok {
-		fmt.Println(invo)
-	}
-	return srv.(GreeterServer).SayHelloStream(&greeterSayHelloStreamServer{stream})
-}
-
-func (s *GreeterProviderBase) ServiceDesc() *grpc.ServiceDesc {
-	return &grpc.ServiceDesc{
-		ServiceName: "protobuf.Greeter",
-		HandlerType: (*GreeterServer)(nil),
-		Methods: []grpc.MethodDesc{
-			{
-				MethodName: "SayHello",
-				Handler:    _DUBBO_Greeter_SayHello_Handler,
-			},
-		},
-		Streams: []grpc.StreamDesc{
-			{
-				StreamName:    "SayHelloStream",
-				Handler:       _DUBBO_Greeter_SayHelloStream_Handler,
-				ServerStreams: true,
-				ClientStreams: true,
-			},
-		},
-		Metadata: "helloworld.proto",
-	}
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConnInterface
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
-
-// GreeterClient is the client API for Greeter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GreeterClient interface {
-	// Sends a greeting
-	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error)
-	SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error)
-}
-
-type greeterClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
-	return &greeterClient{cc}
-}
-
-func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	err := c.cc.Invoke(ctx, "/protobuf.Greeter/SayHello", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-func (c *greeterClient) SayHelloStream(ctx context.Context, opts ...grpc.CallOption) (Greeter_SayHelloStreamClient, error) {
-	stream, err := c.cc.NewStream(ctx, &_Greeter_serviceDesc.Streams[0], "/protobuf.Greeter/SayHelloStream", opts...)
-	if err != nil {
-		return nil, err
-	}
-	x := &greeterSayHelloStreamClient{stream}
-	return x, nil
-}
-
-type Greeter_SayHelloStreamClient interface {
-	Send(*HelloRequest) error
-	Recv() (*User, error)
-	grpc.ClientStream
-}
-
-type greeterSayHelloStreamClient struct {
-	grpc.ClientStream
-}
-
-func (x *greeterSayHelloStreamClient) Send(m *HelloRequest) error {
-	return x.ClientStream.SendMsg(m)
-}
-
-func (x *greeterSayHelloStreamClient) Recv() (*User, error) {
-	m := new(User)
-	if err := x.ClientStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-// GreeterServer is the server API for Greeter service.
-type GreeterServer interface {
-	// Sends a greeting
-	SayHello(context.Context, *HelloRequest) (*User, error)
-	SayHelloStream(Greeter_SayHelloStreamServer) error
-}
-
-// UnimplementedGreeterServer can be embedded to have forward compatible implementations.
-type UnimplementedGreeterServer struct {
-}
-
-func (*UnimplementedGreeterServer) SayHello(ctx context.Context, req *HelloRequest) (*User, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
-}
-func (*UnimplementedGreeterServer) SayHelloStream(srv Greeter_SayHelloStreamServer) error {
-	return status.Errorf(codes.Unimplemented, "method SayHelloStream not implemented")
-}
-
-func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {
-	s.RegisterService(&_Greeter_serviceDesc, srv)
-}
-
-func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GreeterServer).SayHello(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/protobuf.Greeter/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func _Greeter_SayHelloStream_Handler(srv interface{}, stream grpc.ServerStream) error {
-	return srv.(GreeterServer).SayHelloStream(&greeterSayHelloStreamServer{stream})
-}
-
-type Greeter_SayHelloStreamServer interface {
-	Send(*User) error
-	Recv() (*HelloRequest, error)
-	grpc.ServerStream
-}
-
-type greeterSayHelloStreamServer struct {
-	grpc.ServerStream
-}
-
-func (x *greeterSayHelloStreamServer) Send(m *User) error {
-	return x.ServerStream.SendMsg(m)
-}
-
-func (x *greeterSayHelloStreamServer) Recv() (*HelloRequest, error) {
-	m := new(HelloRequest)
-	if err := x.ServerStream.RecvMsg(m); err != nil {
-		return nil, err
-	}
-	return m, nil
-}
-
-var _Greeter_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "protobuf.Greeter",
-	HandlerType: (*GreeterServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "SayHello",
-			Handler:    _Greeter_SayHello_Handler,
-		},
-	},
-	Streams: []grpc.StreamDesc{
-		{
-			StreamName:    "SayHelloStream",
-			Handler:       _Greeter_SayHelloStream_Handler,
-			ServerStreams: true,
-			ClientStreams: true,
-		},
-	},
-	Metadata: "helloworld.proto",
-}
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/triple/helloworld.proto b/rpc/triple/pb/dubbogo-grpc/protobuf/triple/helloworld.proto
deleted file mode 100644
index 0fd85a6..0000000
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/triple/helloworld.proto
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-syntax = "proto3";
-package protobuf;
-
-option go_package = "./;triple";
-
-// The greeting service definition.
-service Greeter {
-  // Sends a greeting
-  rpc SayHello (HelloRequest) returns (User) {}
-  rpc SayHelloStream (stream HelloRequest) returns (stream User) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
-  string name = 1;
-}
-
-// The response message containing the greetings
-message User {
-  string name = 1;
-  string id = 2;
-  int32 age = 3;
-}
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/protobuf/triple/protobuf.mk b/rpc/triple/pb/dubbogo-grpc/protobuf/triple/protobuf.mk
deleted file mode 100644
index beffc5e..0000000
--- a/rpc/triple/pb/dubbogo-grpc/protobuf/triple/protobuf.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-.PHONY: compile
-PROTOC_GEN_GO := $(GOPATH)/bin/protoc-gen-go
-PROTOC := $(shell which protoc)
-ifeq ($(PROTOC),)
-	PROTOC = must-rebuild
-endif
-
-UNAME := $(shell uname)
-
-$(PROTOC):
-ifeq ($(UNAME), Darwin)
-	brew install protobuf
-endif
-ifeq ($(UNAME), Linux)
-	sudo apt-get install protobuf-compiler
-endif
-
-$(PROTOC_GEN_GO):
-	go get -u github.com/apache/dubbo-go/protocol/dubbo3/protoc-gen-dubbo3@3.0
-
-helloworld.pb.go: helloworld.proto | $(PROTOC_GEN_GO) $(PROTOC)
-	protoc -I . helloworld.proto --dubbo3_out=plugins=grpc+dubbo:.
-
-.PHONY: compile
-compile: helloworld.pb.go
-
diff --git a/rpc/triple/pb/dubbogo-grpc/server/grpcgo-server/main.go b/rpc/triple/pb/dubbogo-grpc/server/grpcgo-server/main.go
deleted file mode 100644
index 7a914bd..0000000
--- a/rpc/triple/pb/dubbogo-grpc/server/grpcgo-server/main.go
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"log"
-	"net"
-)
-
-import (
-	"github.com/dubbogo/net/context"
-
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/reflection"
-)
-
-import (
-	pb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/grpc"
-)
-
-const (
-	port = ":20000"
-)
-
-// GreeterProvider is used as provider
-type GreeterProvider struct{
-	pb.UnimplementedGreeterServer
-}
-
-func (s *GreeterProvider) SayHelloStream(svr pb.Greeter_SayHelloStreamServer) error {
-	c, err := svr.Recv()
-	if err != nil {
-		return err
-	}
-	fmt.Printf("grpc GreeterProvider recv 1 user, name = %s\n", c.Name)
-	c2, err := svr.Recv()
-	if err != nil {
-		return err
-	}
-	fmt.Printf("grpc GreeterProvider recv 2 user, name = %s\n", c2.Name)
-
-	svr.Send(&pb.User{
-		Name: "hello " + c.Name,
-		Age:  18,
-		Id:   "123456789",
-	})
-	c3, err := svr.Recv()
-	if err != nil {
-		return err
-	}
-	fmt.Printf("grpc GreeterProvider recv 3 user, name = %s\n", c3.Name)
-	svr.Send(&pb.User{
-		Name: "hello " + c2.Name,
-		Age:  19,
-		Id:   "123456789",
-	})
-	return nil
-}
-
-func (s *GreeterProvider) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.User, error) {
-	fmt.Printf("Dubbo3 GreeterProvider get user name = %s\n" + in.Name)
-	return &pb.User{Name: "Hello " + in.Name, Id: "12345", Age: 21}, nil
-}
-
-func main() {
-	lis, err := net.Listen("tcp", port)
-	if err != nil {
-		log.Fatalf("failed to listen: %v", err)
-	}
-	s := grpc.NewServer()
-	pb.RegisterGreeterServer(s, &GreeterProvider{})
-	// Register reflection service on gRPC client.
-	reflection.Register(s)
-	if err := s.Serve(lis); err != nil {
-		log.Fatalf("failed to serve: %v", err)
-	}
-}
diff --git a/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/cmd/client.go b/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/cmd/client.go
deleted file mode 100644
index 184ac41..0000000
--- a/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/cmd/client.go
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"context"
-	"time"
-)
-
-import (
-	"dubbo.apache.org/dubbo-go/v3/common/logger"
-	"dubbo.apache.org/dubbo-go/v3/config"
-	_ "dubbo.apache.org/dubbo-go/v3/imports"
-
-	tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
-)
-
-import (
-	triplepb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/triple"
-)
-
-var greeterProvider = new(triplepb.GreeterClientImpl)
-
-func init() {
-	config.SetConsumerService(greeterProvider)
-}
-
-// export DUBBO_GO_CONFIG_PATH=$PATH_TO_SAMPLES/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/conf/dubbogo.yml
-func main() {
-	if err := config.Load(); err != nil {
-		panic(err)
-	}
-	time.Sleep(time.Second * 3)
-
-	testSayHello()
-}
-
-func testSayHello() {
-	ctx := context.Background()
-	ctx = context.WithValue(ctx, tripleConstant.TripleCtxKey(tripleConstant.TripleRequestID), "triple-request-id-demo")
-
-	req := triplepb.HelloRequest{
-		Name: "laurence",
-	}
-	user, err := greeterProvider.SayHello(ctx, &req)
-	if err != nil {
-		panic(err)
-	}
-
-	logger.Infof("Receive user = %+v\n", user)
-}
diff --git a/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/conf/dubbogo.yml b/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/conf/dubbogo.yml
deleted file mode 100644
index 89b9dd2..0000000
--- a/rpc/triple/pb/dubbogo-grpc/unary-client/dubbogo-client/conf/dubbogo.yml
+++ /dev/null
@@ -1,10 +0,0 @@
-dubbo:
-  registries:
-    zk:
-      address: zookeeper://127.0.0.1:2181
-  consumer:
-    registry: zk
-    references:
-      greeterImpl:
-        protocol: tri
-        interface: org.apache.dubbo.Greeter
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-grpc/unary-client/grpcgo-client/main.go b/rpc/triple/pb/dubbogo-grpc/unary-client/grpcgo-client/main.go
deleted file mode 100644
index 9899de4..0000000
--- a/rpc/triple/pb/dubbogo-grpc/unary-client/grpcgo-client/main.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
-	"fmt"
-	"log"
-)
-
-import (
-	"github.com/dubbogo/net/context"
-
-	"google.golang.org/grpc"
-)
-
-import (
-	pb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-grpc/protobuf/grpc"
-)
-
-const (
-	address = "localhost:20000"
-)
-
-func main() {
-	// Set up a connection to the client.
-	conn, err := grpc.Dial(address, grpc.WithInsecure())
-	if err != nil {
-		log.Fatalf("did not connect: %v", err)
-	}
-	defer conn.Close()
-	c := pb.NewGreeterClient(conn)
-
-	req := &pb.HelloRequest{
-		Name: "laurence",
-	}
-	ctx := context.Background()
-	rsp, err := c.SayHello(ctx, req)
-	if err != nil {
-		panic(err)
-	}
-	fmt.Printf("get received user = %+v\n", rsp)
-}
diff --git a/rpc/triple/pb/dubbogo-java/README.md b/rpc/triple/pb/dubbogo-java/README.md
index 1b1ae15..f1da3cc 100644
--- a/rpc/triple/pb/dubbogo-java/README.md
+++ b/rpc/triple/pb/dubbogo-java/README.md
@@ -1,22 +1,13 @@
-# dubbo-java intercommunication
+# dubbogo-java
 
-For api definition and go client and server startup, please refer to [dubbogo-grpc](../dubbogo-grpc/README.md)
+Most of the procedure are same with [dubbogo-grpc](../dubbogo-grpc), like compiling proto file.
 
-## Instructions
-
-1. Start the server
-
-Use goland to start triple/gojava-go-server
-
-or
-
-Execute `sh run.sh` in the java-server folder to start the java server
+## Getting Started
 
+1. Start the java server:
+    - Use goland to start triple/gojava-go-server
+    - Execute `sh run.sh` in the java-server folder to start the java server
 2. Start the client
-
-Use goland to start triple/gojava-go-client
-
-or
-
-Execute `sh run.sh` under the java-client folder to start the java client
+    - Use goland to start triple/gojava-go-client
+    - Execute `sh run.sh` under the java-client folder to start the java client
 
diff --git a/rpc/triple/pb/dubbogo-java/README_zh.md b/rpc/triple/pb/dubbogo-java/README_zh.md
index b3d8f8a..41a7fcd 100644
--- a/rpc/triple/pb/dubbogo-java/README_zh.md
+++ b/rpc/triple/pb/dubbogo-java/README_zh.md
@@ -1,21 +1,12 @@
-# dubbo-java互通
+# dubbogo-java
 
-api 定义以及 go 客户端、服务端启动,可以参考 [dubbogo-grpc](../dubbogo-grpc/README_zh.md)
+大部分步骤与 [dubbogo-grpc](../dubbogo-grpc) 一样,如编译 proto 文件。
 
-## 使用方法
+## 开始
 
 1. 启动服务端
-
-使用 goland 启动 triple/gojava-go-server
-
-或者
-
-在 java-server 文件夹下执行 `sh run.sh` 启动 java server
-
+    - 使用 goland 启动 triple/gojava-go-server
+    - 在 java-server 文件夹下执行 `sh run.sh` 启动 java server
 2. 启动客户端
-
-使用 goland 启动 triple/gojava-go-client
-
-或者
-
-在 java-client 文件夹下执行 `sh run.sh` 启动 java client
+    - 使用 goland 启动 triple/gojava-go-client
+    - 在 java-client 文件夹下执行 `sh run.sh` 启动 java client
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-java/go-client/cmd/client.go b/rpc/triple/pb/dubbogo-java/go-client/cmd/client.go
index dff136f..6a52f37 100644
--- a/rpc/triple/pb/dubbogo-java/go-client/cmd/client.go
+++ b/rpc/triple/pb/dubbogo-java/go-client/cmd/client.go
@@ -31,7 +31,7 @@ import (
 )
 
 import (
-	pb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-java/protobuf"
+	pb "github.com/apache/dubbo-go-samples/api"
 )
 
 var grpcGreeterImpl = new(pb.GreeterClientImpl)
diff --git a/rpc/triple/pb/dubbogo-java/go-server/pkg/greeter.go b/rpc/triple/pb/dubbogo-java/go-server/pkg/greeter.go
index c5b242a..1f8de6d 100644
--- a/rpc/triple/pb/dubbogo-java/go-server/pkg/greeter.go
+++ b/rpc/triple/pb/dubbogo-java/go-server/pkg/greeter.go
@@ -26,7 +26,7 @@ import (
 )
 
 import (
-	pb "github.com/apache/dubbo-go-samples/rpc/triple/pb/dubbogo-java/protobuf"
+	pb "github.com/apache/dubbo-go-samples/api"
 )
 
 type GreeterProvider struct {
diff --git a/rpc/triple/pb/dubbogo-java/protobuf/helloworld.pb.go b/rpc/triple/pb/dubbogo-java/protobuf/helloworld.pb.go
deleted file mode 100644
index 968628a..0000000
--- a/rpc/triple/pb/dubbogo-java/protobuf/helloworld.pb.go
+++ /dev/null
@@ -1,322 +0,0 @@
-// Code generated by protoc-gen-go. DO NOT EDIT.
-// source: helloworld.proto
-
-package protobuf
-
-import (
-	context "context"
-	fmt "fmt"
-	proto "github.com/golang/protobuf/proto"
-	grpc "google.golang.org/grpc"
-	codes "google.golang.org/grpc/codes"
-	status "google.golang.org/grpc/status"
-	math "math"
-)
-
-import (
-	"dubbo.apache.org/dubbo-go/v3/protocol"
-	dgrpc "dubbo.apache.org/dubbo-go/v3/protocol/dubbo3"
-	"dubbo.apache.org/dubbo-go/v3/protocol/invocation"
-	tripleConstant "github.com/dubbogo/triple/pkg/common/constant"
-	dubbo3 "github.com/dubbogo/triple/pkg/triple"
-)
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ = proto.Marshal
-var _ = fmt.Errorf
-var _ = math.Inf
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
-
-// The request message containing the user's name.
-type HelloRequest struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *HelloRequest) Reset()         { *m = HelloRequest{} }
-func (m *HelloRequest) String() string { return proto.CompactTextString(m) }
-func (*HelloRequest) ProtoMessage()    {}
-func (*HelloRequest) Descriptor() ([]byte, []int) {
-	return fileDescriptor_17b8c58d586b62f2, []int{0}
-}
-
-func (m *HelloRequest) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_HelloRequest.Unmarshal(m, b)
-}
-func (m *HelloRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_HelloRequest.Marshal(b, m, deterministic)
-}
-func (m *HelloRequest) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_HelloRequest.Merge(m, src)
-}
-func (m *HelloRequest) XXX_Size() int {
-	return xxx_messageInfo_HelloRequest.Size(m)
-}
-func (m *HelloRequest) XXX_DiscardUnknown() {
-	xxx_messageInfo_HelloRequest.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_HelloRequest proto.InternalMessageInfo
-
-func (m *HelloRequest) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-// The response message containing the greetings
-type User struct {
-	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
-	Id                   string   `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"`
-	Age                  int32    `protobuf:"varint,3,opt,name=age,proto3" json:"age,omitempty"`
-	XXX_NoUnkeyedLiteral struct{} `json:"-"`
-	XXX_unrecognized     []byte   `json:"-"`
-	XXX_sizecache        int32    `json:"-"`
-}
-
-func (m *User) Reset()         { *m = User{} }
-func (m *User) String() string { return proto.CompactTextString(m) }
-func (*User) ProtoMessage()    {}
-func (*User) Descriptor() ([]byte, []int) {
-	return fileDescriptor_17b8c58d586b62f2, []int{1}
-}
-
-func (m *User) XXX_Unmarshal(b []byte) error {
-	return xxx_messageInfo_User.Unmarshal(m, b)
-}
-func (m *User) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
-	return xxx_messageInfo_User.Marshal(b, m, deterministic)
-}
-func (m *User) XXX_Merge(src proto.Message) {
-	xxx_messageInfo_User.Merge(m, src)
-}
-func (m *User) XXX_Size() int {
-	return xxx_messageInfo_User.Size(m)
-}
-func (m *User) XXX_DiscardUnknown() {
-	xxx_messageInfo_User.DiscardUnknown(m)
-}
-
-var xxx_messageInfo_User proto.InternalMessageInfo
-
-func (m *User) GetName() string {
-	if m != nil {
-		return m.Name
-	}
-	return ""
-}
-
-func (m *User) GetId() string {
-	if m != nil {
-		return m.Id
-	}
-	return ""
-}
-
-func (m *User) GetAge() int32 {
-	if m != nil {
-		return m.Age
-	}
-	return 0
-}
-
-func init() {
-	proto.RegisterType((*HelloRequest)(nil), "org.apache.dubbo.demo.HelloRequest")
-	proto.RegisterType((*User)(nil), "org.apache.dubbo.demo.User")
-}
-
-func init() { proto.RegisterFile("helloworld.proto", fileDescriptor_17b8c58d586b62f2) }
-
-var fileDescriptor_17b8c58d586b62f2 = []byte{
-	// 189 bytes of a gzipped FileDescriptorProto
-	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0xc8, 0x48, 0xcd, 0xc9,
-	0xc9, 0x2f, 0xcf, 0x2f, 0xca, 0x49, 0xd1, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0xcd, 0x2f,
-	0x4a, 0xd7, 0x4b, 0x2c, 0x48, 0x4c, 0xce, 0x48, 0xd5, 0x4b, 0x29, 0x4d, 0x4a, 0xca, 0xd7, 0x4b,
-	0x49, 0xcd, 0xcd, 0x57, 0x52, 0xe2, 0xe2, 0xf1, 0x00, 0x29, 0x0d, 0x4a, 0x2d, 0x2c, 0x4d, 0x2d,
-	0x2e, 0x11, 0x12, 0xe2, 0x62, 0xc9, 0x4b, 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c,
-	0x02, 0xb3, 0x95, 0x6c, 0xb8, 0x58, 0x42, 0x8b, 0x53, 0x8b, 0xb0, 0xc9, 0x09, 0xf1, 0x71, 0x31,
-	0x65, 0xa6, 0x48, 0x30, 0x81, 0x45, 0x98, 0x32, 0x53, 0x84, 0x04, 0xb8, 0x98, 0x13, 0xd3, 0x53,
-	0x25, 0x98, 0x15, 0x18, 0x35, 0x58, 0x83, 0x40, 0x4c, 0xa3, 0x48, 0x2e, 0x76, 0xf7, 0xa2, 0xd4,
-	0xd4, 0x92, 0xd4, 0x22, 0x21, 0x3f, 0x2e, 0x8e, 0xe0, 0xc4, 0x4a, 0xb0, 0x7d, 0x42, 0xca, 0x7a,
-	0x58, 0x1d, 0xa4, 0x87, 0xec, 0x1a, 0x29, 0x69, 0x1c, 0x8a, 0x40, 0xce, 0x51, 0x62, 0x70, 0xe2,
-	0x8d, 0xe2, 0xd6, 0xd3, 0xb7, 0x06, 0xfb, 0x2f, 0xa9, 0x34, 0x2d, 0x89, 0x0d, 0xcc, 0x32, 0x06,
-	0x04, 0x00, 0x00, 0xff, 0xff, 0x6e, 0x28, 0x10, 0x08, 0xfd, 0x00, 0x00, 0x00,
-}
-
-type greeterDubbo3Client struct {
-	cc *dubbo3.TripleConn
-}
-
-func NewGreeterDubbo3Client(cc *dubbo3.TripleConn) GreeterClient {
-	return &greeterDubbo3Client{cc}
-}
-func (c *greeterDubbo3Client) SayHello(ctx context.Context, in *HelloRequest, opt ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	interfaceKey := ctx.Value(tripleConstant.InterfaceKey).(string)
-	err := c.cc.Invoke(ctx, "/"+interfaceKey+"/SayHello", in, out)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// GreeterClientImpl is the client API for Greeter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GreeterClientImpl struct {
-	// Sends a greeting
-	SayHello func(ctx context.Context, in *HelloRequest) (*User, error)
-}
-
-func (c *GreeterClientImpl) Reference() string {
-	return "greeterImpl"
-}
-
-func (c *GreeterClientImpl) GetDubboStub(cc *dubbo3.TripleConn) GreeterClient {
-	return NewGreeterDubbo3Client(cc)
-}
-
-type GreeterProviderBase struct {
-	proxyImpl protocol.Invoker
-}
-
-func (s *GreeterProviderBase) SetProxyImpl(impl protocol.Invoker) {
-	s.proxyImpl = impl
-}
-
-func (s *GreeterProviderBase) GetProxyImpl() protocol.Invoker {
-	return s.proxyImpl
-}
-
-func (c *GreeterProviderBase) Reference() string {
-	return "greeterImpl"
-}
-
-func _DUBBO_Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	base := srv.(dgrpc.Dubbo3GrpcService)
-	args := []interface{}{}
-	args = append(args, in)
-	invo := invocation.NewRPCInvocation("SayHello", args, nil)
-	if interceptor == nil {
-		result := base.GetProxyImpl().Invoke(ctx, invo)
-		return result.Result(), result.Error()
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/org.apache.dubbo.demo.Greeter/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		result := base.GetProxyImpl().Invoke(context.Background(), invo)
-		return result.Result(), result.Error()
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-func (s *GreeterProviderBase) ServiceDesc() *grpc.ServiceDesc {
-	return &grpc.ServiceDesc{
-		ServiceName: "org.apache.dubbo.demo.Greeter",
-		HandlerType: (*GreeterServer)(nil),
-		Methods: []grpc.MethodDesc{
-			{
-				MethodName: "SayHello",
-				Handler:    _DUBBO_Greeter_SayHello_Handler,
-			},
-		},
-		Streams:  []grpc.StreamDesc{},
-		Metadata: "helloworld.proto",
-	}
-}
-
-// Reference imports to suppress errors if they are not otherwise used.
-var _ context.Context
-var _ grpc.ClientConnInterface
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the grpc package it is being compiled against.
-const _ = grpc.SupportPackageIsVersion6
-
-// GreeterClient is the client API for Greeter service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type GreeterClient interface {
-	// Sends a greeting
-	SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error)
-}
-
-type greeterClient struct {
-	cc grpc.ClientConnInterface
-}
-
-func NewGreeterClient(cc grpc.ClientConnInterface) GreeterClient {
-	return &greeterClient{cc}
-}
-
-func (c *greeterClient) SayHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*User, error) {
-	out := new(User)
-	err := c.cc.Invoke(ctx, "/org.apache.dubbo.demo.Greeter/SayHello", in, out, opts...)
-	if err != nil {
-		return nil, err
-	}
-	return out, nil
-}
-
-// GreeterServer is the server API for Greeter service.
-type GreeterServer interface {
-	// Sends a greeting
-	SayHello(context.Context, *HelloRequest) (*User, error)
-}
-
-// UnimplementedGreeterServer can be embedded to have forward compatible implementations.
-type UnimplementedGreeterServer struct {
-}
-
-func (*UnimplementedGreeterServer) SayHello(ctx context.Context, req *HelloRequest) (*User, error) {
-	return nil, status.Errorf(codes.Unimplemented, "method SayHello not implemented")
-}
-
-func RegisterGreeterServer(s *grpc.Server, srv GreeterServer) {
-	s.RegisterService(&_Greeter_serviceDesc, srv)
-}
-
-func _Greeter_SayHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
-	in := new(HelloRequest)
-	if err := dec(in); err != nil {
-		return nil, err
-	}
-	if interceptor == nil {
-		return srv.(GreeterServer).SayHello(ctx, in)
-	}
-	info := &grpc.UnaryServerInfo{
-		Server:     srv,
-		FullMethod: "/org.apache.dubbo.demo.Greeter/SayHello",
-	}
-	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
-		return srv.(GreeterServer).SayHello(ctx, req.(*HelloRequest))
-	}
-	return interceptor(ctx, in, info, handler)
-}
-
-var _Greeter_serviceDesc = grpc.ServiceDesc{
-	ServiceName: "org.apache.dubbo.demo.Greeter",
-	HandlerType: (*GreeterServer)(nil),
-	Methods: []grpc.MethodDesc{
-		{
-			MethodName: "SayHello",
-			Handler:    _Greeter_SayHello_Handler,
-		},
-	},
-	Streams:  []grpc.StreamDesc{},
-	Metadata: "helloworld.proto",
-}
diff --git a/rpc/triple/pb/dubbogo-java/protobuf/helloworld.proto b/rpc/triple/pb/dubbogo-java/protobuf/helloworld.proto
deleted file mode 100644
index 04783eb..0000000
--- a/rpc/triple/pb/dubbogo-java/protobuf/helloworld.proto
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-syntax = "proto3";
-package org.apache.dubbo.demo;
-
-option go_package = "./;protobuf";
-
-// The greeting service definition.
-service Greeter {
-  // Sends a greeting
-  rpc SayHello (HelloRequest) returns (User) {}
-}
-
-// The request message containing the user's name.
-message HelloRequest {
-  string name = 1;
-}
-
-// The response message containing the greetings
-message User {
-  string name = 1;
-  string id = 2;
-  int32 age = 3;
-}
\ No newline at end of file
diff --git a/rpc/triple/pb/dubbogo-java/protobuf/protobuf.mk b/rpc/triple/pb/dubbogo-java/protobuf/protobuf.mk
deleted file mode 100644
index 5680c3d..0000000
--- a/rpc/triple/pb/dubbogo-java/protobuf/protobuf.mk
+++ /dev/null
@@ -1,26 +0,0 @@
-.PHONY: compile
-PROTOC_GEN_GO := $(GOPATH)/bin/protoc-gen-go
-PROTOC := $(shell which protoc)
-ifeq ($(PROTOC),)
-	PROTOC = must-rebuild
-endif
-
-UNAME := $(shell uname)
-
-$(PROTOC):
-ifeq ($(UNAME), Darwin)
-	brew install protobuf
-endif
-ifeq ($(UNAME), Linux)
-	sudo apt-get install protobuf-compiler
-endif
-
-$(PROTOC_GEN_GO):
-	go get -u dubbo.apache.org/dubbo-go/v3/protocol/dubbo3/protoc-gen-dubbo3
-
-helloworld.pb.go: helloworld.proto | $(PROTOC_GEN_GO) $(PROTOC)
-	protoc -I . helloworld.proto --dubbo3_out=plugins=grpc+dubbo:.
-
-.PHONY: compile
-compile: helloworld.pb.go
-
diff --git a/start_integrate_test.sh b/start_integrate_test.sh
index 99ba8dc..0428936 100755
--- a/start_integrate_test.sh
+++ b/start_integrate_test.sh
@@ -100,6 +100,7 @@ array+=("registry/nacos")
 # rpc
 array+=("rpc/triple/codec-extension")
 array+=("rpc/triple/hessian2")
+array+=("rpc/triple/pb/dubbogo-grpc")
 
 for((i=0;i<${#array[*]};i++))
 do