diff --git a/.gitignore b/.gitignore
index 1e651f122beb2ff487b0ef897af6fa74be9bfd1d..d3ed28dcd7a9f332923492a53382a7b4587edde0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,6 +4,7 @@
 *.dll
 *.so
 *.dylib
+*.jar
 
 # Test binary, build with `go test -c`
 *.test
diff --git a/common/constant/env.go b/common/constant/env.go
index f0e4fabe02cb09f63173bc9fe0cbf83885bdefb6..a018da81f64549253ca332c250a044dfe14e685f 100644
--- a/common/constant/env.go
+++ b/common/constant/env.go
@@ -21,4 +21,6 @@ const (
 	CONF_CONSUMER_FILE_PATH        = "CONF_CONSUMER_FILE_PATH"
 	CONF_PROVIDER_FILE_PATH        = "CONF_PROVIDER_FILE_PATH"
 	APP_LOG_CONF_FILE       string = "APP_LOG_CONF_FILE"
+	DUBBO_VERSION_KEY              = "dubbo"
+	DUBBO_VERSION                  = "2.0.2"
 )
diff --git a/common/proxy/proxy_factory/default.go b/common/proxy/proxy_factory/default.go
index 882288e9658adc1af96f88b4ac69ea297bcf1f99..9e841c50de60e5bef6e66ec1fae5b939f5352c70 100644
--- a/common/proxy/proxy_factory/default.go
+++ b/common/proxy/proxy_factory/default.go
@@ -69,8 +69,9 @@ type ProxyInvoker struct {
 
 func (pi *ProxyInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
 	result := &protocol.RPCResult{}
+	result.SetAttachments(invocation.Attachments())
 
-	url := pi.GetUrl().SubURL
+	url := pi.GetUrl()
 
 	methodName := invocation.MethodName()
 	proto := url.Protocol
diff --git a/examples/general/dubbo/go-client/app/client.go b/examples/general/dubbo/go-client/app/client.go
index ad160576690e51e722af0a27f03ef9e6b559c7c9..f3ac4b99ab0abdd472056682ce8f4b3c4b41bc8b 100644
--- a/examples/general/dubbo/go-client/app/client.go
+++ b/examples/general/dubbo/go-client/app/client.go
@@ -95,18 +95,18 @@ func println(format string, args ...interface{}) {
 }
 
 func test() {
-	//println("\n\n\necho")
-	//res, err := userProvider.Echo(context.TODO(), "OK")
-	//if err != nil {
-	//	panic(err)
-	//}
-	//println("res: %v\n", res)
+	println("\n\n\necho")
+	res, err := userProvider.Echo(context.TODO(), "OK")
+	if err != nil {
+		panic(err)
+	}
+	println("res: %v\n", res)
 
 	time.Sleep(3e9)
 
 	println("\n\n\nstart to test dubbo")
 	user := &User{}
-	err := userProvider.GetUser(context.TODO(), []interface{}{"A003"}, user)
+	err = userProvider.GetUser(context.TODO(), []interface{}{"A003"}, user)
 	if err != nil {
 		panic(err)
 	}
diff --git a/go.mod b/go.mod
index 20a8fc836788b1b30ca0368574f65f3b54d94d3a..7125c0019deeec9cbd833690e227f20e8032a857 100644
--- a/go.mod
+++ b/go.mod
@@ -5,6 +5,7 @@ require (
 	github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5
 	github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190802083043-4cd0c391755e // indirect
 	github.com/apache/dubbo-go-hessian2 v1.2.5-0.20190731020727-1697039810c8
+	github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869
 	github.com/buger/jsonparser v0.0.0-20181115193947-bf1c66bbce23 // indirect
 	github.com/coreos/bbolt v1.3.3 // indirect
 	github.com/coreos/etcd v3.3.13+incompatible
@@ -47,3 +48,5 @@ require (
 	google.golang.org/grpc v1.22.1
 	gopkg.in/yaml.v2 v2.2.2
 )
+
+replace github.com/apache/dubbo-go-hessian2 v1.2.5-0.20190731020727-1697039810c8 => ./../hessian2
diff --git a/protocol/dubbo/client.go b/protocol/dubbo/client.go
index 6ac5e7215429338aa7cabb646b3afd3f1a136b68..e0cfc0b0d4d496000f94d281fbdcd3b6e8b9dcf5 100644
--- a/protocol/dubbo/client.go
+++ b/protocol/dubbo/client.go
@@ -151,30 +151,30 @@ func NewClient(opt Options) *Client {
 }
 
 // call one way
-func (c *Client) CallOneway(addr string, svcUrl common.URL, method string, args interface{}) error {
+func (c *Client) CallOneway(addr string, svcUrl common.URL, method string, args interface{}, atta map[string]string) error {
 
-	return perrors.WithStack(c.call(CT_OneWay, addr, svcUrl, method, args, nil, nil))
+	return perrors.WithStack(c.call(CT_OneWay, addr, svcUrl, method, args, nil, nil, atta))
 }
 
 // if @reply is nil, the transport layer will get the response without notify the invoker.
-func (c *Client) Call(addr string, svcUrl common.URL, method string, args, reply interface{}) error {
+func (c *Client) Call(addr string, svcUrl common.URL, method string, args, reply interface{}, atta map[string]string) error {
 
 	ct := CT_TwoWay
 	if reply == nil {
 		ct = CT_OneWay
 	}
 
-	return perrors.WithStack(c.call(ct, addr, svcUrl, method, args, reply, nil))
+	return perrors.WithStack(c.call(ct, addr, svcUrl, method, args, reply, nil, atta))
 }
 
 func (c *Client) AsyncCall(addr string, svcUrl common.URL, method string, args interface{},
-	callback AsyncCallback, reply interface{}) error {
+	callback AsyncCallback, reply interface{}, atta map[string]string) error {
 
-	return perrors.WithStack(c.call(CT_TwoWay, addr, svcUrl, method, args, reply, callback))
+	return perrors.WithStack(c.call(CT_TwoWay, addr, svcUrl, method, args, reply, callback, atta))
 }
 
 func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string,
-	args, reply interface{}, callback AsyncCallback) error {
+	args, reply interface{}, callback AsyncCallback, atta map[string]string) error {
 
 	p := &DubboPackage{}
 	p.Service.Path = strings.TrimPrefix(svcUrl.Path, "/")
@@ -183,7 +183,7 @@ func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string
 	p.Service.Method = method
 	p.Service.Timeout = c.opts.RequestTimeout
 	p.Header.SerialID = byte(S_Dubbo)
-	p.Body = args
+	p.Body = hessian.NewRequest(args, atta)
 
 	var rsp *PendingResponse
 	if ct != CT_OneWay {
@@ -259,6 +259,7 @@ func (c *Client) transfer(session getty.Session, pkg *DubboPackage,
 
 	if pkg == nil {
 		pkg = &DubboPackage{}
+		pkg.Body = hessian.NewRequest([]interface{}{}, nil)
 		pkg.Body = []interface{}{}
 		pkg.Header.Type = hessian.PackageHeartbeat
 		pkg.Header.SerialID = byte(S_Dubbo)
diff --git a/protocol/dubbo/client_test.go b/protocol/dubbo/client_test.go
index 531c53a50849b18045a503aa2ed18f8af58a39cb..e8bf02e0e1a557338b7a98dbbfbb6f29af792e11 100644
--- a/protocol/dubbo/client_test.go
+++ b/protocol/dubbo/client_test.go
@@ -51,7 +51,7 @@ func TestClient_CallOneway(t *testing.T) {
 	c.pool = newGettyRPCClientConnPool(c, clientConf.PoolSize, time.Duration(int(time.Second)*clientConf.PoolTTL))
 
 	//user := &User{}
-	err := c.CallOneway("127.0.0.1:20000", url, "GetUser", []interface{}{"1", "username"})
+	err := c.CallOneway("127.0.0.1:20000", url, "GetUser", []interface{}{"1", "username"}, nil)
 	assert.NoError(t, err)
 
 	// destroy
@@ -77,50 +77,50 @@ func TestClient_Call(t *testing.T) {
 	)
 
 	user = &User{}
-	err = c.Call("127.0.0.1:20000", url, "GetBigPkg", []interface{}{nil}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetBigPkg", []interface{}{nil}, user, nil)
 	assert.NoError(t, err)
 	assert.NotEqual(t, "", user.Id)
 	assert.NotEqual(t, "", user.Name)
 
 	user = &User{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser", []interface{}{"1", "username"}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetUser", []interface{}{"1", "username"}, user, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, User{Id: "1", Name: "username"}, *user)
 
 	user = &User{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser0", []interface{}{"1", nil, "username"}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetUser0", []interface{}{"1", nil, "username"}, user, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, User{Id: "1", Name: "username"}, *user)
 
-	err = c.Call("127.0.0.1:20000", url, "GetUser1", []interface{}{}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetUser1", []interface{}{}, user, nil)
 	assert.NoError(t, err)
 
-	err = c.Call("127.0.0.1:20000", url, "GetUser2", []interface{}{}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetUser2", []interface{}{}, user, nil)
 	assert.EqualError(t, err, "error")
 
 	user2 := []interface{}{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser3", []interface{}{}, &user2)
+	err = c.Call("127.0.0.1:20000", url, "GetUser3", []interface{}{}, &user2, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, &User{Id: "1", Name: "username"}, user2[0])
 
 	user2 = []interface{}{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser4", []interface{}{[]interface{}{"1", "username"}}, &user2)
+	err = c.Call("127.0.0.1:20000", url, "GetUser4", []interface{}{[]interface{}{"1", "username"}}, &user2, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, &User{Id: "1", Name: "username"}, user2[0])
 
 	user3 := map[interface{}]interface{}{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser5", []interface{}{map[interface{}]interface{}{"id": "1", "name": "username"}}, &user3)
+	err = c.Call("127.0.0.1:20000", url, "GetUser5", []interface{}{map[interface{}]interface{}{"id": "1", "name": "username"}}, &user3, nil)
 	assert.NoError(t, err)
 	assert.NotNil(t, user3)
 	assert.Equal(t, &User{Id: "1", Name: "username"}, user3["key"])
 
 	user = &User{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser6", []interface{}{0}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetUser6", []interface{}{0}, user, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, User{Id: "", Name: ""}, *user)
 
 	user = &User{}
-	err = c.Call("127.0.0.1:20000", url, "GetUser6", []interface{}{1}, user)
+	err = c.Call("127.0.0.1:20000", url, "GetUser6", []interface{}{1}, user, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, User{Id: "1", Name: ""}, *user)
 
@@ -147,7 +147,7 @@ func TestClient_AsyncCall(t *testing.T) {
 	err := c.AsyncCall("127.0.0.1:20000", url, "GetUser", []interface{}{"1", "username"}, func(response CallResponse) {
 		assert.Equal(t, User{Id: "1", Name: "username"}, *response.Reply.(*User))
 		lock.Unlock()
-	}, user)
+	}, user, nil)
 	assert.NoError(t, err)
 	assert.Equal(t, User{}, *user)
 
diff --git a/protocol/dubbo/codec_test.go b/protocol/dubbo/codec_test.go
index 52bb1fc130bb2dad866799f01c43d11ffd10a220..8490b0b61a6820460c73b0a19858615b781c7876 100644
--- a/protocol/dubbo/codec_test.go
+++ b/protocol/dubbo/codec_test.go
@@ -70,5 +70,5 @@ func TestDubboPackage_MarshalAndUnmarshal(t *testing.T) {
 	assert.Equal(t, "Method", pkgres.Body.([]interface{})[3])
 	assert.Equal(t, "Ljava/lang/String;", pkgres.Body.([]interface{})[4])
 	assert.Equal(t, []interface{}{"a"}, pkgres.Body.([]interface{})[5])
-	assert.Equal(t, map[interface{}]interface{}{"group": "", "interface": "Service", "path": "path", "timeout": "1000"}, pkgres.Body.([]interface{})[6])
+	assert.Equal(t, map[string]string{"group": "", "interface": "Service", "path": "path", "timeout": "1000"}, pkgres.Body.([]interface{})[6])
 }
diff --git a/protocol/dubbo/dubbo_invoker.go b/protocol/dubbo/dubbo_invoker.go
index 46b3dcc8463d8406c494d80149b28f0dba7444d0..6528ef67c05330f96fcacf83234df09ed1767fd8 100644
--- a/protocol/dubbo/dubbo_invoker.go
+++ b/protocol/dubbo/dubbo_invoker.go
@@ -56,6 +56,10 @@ func (di *DubboInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
 		result protocol.RPCResult
 	)
 
+	if invocation.Attachments() != nil {
+		invocation.Attachments()[constant.DUBBO_VERSION_KEY] = constant.DUBBO_VERSION
+	}
+
 	inv := invocation.(*invocation_impl.RPCInvocation)
 	url := di.GetUrl()
 	// async
@@ -66,15 +70,15 @@ func (di *DubboInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
 	}
 	if async {
 		if callBack, ok := inv.CallBack().(func(response CallResponse)); ok {
-			result.Err = di.client.AsyncCall(url.Location, url, inv.MethodName(), inv.Arguments(), callBack, inv.Reply())
+			result.Err = di.client.AsyncCall(url.Location, url, inv.MethodName(), inv.Arguments(), callBack, inv.Reply(), inv.Attachments())
 		} else {
-			result.Err = di.client.CallOneway(url.Location, url, inv.MethodName(), inv.Arguments())
+			result.Err = di.client.CallOneway(url.Location, url, inv.MethodName(), inv.Arguments(), inv.Attachments())
 		}
 	} else {
 		if inv.Reply() == nil {
 			result.Err = Err_No_Reply
 		} else {
-			result.Err = di.client.Call(url.Location, url, inv.MethodName(), inv.Arguments(), inv.Reply())
+			result.Err = di.client.Call(url.Location, url, inv.MethodName(), inv.Arguments(), inv.Reply(), inv.Attachments())
 		}
 	}
 	if result.Err == nil {
diff --git a/protocol/dubbo/listener.go b/protocol/dubbo/listener.go
index 096358d8ba0e8a07e730e6a2012baba6583ba5cb..5f46d522ccc9305d5485c6c1524987294fb2f895 100644
--- a/protocol/dubbo/listener.go
+++ b/protocol/dubbo/listener.go
@@ -244,19 +244,15 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) {
 	}
 	invoker := exporter.(protocol.Exporter).GetInvoker()
 	if invoker != nil {
-		result := invoker.Invoke(invocation.NewRPCInvocation(p.Service.Method, p.Body.(map[string]interface{})["args"].([]interface{}), map[string]string{
-			constant.PATH_KEY:      p.Service.Path,
-			constant.GROUP_KEY:     p.Service.Group,
-			constant.INTERFACE_KEY: p.Service.Interface,
-			constant.VERSION_KEY:   p.Service.Version,
-		}))
+		result := invoker.Invoke(invocation.NewRPCInvocation(p.Service.Method, p.Body.(map[string]interface{})["args"].([]interface{}),
+			p.Body.(map[string]interface{})["attachments"].(map[string]string)))
 		if err := result.Error(); err != nil {
 			p.Header.ResponseStatus = hessian.Response_OK
-			p.Body = err
+			p.Body = hessian.NewResponse(nil, err, result.Attachments())
 		} else {
 			res := result.Result()
 			p.Header.ResponseStatus = hessian.Response_OK
-			p.Body = res
+			p.Body = hessian.NewResponse(res, nil, result.Attachments())
 		}
 	}
 
diff --git a/protocol/dubbo/readwriter.go b/protocol/dubbo/readwriter.go
index 8c6c8a5a53af4df9a89eae5db5752eb07f3aa446..34a66f616cf4412bd02544684eafc142fc57f4d0 100644
--- a/protocol/dubbo/readwriter.go
+++ b/protocol/dubbo/readwriter.go
@@ -23,7 +23,7 @@ import (
 )
 
 import (
-	hessian "github.com/apache/dubbo-go-hessian2"
+	"github.com/apache/dubbo-go-hessian2"
 	"github.com/dubbogo/getty"
 	perrors "github.com/pkg/errors"
 )
@@ -118,7 +118,7 @@ func (p *RpcServerPackageHandler) Read(ss getty.Session, data []byte) (interface
 		if len(req) > 0 {
 			var dubboVersion, argsTypes string
 			var args []interface{}
-			var attachments map[interface{}]interface{}
+			var attachments map[string]string
 			if req[0] != nil {
 				dubboVersion = req[0].(string)
 			}
@@ -138,14 +138,14 @@ func (p *RpcServerPackageHandler) Read(ss getty.Session, data []byte) (interface
 				args = req[5].([]interface{})
 			}
 			if req[6] != nil {
-				attachments = req[6].(map[interface{}]interface{})
+				attachments = req[6].(map[string]string)
 			}
-			pkg.Service.Interface = attachments[constant.INTERFACE_KEY].(string)
-			if pkg.Service.Path == "" && attachments[constant.PATH_KEY] != nil {
-				pkg.Service.Path = attachments[constant.PATH_KEY].(string)
+			pkg.Service.Interface = attachments[constant.INTERFACE_KEY]
+			if pkg.Service.Path == "" && attachments[constant.PATH_KEY] != "" {
+				pkg.Service.Path = attachments[constant.PATH_KEY]
 			}
-			if attachments[constant.GROUP_KEY] != nil {
-				pkg.Service.Group = attachments[constant.GROUP_KEY].(string)
+			if attachments[constant.GROUP_KEY] != "" {
+				pkg.Service.Group = attachments[constant.GROUP_KEY]
 			}
 			pkg.Body = map[string]interface{}{
 				"dubboVersion": dubboVersion,
diff --git a/registry/consul/agent018771271/raft/peers.info b/registry/consul/agent018771271/raft/peers.info
new file mode 100644
index 0000000000000000000000000000000000000000..e8f5885c51505a03ef0c681ffdb2c9a6ae1b7f02
--- /dev/null
+++ b/registry/consul/agent018771271/raft/peers.info
@@ -0,0 +1,65 @@
+
+As of Consul 0.7.0, the peers.json file is only used for recovery
+after an outage. The format of this file depends on what the server has
+configured for its Raft protocol version. Please see the agent configuration
+page at https://www.consul.io/docs/agent/options.html#_raft_protocol for more
+details about this parameter.
+
+For Raft protocol version 2 and earlier, this should be formatted as a JSON
+array containing the address and port of each Consul server in the cluster, like
+this:
+
+[
+  "10.1.0.1:8300",
+  "10.1.0.2:8300",
+  "10.1.0.3:8300"
+]
+
+For Raft protocol version 3 and later, this should be formatted as a JSON
+array containing the node ID, address:port, and suffrage information of each
+Consul server in the cluster, like this:
+
+[
+  {
+    "id": "adf4238a-882b-9ddc-4a9d-5b6758e4159e",
+    "address": "10.1.0.1:8300",
+    "non_voter": false
+  },
+  {
+    "id": "8b6dda82-3103-11e7-93ae-92361f002671",
+    "address": "10.1.0.2:8300",
+    "non_voter": false
+  },
+  {
+    "id": "97e17742-3103-11e7-93ae-92361f002671",
+    "address": "10.1.0.3:8300",
+    "non_voter": false
+  }
+]
+
+The "id" field is the node ID of the server. This can be found in the logs when
+the server starts up, or in the "node-id" file inside the server's data
+directory.
+
+The "address" field is the address and port of the server.
+
+The "non_voter" field controls whether the server is a non-voter, which is used
+in some advanced Autopilot configurations, please see
+https://www.consul.io/docs/guides/autopilot.html for more information. If
+"non_voter" is omitted it will default to false, which is typical for most
+clusters.
+
+Under normal operation, the peers.json file will not be present.
+
+When Consul starts for the first time, it will create this peers.info file and
+delete any existing peers.json file so that recovery doesn't occur on the first
+startup.
+
+Once this peers.info file is present, any peers.json file will be ingested at
+startup, and will set the Raft peer configuration manually to recover from an
+outage. It's crucial that all servers in the cluster are shut down before
+creating the peers.json file, and that all servers receive the same
+configuration. Once the peers.json file is successfully ingested and applied, it
+will be deleted.
+
+Please see https://www.consul.io/docs/guides/outage.html for more information.
diff --git a/registry/consul/agent018771271/raft/raft.db b/registry/consul/agent018771271/raft/raft.db
new file mode 100644
index 0000000000000000000000000000000000000000..280e025bb8d029da6f21e4784130859ab41caf40
Binary files /dev/null and b/registry/consul/agent018771271/raft/raft.db differ
diff --git a/registry/consul/agent897429767/raft/peers.info b/registry/consul/agent897429767/raft/peers.info
new file mode 100644
index 0000000000000000000000000000000000000000..e8f5885c51505a03ef0c681ffdb2c9a6ae1b7f02
--- /dev/null
+++ b/registry/consul/agent897429767/raft/peers.info
@@ -0,0 +1,65 @@
+
+As of Consul 0.7.0, the peers.json file is only used for recovery
+after an outage. The format of this file depends on what the server has
+configured for its Raft protocol version. Please see the agent configuration
+page at https://www.consul.io/docs/agent/options.html#_raft_protocol for more
+details about this parameter.
+
+For Raft protocol version 2 and earlier, this should be formatted as a JSON
+array containing the address and port of each Consul server in the cluster, like
+this:
+
+[
+  "10.1.0.1:8300",
+  "10.1.0.2:8300",
+  "10.1.0.3:8300"
+]
+
+For Raft protocol version 3 and later, this should be formatted as a JSON
+array containing the node ID, address:port, and suffrage information of each
+Consul server in the cluster, like this:
+
+[
+  {
+    "id": "adf4238a-882b-9ddc-4a9d-5b6758e4159e",
+    "address": "10.1.0.1:8300",
+    "non_voter": false
+  },
+  {
+    "id": "8b6dda82-3103-11e7-93ae-92361f002671",
+    "address": "10.1.0.2:8300",
+    "non_voter": false
+  },
+  {
+    "id": "97e17742-3103-11e7-93ae-92361f002671",
+    "address": "10.1.0.3:8300",
+    "non_voter": false
+  }
+]
+
+The "id" field is the node ID of the server. This can be found in the logs when
+the server starts up, or in the "node-id" file inside the server's data
+directory.
+
+The "address" field is the address and port of the server.
+
+The "non_voter" field controls whether the server is a non-voter, which is used
+in some advanced Autopilot configurations, please see
+https://www.consul.io/docs/guides/autopilot.html for more information. If
+"non_voter" is omitted it will default to false, which is typical for most
+clusters.
+
+Under normal operation, the peers.json file will not be present.
+
+When Consul starts for the first time, it will create this peers.info file and
+delete any existing peers.json file so that recovery doesn't occur on the first
+startup.
+
+Once this peers.info file is present, any peers.json file will be ingested at
+startup, and will set the Raft peer configuration manually to recover from an
+outage. It's crucial that all servers in the cluster are shut down before
+creating the peers.json file, and that all servers receive the same
+configuration. Once the peers.json file is successfully ingested and applied, it
+will be deleted.
+
+Please see https://www.consul.io/docs/guides/outage.html for more information.
diff --git a/registry/consul/agent897429767/raft/raft.db b/registry/consul/agent897429767/raft/raft.db
new file mode 100644
index 0000000000000000000000000000000000000000..280e025bb8d029da6f21e4784130859ab41caf40
Binary files /dev/null and b/registry/consul/agent897429767/raft/raft.db differ
diff --git a/registry/protocol/protocol.go b/registry/protocol/protocol.go
index e416e3af24a11244eff54b3bef7e40fa6d3c9749..1f9d81a3aa63daa167fd316ecc39ba8a38615155 100644
--- a/registry/protocol/protocol.go
+++ b/registry/protocol/protocol.go
@@ -18,6 +18,7 @@
 package protocol
 
 import (
+	"github.com/apache/dubbo-go/common/proxy/proxy_factory"
 	"sync"
 )
 
@@ -183,23 +184,17 @@ func GetProtocol() protocol.Protocol {
 
 type wrappedInvoker struct {
 	invoker protocol.Invoker
-	url     common.URL
 	protocol.BaseInvoker
 }
 
 func newWrappedInvoker(invoker protocol.Invoker, url common.URL) *wrappedInvoker {
 	return &wrappedInvoker{
 		invoker:     invoker,
-		url:         url,
-		BaseInvoker: *protocol.NewBaseInvoker(common.URL{}),
+		BaseInvoker: *protocol.NewBaseInvoker(url),
 	}
 }
-func (ivk *wrappedInvoker) GetUrl() common.URL {
-	return ivk.url
-}
-func (ivk *wrappedInvoker) getInvoker() protocol.Invoker {
-	return ivk.invoker
-}
 func (ivk *wrappedInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
+	// get right url
+	ivk.invoker.(*proxy_factory.ProxyInvoker).BaseInvoker = *protocol.NewBaseInvoker(ivk.GetUrl())
 	return ivk.invoker.Invoke(invocation)
 }
diff --git a/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk042578333srv0/version-2/log.1 b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk042578333srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..8c65c2c0c24de8e772a8dda1d1b461d74452f3fc
Binary files /dev/null and b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk042578333srv0/version-2/log.1 differ
diff --git a/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk206357592srv0/version-2/log.1 b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk206357592srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..9a6e71baab5352b9200ae108c1bc35ca78b57ea7
Binary files /dev/null and b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk206357592srv0/version-2/log.1 differ
diff --git a/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk263009523srv0/version-2/log.1 b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk263009523srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..1f02c30127b2d296437f66e222a9faa3799473c1
Binary files /dev/null and b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk263009523srv0/version-2/log.1 differ
diff --git a/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk966729654srv0/version-2/log.1 b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk966729654srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..879fb91093d6dc5a9977a4fd410be81423eca188
Binary files /dev/null and b/registry/zookeeper/Usersyc.fangAppDataLocalTempgozk966729654srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk430357803srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk430357803srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..ebed0a15bb61e31456ebfeb97cc7bf8714479ecb
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk430357803srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk473543055srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk473543055srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..ef5f047cf8485eccbca59c75c3387b572f1b978b
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk473543055srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk575286000srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk575286000srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..8d6c31e1411c1c0e6231c77e84162770e55f6e50
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk575286000srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk623621269srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk623621269srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..bb01a2b4b594ff478ed3e6ee04071da463afb4a7
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk623621269srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk653465506srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk653465506srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..a470ef0edb3f5334ed57d78ce1538c8e6f9abf6a
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk653465506srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk836166809srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk836166809srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..66601963c793a33ff28eb68550018cba91279173
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk836166809srv0/version-2/log.1 differ
diff --git a/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk920512142srv0/version-2/log.1 b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk920512142srv0/version-2/log.1
new file mode 100644
index 0000000000000000000000000000000000000000..e8c9de9d7f5e370061bc1fb303aa5ecfa9af3b90
Binary files /dev/null and b/remoting/zookeeper/Usersyc.fangAppDataLocalTempgozk920512142srv0/version-2/log.1 differ