You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dubbo.apache.org by al...@apache.org on 2021/09/19 14:28:23 UTC

[dubbo-go-samples] branch config-enhance updated: Ftr/JsonRPC using dubbogo config (#242)

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

alexstocks 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 f6a87e2  Ftr/JsonRPC using dubbogo config  (#242)
f6a87e2 is described below

commit f6a87e2bbfcd0fa99887135007f20881a0c1ebed
Author: phil <ph...@foxmail.com>
AuthorDate: Sun Sep 19 22:28:15 2021 +0800

    Ftr/JsonRPC using dubbogo config  (#242)
    
    * update: upgrade JsonRPC sample by dubbogo config
    
    * update: test?
    
    * update: revert start_integrate_test.sh
    
    * update: func return
    
    * update: fix and clean code
    - fix JsonRPC -> JSON-RPC
    - del docker dir of test package
    - del registry of `shanghaizk` zk
    - fix rm func Reference(), and config by dubbogo.yml
    
    * update: fix the way of init struct,   change to
    
    Co-authored-by: yuefengbo <yu...@meituan.com>
---
 .run/rpc/jsonrpc/rpc-jsonrpc-go-client.run.xml     |  14 ++
 .../rpc/jsonrpc/tests/integration/main_test.go     |  54 ++++++++
 .../jsonrpc/tests/integration/userprovider_test.go |  57 ++++++++
 rpc/jsonrpc/README.md                              |  67 +++++++++
 rpc/jsonrpc/README_zh.md                           |  67 +++++++++
 rpc/jsonrpc/go-client/cmd/client.go                | 151 +++++++++------------
 rpc/jsonrpc/go-client/conf/client.yml              |  60 --------
 rpc/jsonrpc/go-client/conf/dubbogo.yml             |  49 +++++++
 rpc/jsonrpc/go-client/conf/log.yml                 |  28 ----
 rpc/jsonrpc/go-client/pkg/user.go                  |  44 +++---
 rpc/jsonrpc/go-server/cmd/server.go                |  14 +-
 rpc/jsonrpc/go-server/conf/dubbogo.yml             |  59 ++++++++
 rpc/jsonrpc/go-server/conf/log.yml                 |  28 ----
 rpc/jsonrpc/go-server/conf/server.yml              |  75 ----------
 rpc/jsonrpc/go-server/docker/docker-compose.yml    |   9 ++
 rpc/jsonrpc/go-server/pkg/user.go                  |   1 -
 rpc/jsonrpc/go-server/pkg/user_provider.go         |  43 +++---
 rpc/jsonrpc/go-server/pkg/user_provider1.go        |  41 +++---
 rpc/jsonrpc/go-server/pkg/user_provider2.go        |  43 +++---
 rpc/jsonrpc/java-client/build.sh                   |   3 -
 rpc/jsonrpc/java-client/pom.xml                    |   8 ++
 .../src/main/java/com/ikurento/user/User.java      |   4 +-
 rpc/jsonrpc/java-server/build.sh                   |   5 +-
 rpc/jsonrpc/java-server/pom.xml                    |   8 ++
 rpc/jsonrpc/java-server/script/debug.sh            |  22 ---
 start_integrate_test.sh                            |   1 +
 26 files changed, 542 insertions(+), 413 deletions(-)

diff --git a/.run/rpc/jsonrpc/rpc-jsonrpc-go-client.run.xml b/.run/rpc/jsonrpc/rpc-jsonrpc-go-client.run.xml
new file mode 100644
index 0000000..02447c7
--- /dev/null
+++ b/.run/rpc/jsonrpc/rpc-jsonrpc-go-client.run.xml
@@ -0,0 +1,14 @@
+<component name="ProjectRunConfigurationManager">
+  <configuration default="false" name="rpc-jsonrpc-go-client" type="GoApplicationRunConfiguration" factoryName="Go Application" folderName="rpc/jsonrpc">
+    <module name="dubbo-go-samples" />
+    <working_directory value="$PROJECT_DIR$" />
+    <envs>
+      <env name="DUBBO_GO_CONFIG_PATH" value="$PROJECT_DIR$/rpc/jsonrpc/go-client/conf/dubbogo.yml" />
+    </envs>
+    <kind value="PACKAGE" />
+    <package value="github.com/apache/dubbo-go-samples/rpc/jsonrpc/go-client/cmd" />
+    <directory value="$PROJECT_DIR$" />
+    <filePath value="$PROJECT_DIR$/rpc/jsonrpc/go-client/cmd/client.go" />
+    <method v="2" />
+  </configuration>
+</component>
\ No newline at end of file
diff --git a/integrate_test/rpc/jsonrpc/tests/integration/main_test.go b/integrate_test/rpc/jsonrpc/tests/integration/main_test.go
new file mode 100644
index 0000000..34a6335
--- /dev/null
+++ b/integrate_test/rpc/jsonrpc/tests/integration/main_test.go
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package integration
+
+import (
+	"os"
+	"testing"
+	"time"
+)
+
+import (
+	_ "dubbo.apache.org/dubbo-go/v3/common/logger"
+	"dubbo.apache.org/dubbo-go/v3/config"
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
+)
+
+import (
+	"github.com/apache/dubbo-go-samples/rpc/jsonrpc/go-client/pkg"
+)
+
+var (
+	userProvider  = &pkg.UserProvider{}
+	userProvider1 = &pkg.UserProvider1{}
+	userProvider2 = &pkg.UserProvider2{}
+)
+
+func init() {
+	config.SetConsumerService(userProvider)
+	config.SetConsumerService(userProvider1)
+	config.SetConsumerService(userProvider2)
+}
+
+func TestMain(m *testing.M) {
+
+	config.Load()
+
+	time.Sleep(3 * time.Second)
+
+	os.Exit(m.Run())
+}
diff --git a/integrate_test/rpc/jsonrpc/tests/integration/userprovider_test.go b/integrate_test/rpc/jsonrpc/tests/integration/userprovider_test.go
new file mode 100644
index 0000000..785997b
--- /dev/null
+++ b/integrate_test/rpc/jsonrpc/tests/integration/userprovider_test.go
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package integration
+
+import (
+	"context"
+	"testing"
+)
+
+import (
+	"github.com/stretchr/testify/assert"
+)
+
+func TestTest(t *testing.T) {
+
+	ctx := context.Background()
+
+	// test Echo
+	echo, err := userProvider.Echo(ctx, "Phil")
+	assert.Nil(t, err)
+	assert.Equal(t, "Phil", echo)
+
+	// test GetUser
+	user, err := userProvider.GetUser(ctx, "A003")
+	assert.Nil(t, err)
+	assert.Equal(t, "Moorse", user.Name)
+	assert.Equal(t, int64(30), user.Age)
+	assert.Equal(t, "MAN", user.Sex)
+
+	user0, err := userProvider.GetUser0("A003", "Moorse")
+	assert.Nil(t, err)
+	assert.Equal(t, "Moorse", user0.Name)
+	assert.Equal(t, int64(30), user0.Age)
+	assert.Equal(t, "MAN", user0.Sex)
+
+	//users, err := userProvider.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+	//assert.Nil(t, err)
+	//assert.Equal(t, "Lily", users[0].Name)
+	//assert.Equal(t, int64(20), users[0].Age)
+	//assert.Equal(t, "WOMAN", users[0].Sex)
+
+}
diff --git a/rpc/jsonrpc/README.md b/rpc/jsonrpc/README.md
new file mode 100644
index 0000000..5e92a16
--- /dev/null
+++ b/rpc/jsonrpc/README.md
@@ -0,0 +1,67 @@
+# JSON-RPC Example
+
+## Backend
+
+Dubbo3 provides Triple(Dubbo3), Dubbo2 protocols, which are native to the Dubbo framework.
+In addition, Dubbo3 also integrates a number of third-party protocols into Dubbo's programming and service governance architecture,
+Including gRPC, Thrift, **JSON-RPC**, Hessian2, and REST. The following describes the **JSON-RPC** protocol example.
+
+## Start
+
+- Start the registry
+- Start go-server and go-client, practice with **JSON-RPC**  
+- Start java-server and java-client, practice with **JSON-RPC**
+
+### Start the registry
+
+Start the registry by docker-compose:
+
+```shell
+docker-compose -f go-server/docker/docker-compose.yml up -d
+```
+
+Stop the registry
+
+```shell
+docker-compose -f go-server/docker/docker-compose.yml dowm
+```
+
+### Start Go Server and Client
+
+Note: Goland users can directly use the boot mode configured by '.run ', refer to [HOWTO.md](../HOWTO_zh.md)
+
+Start go-server:
+
+Config the configuration file of **Dubbogo**([server/dubbogo.yml](go-server/conf/dubbogo.yml)):
+
+```shell
+DUBBO_GO_CONFIG_PATH=${$PROJECT_DIR$}/dubbo-go-samples/rpc/jsonrpc/go-server/conf/dubbogo.yml
+```
+
+Start go-client:
+
+Config the configuration file of **Dubbogo**([client/dubbogo.yml](go-client/conf/dubbogo.yml)):
+
+```shell
+DUBBO_GO_CONFIG_PATH=${$PROJECT_DIR$}/dubbo-go-samples/rpc/jsonrpc/go-client/conf/dubbogo.yml
+```
+
+### Start Java Server and Client
+
+Start java-server:
+
+run [build.sh](java-server/build.sh) ,Maven environment required
+
+```shell
+bash build.sh
+```
+
+Start java-client:
+
+run [build.sh](java-client/build.sh),Maven environment required
+
+```shell
+bash build.sh
+```
+
+
diff --git a/rpc/jsonrpc/README_zh.md b/rpc/jsonrpc/README_zh.md
new file mode 100644
index 0000000..2362f55
--- /dev/null
+++ b/rpc/jsonrpc/README_zh.md
@@ -0,0 +1,67 @@
+# JSON-RPC 示例
+
+## 背景
+
+Dubbo3 提供了 Triple(Dubbo3)、Dubbo2 协议,这是 Dubbo 框架的原生协议。
+除此之外,Dubbo3 也对众多第三方协议进行了集成,并将它们纳入 Dubbo 的编程与服务治理体系,
+包括 gRPC、Thrift、**JSON-RPC**、Hessian2、REST 等。以下重点介绍 **JSON-RPC** 协议示例。
+
+## 如何启动
+
+- 启动注册中心
+- 启动 go-server、go-client 查看 **JSON-RPC** 效果
+- 启动 java-server、java-client 查看 **JSON-RPC** 效果
+
+### 启动注册中心
+
+启动项目提供注册中心
+
+```shell
+docker-compose -f go-server/docker/docker-compose.yml up -d
+```
+
+关闭注册中心
+
+```shell
+docker-compose -f go-server/docker/docker-compose.yml dowm
+```
+
+### 启动 Go Server、Client
+
+注:Goland 用户可以直接使用 `.run` 配置的启动方式, 详情参考 [HOWTO.md](../HOWTO_zh.md)
+
+启动 go-server:
+
+配置 Dubbogo 配置文件路径([server/dubbogo.yml](go-server/conf/dubbogo.yml)):
+
+```shell
+DUBBO_GO_CONFIG_PATH=${$PROJECT_DIR$}/dubbo-go-samples/rpc/jsonrpc/go-server/conf/dubbogo.yml
+```
+
+启动 go-client:
+
+配置 Dubbogo 配置文件路径([client/dubbogo.yml](go-client/conf/dubbogo.yml)):
+
+```shell
+DUBBO_GO_CONFIG_PATH=${$PROJECT_DIR$}/dubbo-go-samples/rpc/jsonrpc/go-client/conf/dubbogo.yml
+```
+
+### 启动 Java Server、Client
+
+启动 java-server:
+
+可直接运行项目提供 [build.sh](java-server/build.sh) ,基于 maven 环境启动
+
+```shell
+bash build.sh
+```
+
+启动 java-client:
+
+可直接运行项目提供 [build.sh](java-client/build.sh),基于 maven 环境启动
+
+```shell
+bash build.sh
+```
+
+
diff --git a/rpc/jsonrpc/go-client/cmd/client.go b/rpc/jsonrpc/go-client/cmd/client.go
index b37c8e9..3ede53c 100644
--- a/rpc/jsonrpc/go-client/cmd/client.go
+++ b/rpc/jsonrpc/go-client/cmd/client.go
@@ -27,17 +27,9 @@ import (
 )
 
 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/logger"
-	_ "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/protocol/jsonrpc"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/protocol"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/zookeeper"
-
-	"github.com/dubbogo/gost/log"
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
 )
 
 import (
@@ -46,9 +38,9 @@ import (
 
 var (
 	survivalTimeout int = 10e9
-	userProvider        = new(pkg.UserProvider)
-	userProvider1       = new(pkg.UserProvider1)
-	userProvider2       = new(pkg.UserProvider2)
+	userProvider        = &pkg.UserProvider{}
+	userProvider1       = &pkg.UserProvider1{}
+	userProvider2       = &pkg.UserProvider2{}
 )
 
 func init() {
@@ -57,18 +49,18 @@ func init() {
 	config.SetConsumerService(userProvider2)
 }
 
-// they are necessary:
-// 		export CONF_CONSUMER_FILE_PATH="xxx"
-// 		export APP_LOG_CONF_FILE="xxx"
+// Do some checking before the system starts up:
+// 1. env config
+// 		`export DUBBO_GO_CONFIG_PATH= ROOT_PATH/conf/dubbogo.yml` or `dubbogo.yaml`
 func main() {
 
 	config.Load()
 
-	gxlog.CInfo("\n\ntest")
+	logger.Info("\n\ntest")
 	test()
-	gxlog.CInfo("\n\ntest1")
+	logger.Info("\n\ntest1")
 	test1()
-	gxlog.CInfo("\n\ntest2")
+	logger.Info("\n\ntest2")
 	test2()
 
 	initSignal()
@@ -99,169 +91,152 @@ func initSignal() {
 }
 
 func test() {
-	gxlog.CInfo("\n\n\necho")
+	logger.Info("\n\n\necho")
 	res, err := userProvider.Echo(context.TODO(), "OK")
 	if err != nil {
-		gxlog.CInfo("echo - error: %v", err)
+		logger.Info("echo - error: %v", err)
 	} else {
-		gxlog.CInfo("res: %v", res)
+		logger.Info("res: %v", res)
 	}
 
 	time.Sleep(3e9)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc")
-	user := &pkg.JsonRPCUser{}
-	err = userProvider.GetUser(context.TODO(), []interface{}{"A003"}, user)
+	logger.Info("\n\n\nstart to test jsonrpc")
+
+	user, err := userProvider.GetUser(context.TODO(), "A003")
+
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", user)
+	logger.Info("response result: %v", user)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUser0")
+	logger.Info("\n\n\nstart to test jsonrpc - GetUser0")
 	ret, err := userProvider.GetUser0("A003", "Moorse")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", ret)
+	logger.Info("response result: %v", ret)
+
+	logger.Info("\n\n\nstart to test jsonrpc - GetUsers")
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUsers")
 	ret1, err := userProvider.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", ret1)
+	logger.Info("response result: %v", ret1)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - getUser")
-	user = &pkg.JsonRPCUser{}
-	err = userProvider.GetUser2(context.TODO(), []interface{}{1}, user)
+	logger.Info("\n\n\nstart to test jsonrpc - getUser")
+	rep2, err := userProvider.GetUser2(context.TODO(), "1")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", user)
+	logger.Info("response result: %v", rep2)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUser3")
+	logger.Info("\n\n\nstart to test jsonrpc - GetUser3")
 	err = userProvider.GetUser3()
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("succ!")
+	logger.Info("succ!")
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc illegal method")
-	err = userProvider.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+	logger.Info("\n\n\nstart to test jsonrpc illegal method")
+	rep3, err := userProvider.GetUser1(context.TODO(), "A003")
 	if err == nil {
 		panic("err is nil")
 	}
-	gxlog.CInfo("error: %v", err)
+	logger.Info("response result: %v", rep3)
 }
 
 func test1() {
-	gxlog.CInfo("\n\n\necho")
+	logger.Info("\n\n\necho")
 	res, err := userProvider1.Echo(context.TODO(), "OK")
 	if err != nil {
-		gxlog.CInfo("echo - error: %v", err)
+		logger.Info("echo - error: %v", err)
 	} else {
-		gxlog.CInfo("res: %v", res)
+		logger.Info("res: %v", res)
 	}
 
 	time.Sleep(3e9)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc")
-	user := &pkg.JsonRPCUser{}
-	err = userProvider1.GetUser(context.TODO(), []interface{}{"A003"}, user)
+	logger.Info("\n\n\nstart to test jsonrpc")
+	user, err := userProvider1.GetUser(context.TODO(), "A003")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", user)
+	logger.Info("response result: %v", user)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUser0")
+	logger.Info("\n\n\nstart to test jsonrpc - GetUser0")
 	ret, err := userProvider1.GetUser0("A003", "Moorse")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", ret)
-
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUsers")
-	ret1, err := userProvider1.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
-	if err != nil {
-		panic(err)
-	}
-	gxlog.CInfo("response result: %v", ret1)
+	logger.Info("response result: %v", ret)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - getUser")
-	user = &pkg.JsonRPCUser{}
-	err = userProvider1.GetUser2(context.TODO(), []interface{}{1}, user)
+	logger.Info("\n\n\nstart to test jsonrpc - getUser")
+	user, err = userProvider1.GetUser2(context.TODO(), "1")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", user)
+	logger.Info("response result: %v", user)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUser3")
+	logger.Info("\n\n\nstart to test jsonrpc - GetUser3")
 	err = userProvider1.GetUser3()
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("succ!")
+	logger.Info("succ!")
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc illegal method")
-	err = userProvider1.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+	logger.Info("\n\n\nstart to test jsonrpc illegal method")
+	user, err = userProvider1.GetUser1(context.TODO(), "A003")
 	if err == nil {
 		panic("err is nil")
 	}
-	gxlog.CInfo("error: %v", err)
+	logger.Info("error: %v", err)
 }
 
 func test2() {
-	gxlog.CInfo("\n\n\necho")
+	logger.Info("\n\n\necho")
 	res, err := userProvider2.Echo(context.TODO(), "OK")
 	if err != nil {
-		gxlog.CInfo("echo - error: %v", err)
+		logger.Info("echo - error: %v", err)
 	} else {
-		gxlog.CInfo("res: %v", res)
+		logger.Info("res: %v", res)
 	}
 
 	time.Sleep(3e9)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc")
-	user := &pkg.JsonRPCUser{}
-	err = userProvider2.GetUser(context.TODO(), []interface{}{"A003"}, user)
+	logger.Info("\n\n\nstart to test jsonrpc")
+	user, err := userProvider2.GetUser(context.TODO(), "A003")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", user)
+	logger.Info("response result: %v", user)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUser0")
+	logger.Info("\n\n\nstart to test jsonrpc - GetUser0")
 	ret, err := userProvider2.GetUser0("A003", "Moorse")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", ret)
-
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUsers")
-	ret1, err := userProvider2.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
-	if err != nil {
-		panic(err)
-	}
-	gxlog.CInfo("response result: %v", ret1)
+	logger.Info("response result: %v", ret)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - getUser")
-	user = &pkg.JsonRPCUser{}
-	err = userProvider2.GetUser2(context.TODO(), []interface{}{1}, user)
+	logger.Info("\n\n\nstart to test jsonrpc - getUser")
+	user, err = userProvider2.GetUser2(context.TODO(), "1")
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("response result: %v", user)
+	logger.Info("response result: %v", user)
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc - GetUser3")
+	logger.Info("\n\n\nstart to test jsonrpc - GetUser3")
 	err = userProvider2.GetUser3()
 	if err != nil {
 		panic(err)
 	}
-	gxlog.CInfo("succ!")
+	logger.Info("succ!")
 
-	gxlog.CInfo("\n\n\nstart to test jsonrpc illegal method")
-	err = userProvider2.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+	logger.Info("\n\n\nstart to test jsonrpc illegal method")
+	user, err = userProvider2.GetUser1(context.TODO(), "A003")
 	if err == nil {
 		panic("err is nil")
 	}
-	gxlog.CInfo("error: %v", err)
+	logger.Info("error: %v", err)
 }
diff --git a/rpc/jsonrpc/go-client/conf/client.yml b/rpc/jsonrpc/go-client/conf/client.yml
deleted file mode 100644
index ed757d7..0000000
--- a/rpc/jsonrpc/go-client/conf/client.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-# dubbo client yaml configure file
-
-check: true
-# client
-request_timeout : "3s"
-# connect timeout
-connect_timeout : "3s"
-
-# application config
-application:
-  organization : "ikurento.com"
-  name  : "BDTService"
-  module : "dubbogo user-info client"
-  version : "0.0.1"
-  owner : "ZX"
-  environment : "dev"
-
-registries :
-  "hangzhouzk":
-    protocol: "zookeeper"
-    timeout	: "3s"
-    address: "127.0.0.1:2181"
-    username: ""
-    password: ""
-  "shanghaizk":
-    protocol: "zookeeper"
-    timeout	: "3s"
-    address: "127.0.0.1:2182"
-    username: ""
-    password: ""
-
-references:
-  "UserProvider":
-    # 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
-    registry: "hangzhouzk"
-    protocol : "jsonrpc"
-    interface : "com.ikurento.user.UserProvider"
-    cluster: "failover"
-    methods :
-    - name: "GetUser"
-      retries: 3
-  "UserProvider1":
-    registry: "hangzhouzk"
-    protocol: "jsonrpc"
-    version : "2.0"
-    interface: "com.ikurento.user.UserProvider"
-    cluster: "failover"
-    methods:
-    - name: "GetUser"
-      retries: 3
-  "UserProvider2":
-    registry: "hangzhouzk"
-    protocol: "jsonrpc"
-    version : "2.0"
-    group: "as"
-    interface: "com.ikurento.user.UserProvider"
-    cluster: "failover"
-    methods:
-    - name: "GetUser"
-      retries: 3
diff --git a/rpc/jsonrpc/go-client/conf/dubbogo.yml b/rpc/jsonrpc/go-client/conf/dubbogo.yml
new file mode 100644
index 0000000..f00ed85
--- /dev/null
+++ b/rpc/jsonrpc/go-client/conf/dubbogo.yml
@@ -0,0 +1,49 @@
+dubbo:
+  application:
+    organization: "dubbo.apache.org"
+    name: "UserInfoServer"
+    module: "dubbo-go user-info client"
+    version: "0.0.1"
+    environment: "dev"
+  registries:
+    "hangzhouzk":
+      protocol: "zookeeper"
+      timeout: "3s"
+      address: "127.0.0.1:2181"
+      username: ""
+      password: ""
+    "shanghaizk":
+      protocol: "zookeeper"
+      timeout: "3s"
+      address: "127.0.0.1:2182"
+      username: ""
+      password: ""
+  consumer:
+    references:
+      "com.ikurento.user.UserProvider":
+        registry: "hangzhouzk"
+        protocol: "jsonrpc"
+        interface: "com.ikurento.user.UserProvider"
+        cluster: "failover"
+        methods:
+          - name: "GetUser"
+            retries: 1
+      "com.ikurento.user.UserProvider1":
+        registry: "hangzhouzk"
+        protocol: "jsonrpc"
+        version: "2.0"
+        interface: "com.ikurento.user.UserProvider"
+        cluster: "failover"
+        methods:
+          - name: "GetUser"
+            retries: 1
+      "com.ikurento.user.UserProvider2":
+        registry: "hangzhouzk"
+        protocol: "jsonrpc"
+        version: "2.0"
+        group: "as"
+        interface: "com.ikurento.user.UserProvider"
+        cluster: "failover"
+        methods:
+          - name: "GetUser"
+            retries: 1
\ No newline at end of file
diff --git a/rpc/jsonrpc/go-client/conf/log.yml b/rpc/jsonrpc/go-client/conf/log.yml
deleted file mode 100644
index 59fa427..0000000
--- a/rpc/jsonrpc/go-client/conf/log.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-level: "debug"
-development: true
-disableCaller: false
-disableStacktrace: false
-sampling:
-encoding: "console"
-
-# encoder
-encoderConfig:
-  messageKey: "message"
-  levelKey: "level"
-  timeKey: "time"
-  nameKey: "logger"
-  callerKey: "caller"
-  stacktraceKey: "stacktrace"
-  lineEnding: ""
-  levelEncoder: "capitalColor"
-  timeEncoder: "iso8601"
-  durationEncoder: "seconds"
-  callerEncoder: "short"
-  nameEncoder: ""
-
-outputPaths:
-  - "stderr"
-errorOutputPaths:
-  - "stderr"
-initialFields:
diff --git a/rpc/jsonrpc/go-client/pkg/user.go b/rpc/jsonrpc/go-client/pkg/user.go
index 56ad7f6..471bb01 100644
--- a/rpc/jsonrpc/go-client/pkg/user.go
+++ b/rpc/jsonrpc/go-client/pkg/user.go
@@ -34,48 +34,48 @@ type JsonRPCUser struct {
 func (u JsonRPCUser) String() string {
 	return fmt.Sprintf(
 		"User{ID:%s, Name:%s, Age:%d, Time:%s, Sex:%s}",
-		u.ID, u.Name, u.Age, time.Unix(u.Time, 0).Format("2006-01-02 15:04:05.99999"), u.Sex,
+		u.ID, u.Name, u.Age, time.Unix(int64(u.Time), 0).Format("2006-01-02 15:04:05.99999"), u.Sex,
 	)
 }
 
 type UserProvider struct {
-	GetUsers func(req []interface{}) ([]JsonRPCUser, error)
-	GetUser  func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	GetUser0 func(id string, name string) (JsonRPCUser, error)
-	GetUser1 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	GetUser2 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error `dubbo:"getUser"`
+	GetUsers func(ids []interface{}) ([]*JsonRPCUser, error)
+	GetUser  func(ctx context.Context, id string) (*JsonRPCUser, error)
+	GetUser0 func(id string, name string) (*JsonRPCUser, error)
+	GetUser1 func(ctx context.Context, id string) (*JsonRPCUser, error)
+	GetUser2 func(ctx context.Context, id string) (*JsonRPCUser, error) `dubbo:"getUser"`
 	GetUser3 func() error
-	Echo     func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
+	Echo     func(ctx context.Context, req string) (string, error) // Echo represent EchoFilter will be used
 }
 
 func (u *UserProvider) Reference() string {
-	return "UserProvider"
+	return "com.ikurento.user.UserProvider"
 }
 
 type UserProvider1 struct {
-	GetUsers func(req []interface{}) ([]JsonRPCUser, error)
-	GetUser  func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	GetUser0 func(id string, name string) (JsonRPCUser, error)
-	GetUser1 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	GetUser2 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error `dubbo:"getUser"`
+	GetUsers func(ids []interface{}) ([]*JsonRPCUser, error)
+	GetUser  func(ctx context.Context, id string) (*JsonRPCUser, error)
+	GetUser0 func(id string, name string) (*JsonRPCUser, error)
+	GetUser1 func(ctx context.Context, id string) (*JsonRPCUser, error)
+	GetUser2 func(ctx context.Context, id string) (*JsonRPCUser, error) `dubbo:"getUser"`
 	GetUser3 func() error
-	Echo     func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
+	Echo     func(ctx context.Context, req string) (string, error) // Echo represent EchoFilter will be used
 }
 
 func (u *UserProvider1) Reference() string {
-	return "UserProvider1"
+	return "com.ikurento.user.UserProvider1"
 }
 
 type UserProvider2 struct {
-	GetUsers func(req []interface{}) ([]JsonRPCUser, error)
-	GetUser  func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	GetUser0 func(id string, name string) (JsonRPCUser, error)
-	GetUser1 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error
-	GetUser2 func(ctx context.Context, req []interface{}, rsp *JsonRPCUser) error `dubbo:"getUser"`
+	GetUsers func(ids []interface{}) ([]*JsonRPCUser, error)
+	GetUser  func(ctx context.Context, id string) (*JsonRPCUser, error)
+	GetUser0 func(id string, name string) (*JsonRPCUser, error)
+	GetUser1 func(ctx context.Context, id string) (*JsonRPCUser, error)
+	GetUser2 func(ctx context.Context, id string) (*JsonRPCUser, error) `dubbo:"getUser"`
 	GetUser3 func() error
-	Echo     func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
+	Echo     func(ctx context.Context, req string) (string, error) // Echo represent EchoFilter will be used
 }
 
 func (u *UserProvider2) Reference() string {
-	return "UserProvider2"
+	return "com.ikurento.user.UserProvider2"
 }
diff --git a/rpc/jsonrpc/go-server/cmd/server.go b/rpc/jsonrpc/go-server/cmd/server.go
index 631ac7f..dcb7a9c 100644
--- a/rpc/jsonrpc/go-server/cmd/server.go
+++ b/rpc/jsonrpc/go-server/cmd/server.go
@@ -26,15 +26,9 @@ import (
 )
 
 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/logger"
-	_ "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/protocol/jsonrpc"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/protocol"
-	_ "dubbo.apache.org/dubbo-go/v3/registry/zookeeper"
+	_ "dubbo.apache.org/dubbo-go/v3/imports"
 )
 
 import (
@@ -45,9 +39,9 @@ var (
 	survivalTimeout = int(3e9)
 )
 
-// they are necessary:
-// 		export CONF_PROVIDER_FILE_PATH="xxx"
-// 		export APP_LOG_CONF_FILE="xxx"
+// Do some checking before the system starts up:
+// 1. env config
+// 		`export DUBBO_GO_CONFIG_PATH= ROOT_PATH/conf/dubbogo.yml` or `dubbogo.yaml`
 func main() {
 
 	config.Load()
diff --git a/rpc/jsonrpc/go-server/conf/dubbogo.yml b/rpc/jsonrpc/go-server/conf/dubbogo.yml
new file mode 100644
index 0000000..c5a1fed
--- /dev/null
+++ b/rpc/jsonrpc/go-server/conf/dubbogo.yml
@@ -0,0 +1,59 @@
+dubbo:
+  application:
+    organization: "dubbo.apache.org"
+    name: "UserInfoServer"
+    module: "dubbo-go user-info server"
+    version: "0.0.1"
+    environment: "dev"
+  registries:
+    "hangzhouzk":
+      protocol: "zookeeper"
+      timeout: "3s"
+      address: "127.0.0.1:2181"
+      username: ""
+      password: ""
+  protocols:
+    "jsonrpc":
+      name: "jsonrpc"
+      ip: "127.0.0.1"
+      port: 20001
+  provider:
+    registry:
+      - hangzhouzk
+    services:
+      UserProvider:
+        registry: "hangzhouzk"
+        protocol: "jsonrpc"
+        interface: "com.ikurento.user.UserProvider"
+        loadbalance: "random"
+        warmup: "100"
+        cluster: "failover"
+        methods:
+          - name: "GetUser"
+            retries: 1
+            loadbalance: "random"
+      UserProvider1:
+        registry: "hangzhouzk"
+        protocol: "jsonrpc"
+        interface: "com.ikurento.user.UserProvider"
+        loadbalance: "random"
+        version: "2.0"
+        warmup: "100"
+        cluster: "failover"
+        methods:
+          - name: "GetUser"
+            retries: 1
+            loadbalance: "random"
+      UserProvider2:
+        registry: "hangzhouzk"
+        protocol: "jsonrpc"
+        interface: "com.ikurento.user.UserProvider"
+        loadbalance: "random"
+        version: "2.0"
+        group: "as"
+        warmup: "100"
+        cluster: "failover"
+        methods:
+          - name: "GetUser"
+            retries: 1
+            loadbalance: "random"
\ No newline at end of file
diff --git a/rpc/jsonrpc/go-server/conf/log.yml b/rpc/jsonrpc/go-server/conf/log.yml
deleted file mode 100644
index 59fa427..0000000
--- a/rpc/jsonrpc/go-server/conf/log.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-level: "debug"
-development: true
-disableCaller: false
-disableStacktrace: false
-sampling:
-encoding: "console"
-
-# encoder
-encoderConfig:
-  messageKey: "message"
-  levelKey: "level"
-  timeKey: "time"
-  nameKey: "logger"
-  callerKey: "caller"
-  stacktraceKey: "stacktrace"
-  lineEnding: ""
-  levelEncoder: "capitalColor"
-  timeEncoder: "iso8601"
-  durationEncoder: "seconds"
-  callerEncoder: "short"
-  nameEncoder: ""
-
-outputPaths:
-  - "stderr"
-errorOutputPaths:
-  - "stderr"
-initialFields:
diff --git a/rpc/jsonrpc/go-server/conf/server.yml b/rpc/jsonrpc/go-server/conf/server.yml
deleted file mode 100644
index cb7fee9..0000000
--- a/rpc/jsonrpc/go-server/conf/server.yml
+++ /dev/null
@@ -1,75 +0,0 @@
-# dubbo server yaml configure file
-
-# application config
-application:
-  organization : "ikurento.com"
-  name : "BDTService"
-  module : "dubbogo user-info server"
-  version : "0.0.1"
-  owner : "ZX"
-  environment : "dev"
-
-registries :
-  "hangzhouzk":
-    protocol: "zookeeper"
-    timeout	: "3s"
-    address: "127.0.0.1:2181"
-    username: ""
-    password: ""
-  "shanghaizk":
-    protocol: "zookeeper"
-    timeout	: "3s"
-    address: "127.0.0.1:2182"
-    username: ""
-    password: ""
-
-
-services:
-  "UserProvider":
-    # 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
-    registry: "hangzhouzk"
-    protocol : "jsonrpc"
-    # 相当于dubbo.xml中的interface
-    interface : "com.ikurento.user.UserProvider"
-    loadbalance: "random"
-    warmup: "100"
-    cluster: "failover"
-    methods:
-    - name: "GetUser"
-      retries: 1
-      loadbalance: "random"
-  "UserProvider1":
-    registry: "hangzhouzk"
-    protocol: "jsonrpc"
-    interface: "com.ikurento.user.UserProvider"
-    loadbalance: "random"
-    version: "2.0"
-    warmup: "100"
-    cluster: "failover"
-    methods:
-    - name: "GetUser"
-      retries: 1
-      loadbalance: "random"
-  "UserProvider2":
-    registry: "hangzhouzk"
-    protocol: "jsonrpc"
-    interface: "com.ikurento.user.UserProvider"
-    loadbalance: "random"
-    version: "2.0"
-    group: "as"
-    warmup: "100"
-    cluster: "failover"
-    methods:
-    - name: "GetUser"
-      retries: 1
-      loadbalance: "random"
-
-protocols:
-  #-   name: "dubbo"
-  #    ip : "127.0.0.1"
-  #    port : 20000
-  "jsonrpc":
-    name: "jsonrpc"
-    ip: "127.0.0.1"
-    port: 20001
-
diff --git a/rpc/jsonrpc/go-server/docker/docker-compose.yml b/rpc/jsonrpc/go-server/docker/docker-compose.yml
new file mode 100644
index 0000000..49fc996
--- /dev/null
+++ b/rpc/jsonrpc/go-server/docker/docker-compose.yml
@@ -0,0 +1,9 @@
+version: '3'
+
+services:
+  hangzhouzk:
+    container_name: hangzhouzk
+    image: zookeeper
+    ports:
+      - 2181:2181
+    restart: on-failure
\ No newline at end of file
diff --git a/rpc/jsonrpc/go-server/pkg/user.go b/rpc/jsonrpc/go-server/pkg/user.go
index 586432e..f8d1841 100644
--- a/rpc/jsonrpc/go-server/pkg/user.go
+++ b/rpc/jsonrpc/go-server/pkg/user.go
@@ -51,7 +51,6 @@ type (
 var (
 	DefaultUser = User{
 		ID: "0", Name: "Alex Stocks", Age: 31,
-		// Birth: int(time.Date(1985, time.November, 10, 23, 0, 0, 0, time.UTC).Unix()),
 		Birth: int(time.Date(1985, 11, 24, 15, 15, 0, 0, time.Local).Unix()),
 		sex:   Gender(MAN),
 	}
diff --git a/rpc/jsonrpc/go-server/pkg/user_provider.go b/rpc/jsonrpc/go-server/pkg/user_provider.go
index 3bf0ee7..43f0741 100644
--- a/rpc/jsonrpc/go-server/pkg/user_provider.go
+++ b/rpc/jsonrpc/go-server/pkg/user_provider.go
@@ -14,13 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package pkg
 
 import (
 	"context"
 	"fmt"
-	"strconv"
 )
 
 import (
@@ -32,7 +30,7 @@ import (
 )
 
 func init() {
-	config.SetProviderService(new(UserProvider))
+	config.SetProviderService(&UserProvider{})
 }
 
 type UserProvider struct {
@@ -46,26 +44,25 @@ func (u *UserProvider) getUser(userID string) (*User, error) {
 	return nil, fmt.Errorf("invalid user id:%s", userID)
 }
 
-func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+func (u *UserProvider) GetUser(ctx context.Context, userID string) (*User, error) {
 	var (
 		err  error
 		user *User
 	)
 
-	gxlog.CInfo("req:%#v", req)
-	user, err = u.getUser(req[0].(string))
+	gxlog.CInfo("userID:%#v", userID)
+	user, err = u.getUser(userID)
 	if err == nil {
-		*rsp = *user
-		gxlog.CInfo("rsp:%#v", rsp)
+		gxlog.CInfo("rsp:%#v", user)
 	}
-	return err
+	return user, err
 }
 
-func (u *UserProvider) GetUser0(id string, name string) (User, error) {
+func (u *UserProvider) GetUser0(userID string, name string) (User, error) {
 	var err error
 
-	gxlog.CInfo("id:%s, name:%s", id, name)
-	user, err := u.getUser(id)
+	gxlog.CInfo("userID:%s, name:%s", userID, name)
+	user, err := u.getUser(userID)
 	if err != nil {
 		return User{}, err
 	}
@@ -75,23 +72,25 @@ func (u *UserProvider) GetUser0(id string, name string) (User, error) {
 	return *user, err
 }
 
-func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+func (u *UserProvider) GetUser2(ctx context.Context, userID string) (*User, error) {
 	var err error
 
-	gxlog.CInfo("req:%#v", req)
-	rsp.ID = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
-	rsp.Sex = Gender(MAN).String()
-	return err
+	gxlog.CInfo("userID:%#v", userID)
+	rsp := &User{
+		ID:  userID,
+		Sex: Gender(MAN).String(),
+	}
+	return rsp, err
 }
 
 func (u *UserProvider) GetUser3() error {
 	return nil
 }
 
-func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
+func (u *UserProvider) GetUsers(req []interface{}) ([]*User, error) {
 	var err error
 
-	gxlog.CInfo("req:%s", req)
+	gxlog.CInfo("userIDs:%s", req)
 	t := req[0].([]interface{})
 	user, err := u.getUser(t[0].(string))
 	if err != nil {
@@ -104,7 +103,7 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
 	}
 	gxlog.CInfo("user1:%v", user1)
 
-	return []User{*user, *user1}, err
+	return []*User{user, user1}, err
 }
 
 func (s *UserProvider) MethodMapper() map[string]string {
@@ -112,7 +111,3 @@ func (s *UserProvider) MethodMapper() map[string]string {
 		"GetUser2": "getUser",
 	}
 }
-
-func (u *UserProvider) Reference() string {
-	return "UserProvider"
-}
diff --git a/rpc/jsonrpc/go-server/pkg/user_provider1.go b/rpc/jsonrpc/go-server/pkg/user_provider1.go
index 85e393a..c456892 100644
--- a/rpc/jsonrpc/go-server/pkg/user_provider1.go
+++ b/rpc/jsonrpc/go-server/pkg/user_provider1.go
@@ -14,13 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package pkg
 
 import (
 	"context"
 	"fmt"
-	"strconv"
 )
 
 import (
@@ -32,7 +30,7 @@ import (
 )
 
 func init() {
-	config.SetProviderService(new(UserProvider1))
+	config.SetProviderService(&UserProvider1{})
 }
 
 type UserProvider1 struct {
@@ -46,26 +44,25 @@ func (u *UserProvider1) getUser(userID string) (*User, error) {
 	return nil, fmt.Errorf("invalid user id:%s", userID)
 }
 
-func (u *UserProvider1) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+func (u *UserProvider1) GetUser(ctx context.Context, userID string) (*User, error) {
 	var (
 		err  error
 		user *User
 	)
 
-	gxlog.CInfo("req:%#v", req)
-	user, err = u.getUser(req[0].(string))
+	gxlog.CInfo("userID:%#v", userID)
+	user, err = u.getUser(userID)
 	if err == nil {
-		*rsp = *user
-		gxlog.CInfo("rsp:%#v", rsp)
+		gxlog.CInfo("rsp:%#v", user)
 	}
-	return err
+	return user, err
 }
 
-func (u *UserProvider1) GetUser0(id string, name string) (User, error) {
+func (u *UserProvider1) GetUser0(userID string, name string) (User, error) {
 	var err error
 
-	gxlog.CInfo("id:%s, name:%s", id, name)
-	user, err := u.getUser(id)
+	gxlog.CInfo("userID:%s, name:%s", userID, name)
+	user, err := u.getUser(userID)
 	if err != nil {
 		return User{}, err
 	}
@@ -75,21 +72,23 @@ func (u *UserProvider1) GetUser0(id string, name string) (User, error) {
 	return *user, err
 }
 
-func (u *UserProvider1) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+func (u *UserProvider1) GetUser2(ctx context.Context, userID string) (*User, error) {
 	var err error
 
-	gxlog.CInfo("req:%#v", req)
-	rsp.ID = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
-	rsp.Sex = Gender(MAN).String()
-	return err
+	gxlog.CInfo("userID:%#v", userID)
+	rsp := &User{
+		ID:  userID,
+		Sex: Gender(MAN).String(),
+	}
+	return rsp, err
 }
 
 func (u *UserProvider1) GetUser3() error {
 	return nil
 }
 
-func (u *UserProvider1) GetUsers(req []interface{}) ([]User, error) {
-	return []User{}, nil
+func (u *UserProvider1) GetUsers(req []interface{}) ([]*User, error) {
+	return []*User{}, nil
 }
 
 func (s *UserProvider1) MethodMapper() map[string]string {
@@ -97,7 +96,3 @@ func (s *UserProvider1) MethodMapper() map[string]string {
 		"GetUser2": "getUser",
 	}
 }
-
-func (u *UserProvider1) Reference() string {
-	return "UserProvider1"
-}
diff --git a/rpc/jsonrpc/go-server/pkg/user_provider2.go b/rpc/jsonrpc/go-server/pkg/user_provider2.go
index 3887f9b..0a96acc 100644
--- a/rpc/jsonrpc/go-server/pkg/user_provider2.go
+++ b/rpc/jsonrpc/go-server/pkg/user_provider2.go
@@ -14,13 +14,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package pkg
 
 import (
 	"context"
 	"fmt"
-	"strconv"
 )
 
 import (
@@ -32,7 +30,7 @@ import (
 )
 
 func init() {
-	config.SetProviderService(new(UserProvider2))
+	config.SetProviderService(&UserProvider2{})
 }
 
 type UserProvider2 struct {
@@ -46,26 +44,25 @@ func (u *UserProvider2) getUser(userID string) (*User, error) {
 	return nil, fmt.Errorf("invalid user id:%s", userID)
 }
 
-func (u *UserProvider2) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+func (u *UserProvider2) GetUser(ctx context.Context, userID string) (*User, error) {
 	var (
 		err  error
 		user *User
 	)
 
-	gxlog.CInfo("req:%#v", req)
-	user, err = u.getUser(req[0].(string))
+	gxlog.CInfo("userID:%#v", userID)
+	user, err = u.getUser(userID)
 	if err == nil {
-		*rsp = *user
-		gxlog.CInfo("rsp:%#v", rsp)
+		gxlog.CInfo("rsp:%#v", user)
 	}
-	return err
+	return user, err
 }
 
-func (u *UserProvider2) GetUser0(id string, name string) (User, error) {
+func (u *UserProvider2) GetUser0(userID string, name string) (User, error) {
 	var err error
 
-	gxlog.CInfo("id:%s, name:%s", id, name)
-	user, err := u.getUser(id)
+	gxlog.CInfo("userID:%s, name:%s", userID, name)
+	user, err := u.getUser(userID)
 	if err != nil {
 		return User{}, err
 	}
@@ -75,23 +72,25 @@ func (u *UserProvider2) GetUser0(id string, name string) (User, error) {
 	return *user, err
 }
 
-func (u *UserProvider2) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+func (u *UserProvider2) GetUser2(ctx context.Context, userID string) (*User, error) {
 	var err error
 
-	gxlog.CInfo("req:%#v", req)
-	rsp.ID = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
-	rsp.Sex = Gender(MAN).String()
-	return err
+	gxlog.CInfo("userID:%#v", userID)
+	rsp := &User{
+		ID:  userID,
+		Sex: Gender(MAN).String(),
+	}
+	return rsp, err
 }
 
 func (u *UserProvider2) GetUser3() error {
 	return nil
 }
 
-func (u *UserProvider2) GetUsers(req []interface{}) ([]User, error) {
+func (u *UserProvider2) GetUsers(req []interface{}) ([]*User, error) {
 	var err error
 
-	gxlog.CInfo("req:%s", req)
+	gxlog.CInfo("userIDs:%s", req)
 	t := req[0].([]interface{})
 	user, err := u.getUser(t[0].(string))
 	if err != nil {
@@ -99,7 +98,7 @@ func (u *UserProvider2) GetUsers(req []interface{}) ([]User, error) {
 	}
 	gxlog.CInfo("user:%v", user)
 
-	return []User{*user}, err
+	return []*User{user}, err
 }
 
 func (s *UserProvider2) MethodMapper() map[string]string {
@@ -107,7 +106,3 @@ func (s *UserProvider2) MethodMapper() map[string]string {
 		"GetUser2": "getUser",
 	}
 }
-
-func (u *UserProvider2) Reference() string {
-	return "UserProvider2"
-}
diff --git a/rpc/jsonrpc/java-client/build.sh b/rpc/jsonrpc/java-client/build.sh
index c869acf..f92cdd9 100644
--- a/rpc/jsonrpc/java-client/build.sh
+++ b/rpc/jsonrpc/java-client/build.sh
@@ -15,7 +15,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# rm src/main/resources/META-INF/spring/dubbo.consumer.xml
-# cp src/main/resources/META-INF/spring/dubbo-protocol.consumer.xml src/main/resources/META-INF/spring/dubbo.consumer.xml
-# cp src/main/resources/META-INF/spring/jsonrpc-protocol.consumer.xml src/main/resources/META-INF/spring/dubbo.consumer.xml
 mvn clean package -Dmaven.test.skip
diff --git a/rpc/jsonrpc/java-client/pom.xml b/rpc/jsonrpc/java-client/pom.xml
index 445b924..1519e6f 100644
--- a/rpc/jsonrpc/java-client/pom.xml
+++ b/rpc/jsonrpc/java-client/pom.xml
@@ -188,6 +188,14 @@
 	<build>
 		<plugins>
 			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>exec-maven-plugin</artifactId>
+				<version>3.0.0</version>
+				<configuration>
+					<mainClass>com.alibaba.dubbo.container.Main</mainClass>
+				</configuration>
+			</plugin>
+			<plugin>
 				<artifactId>maven-dependency-plugin</artifactId>
 				<executions>
 					<execution>
diff --git a/rpc/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java b/rpc/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java
index 7f228b3..d8d7c6e 100644
--- a/rpc/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java
+++ b/rpc/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java
@@ -41,11 +41,11 @@ public class User {
         this.age = age;
     }
 
-    public String getId() {
+    public String getID() {
         return id;
     }
 
-    public void setId(String id) {
+    public void setID(String id) {
         this.id = id;
     }
 
diff --git a/rpc/jsonrpc/java-server/build.sh b/rpc/jsonrpc/java-server/build.sh
index 7b5755b..3950ab0 100644
--- a/rpc/jsonrpc/java-server/build.sh
+++ b/rpc/jsonrpc/java-server/build.sh
@@ -15,6 +15,5 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-# mvn dependency:sources
-mvn clean package -Dmaven.test.skip
-# mvn -X clean compile package -DskipTests=true
+mvn clean compile exec:java
+
diff --git a/rpc/jsonrpc/java-server/pom.xml b/rpc/jsonrpc/java-server/pom.xml
index 2710ab9..76e9730 100644
--- a/rpc/jsonrpc/java-server/pom.xml
+++ b/rpc/jsonrpc/java-server/pom.xml
@@ -146,6 +146,14 @@
 
         <plugins>
             <plugin>
+                <groupId>org.codehaus.mojo</groupId>
+                <artifactId>exec-maven-plugin</artifactId>
+                <version>3.0.0</version>
+                <configuration>
+                    <mainClass>com.alibaba.dubbo.container.Main</mainClass>
+                </configuration>
+            </plugin>
+            <plugin>
                 <artifactId>maven-dependency-plugin</artifactId>
                 <executions>
                     <execution>
diff --git a/rpc/jsonrpc/java-server/script/debug.sh b/rpc/jsonrpc/java-server/script/debug.sh
deleted file mode 100644
index 1038cd7..0000000
--- a/rpc/jsonrpc/java-server/script/debug.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/usr/bin/env bash
-#
-# 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.
-
-# jdb -classpath /Users/alex/tmp/us/conf:/Users/alex/tmp/us/lib/*:/Users/alex/test/java/dubbo/2.5.4/dubbo-remoting/dubbo-remoting-api/src/main/java/ com.alibaba.dubbo.container.Main
-jdb -classpath /Users/alex/tmp/us/conf:/Users/alex/tmp/us/lib/* -sourcepath /Users/alex/test/java/dubbo/2.5.4/dubbo-remoting/dubbo-remoting-api/src/main/java/:/Users/alex/tmp/java-server/src/main/java com.alibaba.dubbo.container.Main
-# jdb stop at com.alibaba.dubbo.remoting.exchange.codec.ExchangeCodec:76
-# run
-
diff --git a/start_integrate_test.sh b/start_integrate_test.sh
index 91de649..8a287ab 100755
--- a/start_integrate_test.sh
+++ b/start_integrate_test.sh
@@ -112,6 +112,7 @@ array+=("rpc/triple/hessian2")
 array+=("rpc/triple/msgpack")
 array+=("rpc/triple/pb/dubbogo-grpc")
 array+=("rpc/grpc")
+array+=("rpc/jsonrpc")
 
 
 DOCKER_DIR=$(pwd)/integrate_test/dockercompose