diff --git a/README.md b/README.md index 29447d21c95493282670cf53737e1da077036184..9af43d8d7e1cdddee1c241e148e0cf3038f2484a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -# Go for Apache Dubbo [涓枃](./README_CN.md) # +# Apache Dubbo-go [涓枃](./README_CN.md) # -[](https://travis-ci.com/apache/dubbo-go) +[](https://travis-ci.org/apache/dubbo-go) [](https://codecov.io/gh/apache/dubbo-go) --- @@ -16,11 +16,11 @@ Apache License, Version 2.0 ## Project Architecture ## -Extension module and layered code design based on dubbo (include protocol layer,registry layer,cluster layer,config layer and so on), Our goal is: you can implement these layered interfaces in a new way, and override the default implementation of dubbo-go[same go-for-apache-dubbo] by calling 'extension.SetXXX' of extension, and complete your special needs without modifying the source code. At the same time, you are welcome to contribute implementation of useful expansion to the community. +Both extension module and layered project architecture is according to Apache Dubbo (including protocol layer, registry layer, cluster layer, config layer and so on), the advantage of this arch is as following: you can implement these layered interfaces in your own way, override the default implementation of dubbo-go by calling 'extension.SetXXX' of extension, complete your special needs without modifying the source code. At the same time, you are welcome to contribute implementation of useful extension to the community.  -About detail design please refer to [code layered design](https://github.com/apache/dubbo-go/wiki/dubbo-go-V1.0-design) +If you wanna know more about dubbo-go, please visit this reference [Project Architeture design](https://github.com/apache/dubbo-go/wiki/dubbo-go-V1.0-design) ## Feature list ## @@ -67,4 +67,3 @@ About dubbo-go benchmarking report, please refer to [dubbo benchmarking report]( ## Stargazers [](https://starchart.cc/apache/dubbo-go) - diff --git a/README_CN.md b/README_CN.md index 656ea286d54cff66c68659fb6a107213809c4eb3..0993828a71e39b49edbccb40a8a9ec68d725889e 100644 --- a/README_CN.md +++ b/README_CN.md @@ -1,6 +1,6 @@ -# Go for Apache Dubbo [English](./README.md) # +# Apache Dubbo-go [English](./README.md) # -[](https://travis-ci.com/apache/dubbo-go) +[](https://travis-ci.org/apache/dubbo-go) [](https://codecov.io/gh/apache/dubbo-go) --- diff --git a/config/reference_config.go b/config/reference_config.go index 229954563cb916ffec004e87e80090d728185a9b..e0c93b3e54248e886982dbf49e13a42a063eee77 100644 --- a/config/reference_config.go +++ b/config/reference_config.go @@ -92,7 +92,7 @@ func (refconfig *ReferenceConfig) Refer() { refconfig.urls = append(refconfig.urls, &serviceUrl) } else { if serviceUrl.Path == "" { - serviceUrl.Path = refconfig.InterfaceName + "/" + serviceUrl.Path = "/" + refconfig.InterfaceName } // merge url need to do newUrl := common.MergeUrl(serviceUrl, url) diff --git a/examples/dubbo/go-client/app/client.go b/examples/dubbo/go-client/app/client.go index e65d93c59754975854f3e456e12c38562b4ab3bb..6167fbc8e7b0743f807775d1c414110159d01449 100644 --- a/examples/dubbo/go-client/app/client.go +++ b/examples/dubbo/go-client/app/client.go @@ -27,11 +27,11 @@ import ( ) import ( - "github.com/apache/dubbo-go/common/logger" - hessian "github.com/dubbogo/hessian2" + "github.com/dubbogo/hessian2" ) import ( + "github.com/apache/dubbo-go/common/logger" _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" "github.com/apache/dubbo-go/config" _ "github.com/apache/dubbo-go/protocol/dubbo" @@ -102,6 +102,13 @@ func main() { println("response result: %v", user) } + println("\n\n\nstart to test dubbo - getErr") + user = &User{} + err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetErr(context.TODO(), []interface{}{"A003"}, user) + if err != nil { + println("getErr - error: %v", err) + } + println("\n\n\nstart to test dubbo illegal method") err = conMap["com.ikurento.user.UserProvider"].GetRPCService().(*UserProvider).GetUser1(context.TODO(), []interface{}{"A003"}, user) if err != nil { diff --git a/examples/dubbo/go-client/app/user.go b/examples/dubbo/go-client/app/user.go index 81a7adb2af0a8afac4aec8c164db35f0b4d77b82..59e105109ecb7213a071ca9071737e14fff0869e 100644 --- a/examples/dubbo/go-client/app/user.go +++ b/examples/dubbo/go-client/app/user.go @@ -25,10 +25,13 @@ import ( ) import ( - "github.com/apache/dubbo-go/config" hessian "github.com/dubbogo/hessian2" ) +import ( + "github.com/apache/dubbo-go/config" +) + type Gender hessian.JavaEnum func init() { @@ -94,6 +97,7 @@ func (User) JavaClassName() string { type UserProvider struct { GetUsers func(req []interface{}) ([]interface{}, error) + GetErr func(ctx context.Context, req []interface{}, rsp *User) error GetUser func(ctx context.Context, req []interface{}, rsp *User) error GetUser0 func(id string, name string) (User, error) GetUser1 func(ctx context.Context, req []interface{}, rsp *User) error diff --git a/examples/dubbo/go-server/app/server.go b/examples/dubbo/go-server/app/server.go index db0196f63e2a43fcf06d73f15d925cf8af6f1867..a5c89be7a6b36ddaaae8b515729aaccd203c19f1 100644 --- a/examples/dubbo/go-server/app/server.go +++ b/examples/dubbo/go-server/app/server.go @@ -26,11 +26,11 @@ import ( ) import ( - "github.com/apache/dubbo-go/common/logger" hessian "github.com/dubbogo/hessian2" ) import ( + "github.com/apache/dubbo-go/common/logger" "github.com/apache/dubbo-go/config" _ "github.com/apache/dubbo-go/protocol/dubbo" _ "github.com/apache/dubbo-go/registry/protocol" diff --git a/examples/dubbo/go-server/app/user.go b/examples/dubbo/go-server/app/user.go index 9ba663104240d5ee5ead9fcda841b9beab335a49..e4400cc270ad46c84085b52e8879bbd49969bcb0 100644 --- a/examples/dubbo/go-server/app/user.go +++ b/examples/dubbo/go-server/app/user.go @@ -145,6 +145,10 @@ func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User return err } +func (u *UserProvider) GetErr(ctx context.Context, req []interface{}, rsp *User) error { + return hessian.NewThrowable("exception") +} + func (u *UserProvider) GetUser0(id string, name string) (User, error) { var err error diff --git a/examples/dubbo/go-server/profiles/dev/server.yml b/examples/dubbo/go-server/profiles/dev/server.yml index 06f3c9f885a917b71baea178d172f8782e174218..619f2ddca6a0164e222f4a08669beb79dc077914 100644 --- a/examples/dubbo/go-server/profiles/dev/server.yml +++ b/examples/dubbo/go-server/profiles/dev/server.yml @@ -42,7 +42,7 @@ services: protocols: - name: "dubbo" - ip : "127.0.0.1" + # ip : "127.0.0.1" port : 20000 #- name: "jsonrpc" # ip: "127.0.0.1" diff --git a/examples/dubbo/go-server/profiles/release/server.yml b/examples/dubbo/go-server/profiles/release/server.yml index 64587aa1adb9afac3b32c0e74779566ba88cbc7c..c4d98eb746d7c5418dce6d0dca2fe89da137d680 100644 --- a/examples/dubbo/go-server/profiles/release/server.yml +++ b/examples/dubbo/go-server/profiles/release/server.yml @@ -42,7 +42,7 @@ services: protocols: - name: "dubbo" - ip : "127.0.0.1" + # ip : "127.0.0.1" port : 20000 #- name: "jsonrpc" # ip: "127.0.0.1" diff --git a/examples/dubbo/go-server/profiles/test/server.yml b/examples/dubbo/go-server/profiles/test/server.yml index 64587aa1adb9afac3b32c0e74779566ba88cbc7c..c4d98eb746d7c5418dce6d0dca2fe89da137d680 100644 --- a/examples/dubbo/go-server/profiles/test/server.yml +++ b/examples/dubbo/go-server/profiles/test/server.yml @@ -42,7 +42,7 @@ services: protocols: - name: "dubbo" - ip : "127.0.0.1" + # ip : "127.0.0.1" port : 20000 #- name: "jsonrpc" # ip: "127.0.0.1" diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java index b410813c74a7432cbbe1f2e7627faba9ebb17e70..f1100e79ac2ee31ea13b98af345d5472eb08488e 100644 --- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java +++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java @@ -51,9 +51,18 @@ public class Consumer { System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + " UserInfo, Id:" + user2.getId() + ", name:" + user2.getName() + ", sex:" + user2.getSex().toString() + ", age:" + user2.getAge() + ", time:" + user2.getTime().toString()); + + User user9 = userProvider.GetUser1("A003"); } catch (Exception e) { + System.out.println("*************exception***********"); e.printStackTrace(); } + try { + userProvider.GetErr("A003"); + } catch (Throwable t) { + System.out.println("*************exception***********"); + t.printStackTrace(); + } } private void testGetUsers() throws Exception { diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java b/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java index d5bce8105673a24d78ddd3a636788d1ccf8e57a6..036f46332105710ffcc53465b487ada860c25172 100644 --- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java +++ b/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java @@ -20,6 +20,8 @@ import java.util.List; public interface UserProvider { User GetUser(String userId); + User GetErr(String userId) throws Exception; + User GetUser1(String userId); List<User> GetUsers(List<String> userIdList); User GetUser0(String userId, String name); diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java index b75740bbcd26a6438d22f7d3bf08fa5e316f7aa7..bb1d9a9d42444b1782d919c6a62ac2fc60e509b1 100644 --- a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java +++ b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java @@ -14,6 +14,8 @@ public interface UserProvider { User GetUser0(String userId, String name); + User GetErr(String userId) throws Exception; + Map<String, User> GetUserMap(List<String> userIdList); User getUser(int usercode); diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java index f0d7faf3df40c3d422407ddf4d2f2c501e1efdf7..9eaf989a8204be5a7b0065b23dfec88eff837854 100644 --- a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java +++ b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java @@ -35,7 +35,9 @@ public class UserProviderAnotherImpl implements UserProvider { public User GetUser0(String userId, String name) { return new User(userId, name, 48); } - + public User GetErr(String userId) throws Exception { + throw new Exception("exception"); + } public List<User> GetUsers(ArrayList<String> userIdList) { Iterator it = userIdList.iterator(); List<User> userList = new ArrayList<User>(); diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java index 1311bd807d59d8336f4ada1296d3a05abd31a548..f8875651096ef719182eb0eeffb779de16425702 100644 --- a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java +++ b/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java @@ -32,6 +32,9 @@ public class UserProviderImpl implements UserProvider { public User GetUser(String userId) { return new User(userId, "zhangsan", 18); } + public User GetErr(String userId) throws Exception { + throw new Exception("exception"); + } public User GetUser0(String userId, String name) { return new User(userId, name, 18); } diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/jsonrpc/go-client/app/client.go index dcefd9762425afca996c5caf8217e5b921ac74fa..30a4ed1692d650a2580c008dde6f834e2c29b81e 100644 --- a/examples/jsonrpc/go-client/app/client.go +++ b/examples/jsonrpc/go-client/app/client.go @@ -28,9 +28,6 @@ import ( import ( "github.com/apache/dubbo-go/common/logger" -) - -import ( _ "github.com/apache/dubbo-go/common/proxy/proxy_factory" "github.com/apache/dubbo-go/config" _ "github.com/apache/dubbo-go/protocol/jsonrpc" diff --git a/filter/impl/echo_filter.go b/filter/impl/echo_filter.go index d2a00108bf2c842057af23dab4d4f09fbb2b0ed7..5eb5a37fa500bd8c180d879240d1c1e367df31ce 100644 --- a/filter/impl/echo_filter.go +++ b/filter/impl/echo_filter.go @@ -17,13 +17,10 @@ package impl -import ( - "github.com/apache/dubbo-go/common/logger" -) - import ( "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" + "github.com/apache/dubbo-go/common/logger" "github.com/apache/dubbo-go/filter" "github.com/apache/dubbo-go/protocol" ) diff --git a/go.mod b/go.mod index f13826387f3c537a1b0e4ea05cb9e9c2231a893d..73f5a4f31b8af6303a121c3cf5cab0ace2fc7a88 100644 --- a/go.mod +++ b/go.mod @@ -1,8 +1,8 @@ module github.com/apache/dubbo-go require ( - github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53 - github.com/dubbogo/hessian2 v0.0.0-20190526221400-d5610bbd0a41 + github.com/dubbogo/getty v0.0.0-20190607120257-8b0e100a88af + github.com/dubbogo/hessian2 v0.0.0-20190607144249-afb8cbfad2cb // indirect github.com/pkg/errors v0.8.1 github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec github.com/stretchr/testify v1.3.0 diff --git a/go.sum b/go.sum index 3da2865342a319a4351757706f31a313afe850ed..eeffb07a0231e161115e9accd35531b9fcc6de75 100644 --- a/go.sum +++ b/go.sum @@ -1,13 +1,9 @@ github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53 h1:bniSNoC4xnAbrx4estwc9F0qkWnh6ZDsAS0y9d7mPos= -github.com/dubbogo/getty v0.0.0-20190523180329-bdf5e640ea53/go.mod h1:cRMSuoCmwc5lULFFnYZTxyCfZhObmRTNbS7XRnPNHSo= -github.com/dubbogo/hessian2 v0.0.0-20190526221400-d5610bbd0a41 h1:lNtW7+aN8oBdCoEuny0rOqOkL5duI4Cu3+G8vqibX48= -github.com/dubbogo/hessian2 v0.0.0-20190526221400-d5610bbd0a41/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM= +github.com/dubbogo/getty v0.0.0-20190607120257-8b0e100a88af h1:vvXNXyq5uIlf+KlTduhRKY4hBBBjgCUNreT1yIfKftw= +github.com/dubbogo/getty v0.0.0-20190607120257-8b0e100a88af/go.mod h1:cRMSuoCmwc5lULFFnYZTxyCfZhObmRTNbS7XRnPNHSo= +github.com/dubbogo/hessian2 v0.0.0-20190607144249-afb8cbfad2cb/go.mod h1:XFGDn4oSZX26zkcfhkM/fCJrOqwQJxk/xgWW1KMJBKM= github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= @@ -15,19 +11,12 @@ github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoA github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec h1:6ncX5ko6B9LntYM0YBRXkiSaZMmLYeZ/NWcmeB43mMY= github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec h1:6ncX5ko6B9LntYM0YBRXkiSaZMmLYeZ/NWcmeB43mMY= github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= -github.com/samuel/go-zookeeper v0.0.0-20180130194729-c4fab1ac1bec/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= go.uber.org/atomic v1.4.0 h1:cxzIVoETapQEqDhQu3QfnvXAV4AlzcvUCxkVUFw3+EU= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0 h1:HoEmRHQPVSqub6w2z2d2EOVs2fjyFRGyofhKuyDq0QI= @@ -39,10 +28,6 @@ golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53 h1:kcXqo9vE6fsZY5X5Rd7R1l7fT golang.org/x/net v0.0.0-20190320064053-1272bf9dcd53/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/protocol/dubbo/client.go b/protocol/dubbo/client.go index d055ddac9abc2d046e6c10dc40ecbae23af35e27..38aed1063c7ec200b6b0654dcb3a5e8ac8138b86 100644 --- a/protocol/dubbo/client.go +++ b/protocol/dubbo/client.go @@ -201,6 +201,13 @@ func (c *Client) AsyncCall(addr string, svcUrl common.URL, method string, args i return perrors.WithStack(c.call(CT_TwoWay, addr, svcUrl, method, args, reply, callback, copts)) } +func (c *Client) GetPendingResponse(seq SequenceType) *PendingResponse { + c.pendingLock.RLock() + defer c.pendingLock.RUnlock() + + return c.pendingResponses[SequenceType(seq)] +} + func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string, args, reply interface{}, callback AsyncCallback, opts CallOptions) error { @@ -257,7 +264,7 @@ func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string } select { - case <-getty.GetTimeWheel().After(opts.ResponseTimeout): + case <-time.After(opts.ResponseTimeout): err = errClientReadTimeout c.removePendingResponse(SequenceType(rsp.seq)) case <-rsp.done: diff --git a/protocol/dubbo/client_test.go b/protocol/dubbo/client_test.go index 1183bd00d212f0c49ed8ec70fabaa34e6e24701c..0a02739a86d9ed6bffc0b209152ac789faee87f3 100644 --- a/protocol/dubbo/client_test.go +++ b/protocol/dubbo/client_test.go @@ -22,13 +22,17 @@ import ( "sync" "testing" "time" +) - hessian "github.com/dubbogo/hessian2" +import ( + "github.com/dubbogo/hessian2" + perrors "github.com/pkg/errors" + "github.com/stretchr/testify/assert" +) +import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/protocol" - perrors "github.com/pkg/errors" - "github.com/stretchr/testify/assert" ) type ( @@ -80,7 +84,7 @@ func TestClient_Call(t *testing.T) { user = &User{} err = c.Call("127.0.0.1:20000", url, "GetUser1", []interface{}{"1", "username"}, user) - assert.EqualError(t, err, "java exception:error") + assert.EqualError(t, err, "got exception: error") user2 := []interface{}{} err = c.Call("127.0.0.1:20000", url, "GetUser2", []interface{}{"1", "username"}, &user2) diff --git a/protocol/dubbo/codec.go b/protocol/dubbo/codec.go index a20fcfabd1ca93b6ad5073d3ff56a51a3a16bbe7..86d1676f1841beab661502c30a7e7c4fe07a38de 100644 --- a/protocol/dubbo/codec.go +++ b/protocol/dubbo/codec.go @@ -74,7 +74,7 @@ func (p *DubboPackage) Marshal() (*bytes.Buffer, error) { } func (p *DubboPackage) Unmarshal(buf *bytes.Buffer, opts ...interface{}) error { - codec := hessian.NewHessianCodec(bufio.NewReader(buf)) + codec := hessian.NewHessianCodec(bufio.NewReaderSize(buf, buf.Len())) // read header err := codec.ReadHeader(&p.Header) @@ -83,15 +83,14 @@ func (p *DubboPackage) Unmarshal(buf *bytes.Buffer, opts ...interface{}) error { } if len(opts) != 0 { // for client - if client, ok := opts[0].(*Client); ok { - - r := client.pendingResponses[SequenceType(p.Header.ID)] - if r == nil { - return perrors.Errorf("pendingResponses[%v] = nil", p.Header.ID) - } - p.Body = client.pendingResponses[SequenceType(p.Header.ID)].reply - } else { - return perrors.Errorf("opts[0] is not *Client") + client, ok := opts[0].(*Client) + if !ok { + return perrors.Errorf("opts[0] is not of type *Client") + } + + p.Body = client.GetPendingResponse(SequenceType(p.Header.ID)).reply + if p.Body == nil { + return perrors.Errorf("client.GetPendingResponse(%v) = nil", p.Header.ID) } } diff --git a/protocol/dubbo/listener.go b/protocol/dubbo/listener.go index 59ffd3e1e554e2be9a9dfef25f31d1e06211d938..9e99bcb628ea1c3075d5768bfd79bb2083f434f9 100644 --- a/protocol/dubbo/listener.go +++ b/protocol/dubbo/listener.go @@ -22,16 +22,20 @@ import ( "reflect" "sync" "time" +) +import ( "github.com/dubbogo/getty" + "github.com/dubbogo/hessian2" + perrors "github.com/pkg/errors" +) +import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/logger" "github.com/apache/dubbo-go/protocol" "github.com/apache/dubbo-go/protocol/invocation" - hessian "github.com/dubbogo/hessian2" - perrors "github.com/pkg/errors" ) // todo: WritePkg_Timeout will entry *.yml @@ -211,7 +215,7 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) { constant.VERSION_KEY: p.Service.Version, })) if err := result.Error(); err != nil { - p.Header.ResponseStatus = hessian.Response_SERVER_ERROR + p.Header.ResponseStatus = hessian.Response_OK p.Body = err h.reply(session, p, hessian.PackageResponse) return @@ -260,15 +264,15 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) { defer func() { if e := recover(); e != nil { - req.Header.ResponseStatus = hessian.Response_BAD_REQUEST + req.Header.ResponseStatus = hessian.Response_SERVER_ERROR if err, ok := e.(error); ok { logger.Errorf("callService panic: %#v", err) - req.Body = e.(error) + req.Body = perrors.WithStack(err) } else if err, ok := e.(string); ok { logger.Errorf("callService panic: %#v", perrors.New(err)) req.Body = perrors.New(err) } else { - logger.Errorf("callService panic: %#v", e) + logger.Errorf("callService panic: %#v, this is impossible.", e) req.Body = e } } @@ -277,7 +281,7 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) { svcIf := req.Body.(map[string]interface{})["service"] if svcIf == nil { logger.Errorf("service not found!") - req.Header.ResponseStatus = hessian.Response_SERVICE_NOT_FOUND + req.Header.ResponseStatus = hessian.Response_BAD_REQUEST req.Body = perrors.New("service not found") return } @@ -285,7 +289,7 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) { method := svc.Method()[req.Service.Method] if method == nil { logger.Errorf("method not found!") - req.Header.ResponseStatus = hessian.Response_SERVICE_NOT_FOUND + req.Header.ResponseStatus = hessian.Response_BAD_REQUEST req.Body = perrors.New("method not found") return } @@ -322,8 +326,8 @@ func (h *RpcServerHandler) callService(req *DubboPackage, ctx context.Context) { retErr = returnValues[1].Interface() } if retErr != nil { - req.Header.ResponseStatus = hessian.Response_SERVER_ERROR - req.Body = retErr.(error) + req.Header.ResponseStatus = hessian.Response_OK + req.Body = retErr } else { req.Body = replyv.Interface() } diff --git a/protocol/dubbo/pool.go b/protocol/dubbo/pool.go index b47c146fe783aba2fc2de7fe5df956da4d6bb7d6..0ab43ede7f1bbee8b7d952ae2e4a210e9850b80a 100644 --- a/protocol/dubbo/pool.go +++ b/protocol/dubbo/pool.go @@ -39,7 +39,7 @@ type gettyRPCClient struct { once sync.Once protocol string addr string - created int64 // 涓�0锛屽垯璇存槑娌℃湁琚垱寤烘垨鑰呰閿€姣佷簡 + created int64 // zero, not create or be destroyed pool *gettyRPCClientPool diff --git a/protocol/dubbo/readwriter.go b/protocol/dubbo/readwriter.go index 5de96acaa1ae5a8df7fa5e8182b98be08ac137c3..b7f2700d15d3c3c6b46371cb5eef8ee57ce9415e 100644 --- a/protocol/dubbo/readwriter.go +++ b/protocol/dubbo/readwriter.go @@ -24,6 +24,7 @@ import ( import ( "github.com/dubbogo/getty" + hessian "github.com/dubbogo/hessian2" perrors "github.com/pkg/errors" ) import ( @@ -52,8 +53,14 @@ func (p *RpcClientPackageHandler) Read(ss getty.Session, data []byte) (interface buf := bytes.NewBuffer(data) err := pkg.Unmarshal(buf, p.client) if err != nil { - pkg.Err = perrors.WithStack(err) // client will get this err - return pkg, len(data), nil + originErr := perrors.Cause(err) + if originErr == hessian.ErrHeaderNotEnough || originErr == hessian.ErrBodyNotEnough { + return nil, 0, nil + } + + logger.Errorf("pkg.Unmarshal(ss:%+v, len(@data):%d) = error:%+v", ss, len(data), err) + + return nil, 0, perrors.WithStack(err) } return pkg, len(data), nil @@ -94,6 +101,13 @@ func (p *RpcServerPackageHandler) Read(ss getty.Session, data []byte) (interface buf := bytes.NewBuffer(data) err := pkg.Unmarshal(buf) if err != nil { + originErr := perrors.Cause(err) + if originErr == hessian.ErrHeaderNotEnough || originErr == hessian.ErrBodyNotEnough { + return nil, 0, nil + } + + logger.Errorf("pkg.Unmarshal(ss:%+v, len(@data):%d) = error:%+v", ss, len(data), err) + return nil, 0, perrors.WithStack(err) } // convert params of request diff --git a/registry/directory/directory.go b/registry/directory/directory.go index 8b740f449349eb51a8119e3abffb55ce06b35345..8163e204fe824069e79306d29bd0af22ab67d23f 100644 --- a/registry/directory/directory.go +++ b/registry/directory/directory.go @@ -23,7 +23,6 @@ import ( ) import ( - "github.com/apache/dubbo-go/common/logger" perrors "github.com/pkg/errors" ) @@ -32,6 +31,7 @@ import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" + "github.com/apache/dubbo-go/common/logger" "github.com/apache/dubbo-go/protocol" "github.com/apache/dubbo-go/protocol/protocolwrapper" "github.com/apache/dubbo-go/registry" diff --git a/registry/protocol/protocol.go b/registry/protocol/protocol.go index e318bd097cc0122f3e0ecf4db222da0edef64c46..ff33b5fe6e063257c12035f3262e0daae874363e 100644 --- a/registry/protocol/protocol.go +++ b/registry/protocol/protocol.go @@ -21,14 +21,11 @@ import ( "sync" ) -import ( - "github.com/apache/dubbo-go/common/logger" -) - import ( "github.com/apache/dubbo-go/common" "github.com/apache/dubbo-go/common/constant" "github.com/apache/dubbo-go/common/extension" + "github.com/apache/dubbo-go/common/logger" "github.com/apache/dubbo-go/protocol" "github.com/apache/dubbo-go/protocol/protocolwrapper" "github.com/apache/dubbo-go/registry"