diff --git a/.gitignore b/.gitignore
index f189060bb351db399efe009a676ac3984b634215..3769d10aa12348464cb315fd336bf6b7234069cc 100644
--- a/.gitignore
+++ b/.gitignore
@@ -10,6 +10,7 @@
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
+coverage.txt
*.idea
*.iml
diff --git a/README.md b/README.md
index 8bdaee4203c8f3c24adc6dd84e7bfd8cb9f9b8f8..acb16f46825b3c33d4966caa553f1ee52513e3f8 100644
--- a/README.md
+++ b/README.md
@@ -29,9 +29,9 @@ Finished List:
- Role: Consumer, Provider
- Transport: HTTP, TCP
- Codec: JsonRPC v2, Hessian v2
-- Registry: ZooKeeper
+- Registry: ZooKeeper/[etcd](https://github.com/apache/dubbo-go/pull/148)/[nacos](https://github.com/apache/dubbo-go/pull/151)
- Configure Center: Zookeeper
-- Cluster Strategy: Failover/[Failfast](https://github.com/apache/dubbo-go/pull/140)/[Failsafe/Failback](https://github.com/apache/dubbo-go/pull/136)
+- Cluster Strategy: Failover/[Failfast](https://github.com/apache/dubbo-go/pull/140)/[Failsafe/Failback](https://github.com/apache/dubbo-go/pull/136)/Available/Broadcast
- Load Balance: Random/[RoundRobin](https://github.com/apache/dubbo-go/pull/66)/[LeastActive](https://github.com/apache/dubbo-go/pull/65)
- Filter: Echo Health Check
- Other feature: [generic invoke](https://github.com/apache/dubbo-go/pull/122)/start check/connecting certain provider/multi-protocols/multi-registries/multi-versions/service group
@@ -41,7 +41,7 @@ Working List:
- Cluster Strategy: Forking
- Load Balance: ConsistentHash
- Filter: TokenFilter/AccessLogFilter/CountFilter/ExecuteLimitFilter/TpsLimitFilter
-- Registry: etcd/k8s/consul/nacos
+- Registry: k8s/consul
- Configure Center: apollo
- Dynamic Configuration Center & Metadata Center (dubbo v2.7.x)
- Metrics: Promethus(dubbo v2.7.x)
@@ -54,12 +54,23 @@ Todo List:
You can know more about dubbo-go by its [roadmap](https://github.com/apache/dubbo-go/wiki/Roadmap).
+## Document
+TODO
## Quick Start
The subdirectory examples shows how to use dubbo-go. Please read the [examples/README.md](https://github.com/apache/dubbo-go/blob/develop/examples/README.md) carefully to learn how to dispose the configuration and compile the program.
+## Running unit tests
+
+```bash
+go test ./...
+
+# coverage
+go test ./... -coverprofile=coverage.txt -covermode=atomic
+```
+
## Contributing
If you are willing to do some code contributions and document contributions to [Apache/dubbo-go](https://github.com/apache/dubbo-go), please visit [contribution intro](https://github.com/apache/dubbo-go/blob/master/cg.md).
diff --git a/README_CN.md b/README_CN.md
index 4512e7eca00eab98596d9ee9321179b1931096e4..a71d7ec8b755b9e1878027db05f717d6e876583d 100644
--- a/README_CN.md
+++ b/README_CN.md
@@ -29,9 +29,9 @@ Apache License, Version 2.0
- 角色端: Consumer, Provider
- 传输协议: HTTP, TCP
- 序列化协议: JsonRPC v2, Hessian v2
-- 注册中心: ZooKeeper
+- 注册中心: ZooKeeper/[etcd](https://github.com/apache/dubbo-go/pull/148)/[nacos](https://github.com/apache/dubbo-go/pull/151)
- 配置中心: Zookeeper
-- 集群策略: Failover/[Failfast](https://github.com/apache/dubbo-go/pull/140)/[Failsafe/Failback](https://github.com/apache/dubbo-go/pull/136)
+- 集群策略: Failover/[Failfast](https://github.com/apache/dubbo-go/pull/140)/[Failsafe/Failback](https://github.com/apache/dubbo-go/pull/136)/Available/Broadcast
- 负载均衡策略: Random/[RoundRobin](https://github.com/apache/dubbo-go/pull/66)/[LeastActive](https://github.com/apache/dubbo-go/pull/65)
- 过滤器: Echo Health Check
- 其他功能支持: [泛化调用](https://github.com/apache/dubbo-go/pull/122)/启动时检查/服务直连/多服务协议/多注册中心/多服务版本/服务分组
@@ -54,10 +54,23 @@ Apache License, Version 2.0
你可以通过访问 [roadmap](https://github.com/apache/dubbo-go/wiki/Roadmap) 知道更多关于 dubbo-go 的信息
+## 文档
+
+TODO
+
## 快速开始 ##
这个子目录下的例子展示了如何使用 dubbo-go 。请仔细阅读 [examples/README.md](https://github.com/apache/dubbo-go/blob/develop/examples/README.md) 学习如何处理配置并编译程序。
+## 运行单测
+
+```bash
+go test ./...
+
+# 覆盖率
+go test ./... -coverprofile=coverage.txt -covermode=atomic
+```
+
## 如何贡献
如果您愿意给 [Apache/dubbo-go](https://github.com/apache/dubbo-go) 贡献代码或者文档,我们都热烈欢迎。具体请参考 [contribution intro](https://github.com/apache/dubbo-go/blob/master/cg.md)。
diff --git a/cluster/cluster_impl/available_cluster.go b/cluster/cluster_impl/available_cluster.go
new file mode 100644
index 0000000000000000000000000000000000000000..7e748cd938319ff437bb3fb6c7945b857d316069
--- /dev/null
+++ b/cluster/cluster_impl/available_cluster.go
@@ -0,0 +1,40 @@
+/*
+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 cluster_impl
+
+import (
+ "github.com/apache/dubbo-go/cluster"
+ "github.com/apache/dubbo-go/common/extension"
+ "github.com/apache/dubbo-go/protocol"
+)
+
+type availableCluster struct{}
+
+const available = "available"
+
+func init() {
+ extension.SetCluster(available, NewAvailableCluster)
+}
+
+func NewAvailableCluster() cluster.Cluster {
+ return &availableCluster{}
+}
+
+func (cluser *availableCluster) Join(directory cluster.Directory) protocol.Invoker {
+ return NewAvailableClusterInvoker(directory)
+}
diff --git a/cluster/cluster_impl/available_cluster_invoker.go b/cluster/cluster_impl/available_cluster_invoker.go
new file mode 100644
index 0000000000000000000000000000000000000000..c59c0702c216fe5c58d190a023322aaa00ac9c17
--- /dev/null
+++ b/cluster/cluster_impl/available_cluster_invoker.go
@@ -0,0 +1,61 @@
+/*
+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 cluster_impl
+
+import (
+ "fmt"
+)
+
+import (
+ "github.com/pkg/errors"
+)
+
+import (
+ "github.com/apache/dubbo-go/cluster"
+ "github.com/apache/dubbo-go/protocol"
+)
+
+type availableClusterInvoker struct {
+ baseClusterInvoker
+}
+
+func NewAvailableClusterInvoker(directory cluster.Directory) protocol.Invoker {
+ return &availableClusterInvoker{
+ baseClusterInvoker: newBaseClusterInvoker(directory),
+ }
+}
+
+func (invoker *availableClusterInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
+ invokers := invoker.directory.List(invocation)
+ err := invoker.checkInvokers(invokers, invocation)
+ if err != nil {
+ return &protocol.RPCResult{Err: err}
+ }
+
+ err = invoker.checkWhetherDestroyed()
+ if err != nil {
+ return &protocol.RPCResult{Err: err}
+ }
+
+ for _, ivk := range invokers {
+ if ivk.IsAvailable() {
+ return ivk.Invoke(invocation)
+ }
+ }
+ return &protocol.RPCResult{Err: errors.New(fmt.Sprintf("no provider available in %v", invokers))}
+}
diff --git a/cluster/cluster_impl/available_cluster_invoker_test.go b/cluster/cluster_impl/available_cluster_invoker_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..04032a7f24dec0e73acb15921f753921391f1515
--- /dev/null
+++ b/cluster/cluster_impl/available_cluster_invoker_test.go
@@ -0,0 +1,88 @@
+/*
+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 cluster_impl
+
+import (
+ "context"
+ "strings"
+ "testing"
+)
+
+import (
+ "github.com/golang/mock/gomock"
+ "github.com/stretchr/testify/assert"
+)
+
+import (
+ "github.com/apache/dubbo-go/cluster/directory"
+ "github.com/apache/dubbo-go/cluster/loadbalance"
+ "github.com/apache/dubbo-go/common"
+ "github.com/apache/dubbo-go/common/extension"
+ "github.com/apache/dubbo-go/protocol"
+ "github.com/apache/dubbo-go/protocol/invocation"
+ "github.com/apache/dubbo-go/protocol/mock"
+)
+
+var (
+ availableUrl, _ = common.NewURL(context.Background(), "dubbo://192.168.1.1:20000/com.ikurento.user.UserProvider")
+)
+
+func registerAvailable(t *testing.T, invoker *mock.MockInvoker) protocol.Invoker {
+ extension.SetLoadbalance("random", loadbalance.NewRandomLoadBalance)
+ availableCluster := NewAvailableCluster()
+
+ invokers := []protocol.Invoker{}
+ invokers = append(invokers, invoker)
+ invoker.EXPECT().GetUrl().Return(availableUrl)
+
+ staticDir := directory.NewStaticDirectory(invokers)
+ clusterInvoker := availableCluster.Join(staticDir)
+ return clusterInvoker
+}
+
+func TestAvailableClusterInvokerSuccess(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+
+ invoker := mock.NewMockInvoker(ctrl)
+ clusterInvoker := registerAvailable(t, invoker)
+
+ mockResult := &protocol.RPCResult{Rest: rest{tried: 0, success: true}}
+ invoker.EXPECT().IsAvailable().Return(true)
+ invoker.EXPECT().Invoke(gomock.Any()).Return(mockResult)
+
+ result := clusterInvoker.Invoke(&invocation.RPCInvocation{})
+
+ assert.Equal(t, mockResult, result)
+}
+
+func TestAvailableClusterInvokerNoAvail(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+
+ invoker := mock.NewMockInvoker(ctrl)
+ clusterInvoker := registerAvailable(t, invoker)
+
+ invoker.EXPECT().IsAvailable().Return(false)
+
+ result := clusterInvoker.Invoke(&invocation.RPCInvocation{})
+
+ assert.NotNil(t, result.Error())
+ assert.True(t, strings.Contains(result.Error().Error(), "no provider available"))
+ assert.Nil(t, result.Result())
+}
diff --git a/cluster/cluster_impl/broadcast_cluster.go b/cluster/cluster_impl/broadcast_cluster.go
new file mode 100644
index 0000000000000000000000000000000000000000..50aae3cfab8d67570b50dcab4e53bbfad29d6d30
--- /dev/null
+++ b/cluster/cluster_impl/broadcast_cluster.go
@@ -0,0 +1,40 @@
+/*
+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 cluster_impl
+
+import (
+ "github.com/apache/dubbo-go/cluster"
+ "github.com/apache/dubbo-go/common/extension"
+ "github.com/apache/dubbo-go/protocol"
+)
+
+type broadcastCluster struct{}
+
+const broadcast = "broadcast"
+
+func init() {
+ extension.SetCluster(broadcast, NewBroadcastCluster)
+}
+
+func NewBroadcastCluster() cluster.Cluster {
+ return &broadcastCluster{}
+}
+
+func (cluster *broadcastCluster) Join(directory cluster.Directory) protocol.Invoker {
+ return newBroadcastClusterInvoker(directory)
+}
diff --git a/cluster/cluster_impl/broadcast_cluster_invoker.go b/cluster/cluster_impl/broadcast_cluster_invoker.go
new file mode 100644
index 0000000000000000000000000000000000000000..238df0acfa7fb946e38bfbfd490bce7c0bb34e60
--- /dev/null
+++ b/cluster/cluster_impl/broadcast_cluster_invoker.go
@@ -0,0 +1,59 @@
+/*
+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 cluster_impl
+
+import (
+ "github.com/apache/dubbo-go/cluster"
+ "github.com/apache/dubbo-go/common/logger"
+ "github.com/apache/dubbo-go/protocol"
+)
+
+type broadcastClusterInvoker struct {
+ baseClusterInvoker
+}
+
+func newBroadcastClusterInvoker(directory cluster.Directory) protocol.Invoker {
+ return &broadcastClusterInvoker{
+ baseClusterInvoker: newBaseClusterInvoker(directory),
+ }
+}
+
+func (invoker *broadcastClusterInvoker) Invoke(invocation protocol.Invocation) protocol.Result {
+ invokers := invoker.directory.List(invocation)
+ err := invoker.checkInvokers(invokers, invocation)
+ if err != nil {
+ return &protocol.RPCResult{Err: err}
+ }
+ err = invoker.checkWhetherDestroyed()
+ if err != nil {
+ return &protocol.RPCResult{Err: err}
+ }
+
+ var result protocol.Result
+ for _, ivk := range invokers {
+ result = ivk.Invoke(invocation)
+ if result.Error() != nil {
+ logger.Warnf("broadcast invoker invoke err: %v when use invoker: %v\n", result.Error(), ivk)
+ err = result.Error()
+ }
+ }
+ if err != nil {
+ return &protocol.RPCResult{Err: err}
+ }
+ return result
+}
diff --git a/cluster/cluster_impl/broadcast_cluster_invoker_test.go b/cluster/cluster_impl/broadcast_cluster_invoker_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..565684a8ae25c648ff77aef71d2ced0665202fe7
--- /dev/null
+++ b/cluster/cluster_impl/broadcast_cluster_invoker_test.go
@@ -0,0 +1,109 @@
+/*
+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 cluster_impl
+
+import (
+ "context"
+ "errors"
+ "testing"
+)
+
+import (
+ "github.com/golang/mock/gomock"
+ "github.com/stretchr/testify/assert"
+)
+
+import (
+ "github.com/apache/dubbo-go/cluster/directory"
+ "github.com/apache/dubbo-go/cluster/loadbalance"
+ "github.com/apache/dubbo-go/common"
+ "github.com/apache/dubbo-go/common/extension"
+ "github.com/apache/dubbo-go/protocol"
+ "github.com/apache/dubbo-go/protocol/invocation"
+ "github.com/apache/dubbo-go/protocol/mock"
+)
+
+var (
+ broadcastUrl, _ = common.NewURL(context.TODO(), "dubbo://192.168.1.1:20000/com.ikurento.user.UserProvider")
+)
+
+func registerBroadcast(t *testing.T, mockInvokers ...*mock.MockInvoker) protocol.Invoker {
+ extension.SetLoadbalance("random", loadbalance.NewRandomLoadBalance)
+
+ invokers := []protocol.Invoker{}
+ for i, ivk := range mockInvokers {
+ invokers = append(invokers, ivk)
+ if i == 0 {
+ ivk.EXPECT().GetUrl().Return(broadcastUrl)
+ }
+ }
+ staticDir := directory.NewStaticDirectory(invokers)
+
+ broadcastCluster := NewBroadcastCluster()
+ clusterInvoker := broadcastCluster.Join(staticDir)
+ return clusterInvoker
+}
+
+func Test_BroadcastInvokeSuccess(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+
+ invokers := make([]*mock.MockInvoker, 0)
+
+ mockResult := &protocol.RPCResult{Rest: rest{tried: 0, success: true}}
+ for i := 0; i < 3; i++ {
+ invoker := mock.NewMockInvoker(ctrl)
+ invokers = append(invokers, invoker)
+ invoker.EXPECT().Invoke(gomock.Any()).Return(mockResult)
+ }
+
+ clusterInvoker := registerBroadcast(t, invokers...)
+
+ result := clusterInvoker.Invoke(&invocation.RPCInvocation{})
+ assert.Equal(t, mockResult, result)
+}
+
+func Test_BroadcastInvokeFailed(t *testing.T) {
+ ctrl := gomock.NewController(t)
+ defer ctrl.Finish()
+
+ invokers := make([]*mock.MockInvoker, 0)
+
+ mockResult := &protocol.RPCResult{Rest: rest{tried: 0, success: true}}
+ mockFailedResult := &protocol.RPCResult{Err: errors.New("just failed")}
+ for i := 0; i < 10; i++ {
+ invoker := mock.NewMockInvoker(ctrl)
+ invokers = append(invokers, invoker)
+ invoker.EXPECT().Invoke(gomock.Any()).Return(mockResult)
+ }
+ {
+ invoker := mock.NewMockInvoker(ctrl)
+ invokers = append(invokers, invoker)
+ invoker.EXPECT().Invoke(gomock.Any()).Return(mockFailedResult)
+ }
+ for i := 0; i < 10; i++ {
+ invoker := mock.NewMockInvoker(ctrl)
+ invokers = append(invokers, invoker)
+ invoker.EXPECT().Invoke(gomock.Any()).Return(mockResult)
+ }
+
+ clusterInvoker := registerBroadcast(t, invokers...)
+
+ result := clusterInvoker.Invoke(&invocation.RPCInvocation{})
+ assert.Equal(t, mockFailedResult.Err, result.Error())
+}
diff --git a/cluster/cluster_impl/failback_cluster_invoker.go b/cluster/cluster_impl/failback_cluster_invoker.go
index 493b49104674abbdcda4e81723ff5ee4141220cf..027461ccb7f32d6383d756ac986295b6300f249c 100644
--- a/cluster/cluster_impl/failback_cluster_invoker.go
+++ b/cluster/cluster_impl/failback_cluster_invoker.go
@@ -131,7 +131,6 @@ func (invoker *failbackClusterInvoker) Invoke(invocation protocol.Invocation) pr
return &protocol.RPCResult{}
}
url := invokers[0].GetUrl()
-
methodName := invocation.MethodName()
//Get the service loadbalance config
lb := url.GetParam(constant.LOADBALANCE_KEY, constant.DEFAULT_LOADBALANCE)
@@ -146,7 +145,6 @@ func (invoker *failbackClusterInvoker) Invoke(invocation protocol.Invocation) pr
var result protocol.Result
ivk := invoker.doSelect(loadbalance, invocation, invokers, invoked)
- invoked = append(invoked, ivk)
//DO INVOKE
result = ivk.Invoke(invocation)
if result.Error() != nil {
@@ -177,7 +175,9 @@ func (invoker *failbackClusterInvoker) Destroy() {
invoker.baseClusterInvoker.Destroy()
// stop ticker
- invoker.ticker.Stop()
+ if invoker.ticker != nil {
+ invoker.ticker.Stop()
+ }
_ = invoker.taskList.Dispose()
}
diff --git a/cluster/cluster_impl/failover_cluster_test.go b/cluster/cluster_impl/failover_cluster_test.go
index cc533ea098ee76488d2f76cbbe601b275274db83..dc039db8de41ab6722b20f99c5a0c5536a42a7e6 100644
--- a/cluster/cluster_impl/failover_cluster_test.go
+++ b/cluster/cluster_impl/failover_cluster_test.go
@@ -143,8 +143,7 @@ func Test_FailoverInvoke2(t *testing.T) {
urlParams.Set(constant.RETRIES_KEY, "2")
urlParams.Set("methods.test."+constant.RETRIES_KEY, "3")
- ivc := &invocation.RPCInvocation{}
- ivc.SetMethod("test")
+ ivc := invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("test"))
result := normalInvoke(t, 3, urlParams, ivc)
assert.NoError(t, result.Error())
count = 0
diff --git a/cluster/cluster_impl/failsafe_cluster_invoker.go b/cluster/cluster_impl/failsafe_cluster_invoker.go
index 0a1da1bc49bfe01ffc20be2f4941ef752d026378..b95f997fef87cf466f07c4e506e41758e7998e52 100644
--- a/cluster/cluster_impl/failsafe_cluster_invoker.go
+++ b/cluster/cluster_impl/failsafe_cluster_invoker.go
@@ -64,7 +64,6 @@ func (invoker *failsafeClusterInvoker) Invoke(invocation protocol.Invocation) pr
var result protocol.Result
ivk := invoker.doSelect(loadbalance, invocation, invokers, invoked)
- invoked = append(invoked, ivk)
//DO INVOKE
result = ivk.Invoke(invocation)
if result.Error() != nil {
diff --git a/cluster/loadbalance/least_active_test.go b/cluster/loadbalance/least_active_test.go
index c29a2092a19161d0dd75ee4098ee786b620880b0..7663ea3ce6252dcb7ddeaea92fb6bef8d95478d5 100644
--- a/cluster/loadbalance/least_active_test.go
+++ b/cluster/loadbalance/least_active_test.go
@@ -43,8 +43,7 @@ func TestLeastActiveByWeight(t *testing.T) {
invokers = append(invokers, protocol.NewBaseInvoker(url))
}
- inv := new(invocation.RPCInvocation)
- inv.SetMethod("test")
+ inv := invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("test"))
protocol.BeginCount(invokers[2].GetUrl(), inv.MethodName())
loop = 10000
diff --git a/cluster/loadbalance/random_test.go b/cluster/loadbalance/random_test.go
index 09d3d259a903693e9c0550965fc12d2089228662..ffe65d78ac61e5210d23e44c7f802597fed78f96 100644
--- a/cluster/loadbalance/random_test.go
+++ b/cluster/loadbalance/random_test.go
@@ -67,8 +67,7 @@ func Test_RandomlbSelectWeight(t *testing.T) {
urlParams.Set("methods.test."+constant.WEIGHT_KEY, "10000000000000")
urll, _ := common.NewURL(context.TODO(), fmt.Sprintf("dubbo://192.168.1.100:20000/com.ikurento.user.UserProvider"), common.WithParams(urlParams))
invokers = append(invokers, protocol.NewBaseInvoker(urll))
- ivc := &invocation.RPCInvocation{}
- ivc.SetMethod("test")
+ ivc := invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("test"))
var selectedInvoker []protocol.Invoker
var selected float64
@@ -99,8 +98,7 @@ func Test_RandomlbSelectWarmup(t *testing.T) {
urlParams.Set(constant.REMOTE_TIMESTAMP_KEY, strconv.FormatInt(time.Now().Add(time.Minute*(-9)).Unix(), 10))
urll, _ := common.NewURL(context.TODO(), fmt.Sprintf("dubbo://192.168.1.100:20000/com.ikurento.user.UserProvider"), common.WithParams(urlParams))
invokers = append(invokers, protocol.NewBaseInvoker(urll))
- ivc := &invocation.RPCInvocation{}
- ivc.SetMethod("test")
+ ivc := invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("test"))
var selectedInvoker []protocol.Invoker
var selected float64
diff --git a/common/constant/default.go b/common/constant/default.go
index 0ee0aa24786bc4a0fac6178876154de4ac0784ed..d103c6aadc0f76d4c4d82fedb89ea2f21f5eb7aa 100644
--- a/common/constant/default.go
+++ b/common/constant/default.go
@@ -40,6 +40,8 @@ const (
PREFIX_DEFAULT_KEY = "default."
DEFAULT_SERVICE_FILTERS = "echo"
DEFAULT_REFERENCE_FILTERS = ""
+ GENERIC_REFERENCE_FILTERS = "generic"
+ GENERIC = "$invoke"
ECHO = "$echo"
)
diff --git a/common/constant/key.go b/common/constant/key.go
index 104380ae4dd99a55cf64fdeec76d9defc4f634b3..4d2664baf9b311f6ed8aa8e295599d7e8e5846c4 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -29,6 +29,8 @@ const (
SERVICE_KEY = "service"
METHODS_KEY = "methods"
TIMEOUT_KEY = "timeout"
+ BEAN_NAME_KEY = "bean.name"
+ GENERIC_KEY = "generic"
)
const (
diff --git a/common/logger/logger.go b/common/logger/logger.go
index e8dd5a608b68c7cbde0d8c6b85c1601c847fea01..f41e95744f954da69b0e3695c97ba3389c69160a 100644
--- a/common/logger/logger.go
+++ b/common/logger/logger.go
@@ -85,8 +85,6 @@ func InitLog(logConfFile string) error {
InitLogger(conf)
- // set getty log
- getty.SetLogger(logger)
return nil
}
@@ -112,9 +110,16 @@ func InitLogger(conf *zap.Config) {
}
zapLogger, _ := zapLoggerConfig.Build(zap.AddCallerSkip(1))
logger = zapLogger.Sugar()
+
+ // set getty log
+ getty.SetLogger(logger)
}
func SetLogger(log Logger) {
logger = log
getty.SetLogger(logger)
}
+
+func GetLogger() Logger {
+ return logger
+}
diff --git a/common/proxy/proxy.go b/common/proxy/proxy.go
index 96d42eb21152e64d170f50276bbce88e1bf8db69..1c079f6bca52bf8f6e8c5ebb168da82ab8ccb5f2 100644
--- a/common/proxy/proxy.go
+++ b/common/proxy/proxy.go
@@ -116,7 +116,9 @@ func (p *Proxy) Implement(v common.RPCService) {
}
}
- inv = invocation_impl.NewRPCInvocationForConsumer(methodName, nil, inArr, reply.Interface(), p.callBack, common.URL{}, nil)
+ inv = invocation_impl.NewRPCInvocationWithOptions(invocation_impl.WithMethodName(methodName),
+ invocation_impl.WithArguments(inArr), invocation_impl.WithReply(reply.Interface()),
+ invocation_impl.WithCallBack(p.callBack))
for k, value := range p.attachments {
inv.SetAttachments(k, value)
diff --git a/common/proxy/proxy_test.go b/common/proxy/proxy_test.go
index 1cc30457c3b021ec139b57fe764d6ac6b9104dbc..8c1c0295d05135095b5be35b5b2b16428691d7f2 100644
--- a/common/proxy/proxy_test.go
+++ b/common/proxy/proxy_test.go
@@ -43,21 +43,15 @@ type TestService struct {
Echo func(interface{}, *interface{}) error
}
-func (s *TestService) Service() string {
+func (s *TestService) Reference() string {
return "com.test.Path"
}
-func (s *TestService) Version() string {
- return ""
-}
type TestServiceInt int
-func (s *TestServiceInt) Service() string {
+func (s *TestServiceInt) Reference() string {
return "com.test.TestServiceInt"
}
-func (s *TestServiceInt) Version() string {
- return ""
-}
func TestProxy_Implement(t *testing.T) {
diff --git a/common/rpc_service.go b/common/rpc_service.go
index 0444f0c17e7e9d96d1563c72fde2fd62b81fb744..4741a6fa3c0daef97f044f639a5e64a38fe4a187 100644
--- a/common/rpc_service.go
+++ b/common/rpc_service.go
@@ -36,8 +36,7 @@ import (
// rpc service interface
type RPCService interface {
- Service() string // Path InterfaceName
- Version() string
+ Reference() string // rpc service id or reference id
}
// for lowercase func
@@ -149,7 +148,7 @@ func (sm *serviceMap) Register(protocol string, rcvr RPCService) (string, error)
return "", perrors.New(s)
}
- sname = rcvr.Service()
+ sname = rcvr.Reference()
if server := sm.GetService(protocol, sname); server != nil {
return "", perrors.New("service already defined: " + sname)
}
@@ -172,8 +171,8 @@ func (sm *serviceMap) Register(protocol string, rcvr RPCService) (string, error)
return strings.TrimSuffix(methods, ","), nil
}
-func (sm *serviceMap) UnRegister(protocol, serviceName string) error {
- if protocol == "" || serviceName == "" {
+func (sm *serviceMap) UnRegister(protocol, serviceId string) error {
+ if protocol == "" || serviceId == "" {
return perrors.New("protocol or serviceName is nil")
}
sm.mutex.RLock()
@@ -182,16 +181,16 @@ func (sm *serviceMap) UnRegister(protocol, serviceName string) error {
sm.mutex.RUnlock()
return perrors.New("no services for " + protocol)
}
- _, ok = svcs[serviceName]
+ _, ok = svcs[serviceId]
if !ok {
sm.mutex.RUnlock()
- return perrors.New("no service for " + serviceName)
+ return perrors.New("no service for " + serviceId)
}
sm.mutex.RUnlock()
sm.mutex.Lock()
defer sm.mutex.Unlock()
- delete(svcs, serviceName)
+ delete(svcs, serviceId)
delete(sm.serviceMap, protocol)
return nil
diff --git a/common/rpc_service_test.go b/common/rpc_service_test.go
index 4232c9d90bee5a48ed988fa5449c3acbaf64f100..7df039b905d3cc064c5d6d9404fc874cf693dac9 100644
--- a/common/rpc_service_test.go
+++ b/common/rpc_service_test.go
@@ -39,12 +39,9 @@ func (s *TestService) MethodTwo(arg1, arg2, arg3 interface{}) (interface{}, erro
func (s *TestService) MethodThree() error {
return nil
}
-func (s *TestService) Service() string {
+func (s *TestService) Reference() string {
return "com.test.Path"
}
-func (s *TestService) Version() string {
- return ""
-}
func (s *TestService) MethodMapper() map[string]string {
return map[string]string{
"MethodTwo": "methodTwo",
@@ -65,22 +62,16 @@ func (s *testService) Method3(ctx context.Context, args []interface{}, rsp *stru
func (s *testService) Method4(ctx context.Context, args []interface{}, rsp *struct{}) *testService {
return nil
}
-func (s *testService) Service() string {
+func (s *testService) Reference() string {
return "com.test.Path"
}
-func (s *testService) Version() string {
- return ""
-}
type TestService1 struct {
}
-func (s *TestService1) Service() string {
+func (s *TestService1) Reference() string {
return "com.test.Path1"
}
-func (s *TestService1) Version() string {
- return ""
-}
func TestServiceMap_Register(t *testing.T) {
// lowercase
@@ -181,7 +172,7 @@ func TestSuiteMethod(t *testing.T) {
// wrong number of in return
s1 := &testService{}
- method, ok = reflect.TypeOf(s1).MethodByName("Version")
+ method, ok = reflect.TypeOf(s1).MethodByName("Reference")
assert.True(t, ok)
methodType = suiteMethod(method)
assert.Nil(t, methodType)
diff --git a/common/url.go b/common/url.go
index 47b44cf57feb9cc9eadb18e597a935073918fe99..c594df235134d71d98b83c11b2f6eb9312283aae 100644
--- a/common/url.go
+++ b/common/url.go
@@ -136,6 +136,11 @@ func WithPath(path string) option {
}
}
+func WithLocation(location string) option {
+ return func(url *URL) {
+ url.Location = location
+ }
+}
func NewURLWithOptions(opts ...option) *URL {
url := &URL{}
for _, opt := range opts {
diff --git a/config/base_config.go b/config/base_config.go
index 19acea2fd6c738734734467daed7fb838bccdffd..54ad8aba368c7d9477faad6fbd97c5dccd32dca1 100644
--- a/config/base_config.go
+++ b/config/base_config.go
@@ -107,7 +107,8 @@ func setFieldValue(val reflect.Value, id reflect.Value, config *config.InmemoryC
setBaseValue := func(f reflect.Value) {
ok, value := config.GetProperty(getKeyPrefix(val, id) + key)
if ok {
- if f.Kind() == reflect.Int64 {
+ switch f.Kind() {
+ case reflect.Int64:
x, err := strconv.Atoi(value)
if err != nil {
logger.Errorf("Dynamic change the configuration in struct {%v} field {%v} error ,error message is {%v}",
@@ -120,21 +121,16 @@ func setFieldValue(val reflect.Value, id reflect.Value, config *config.InmemoryC
val.Type().Name(), val.Type().Field(i).Name, perrors.Errorf("the int64 value {%v} from config center is overflow", int64(x)))
}
}
-
- }
-
- if f.Kind() == reflect.String {
+ case reflect.String:
f.SetString(value)
- }
- if f.Kind() == reflect.Bool {
+ case reflect.Bool:
x, err := strconv.ParseBool(value)
if err != nil {
logger.Errorf("Dynamic change the configuration in struct {%v} field {%v} error ,error message is {%v}",
val.Type().Name(), val.Type().Field(i).Name, err)
}
f.SetBool(x)
- }
- if f.Kind() == reflect.Float64 {
+ case reflect.Float64:
x, err := strconv.ParseFloat(value, 64)
if err != nil {
logger.Errorf("Dynamic change the configuration in struct {%v} field {%v} error ,error message is {%v}",
@@ -147,7 +143,10 @@ func setFieldValue(val reflect.Value, id reflect.Value, config *config.InmemoryC
val.Type().Name(), val.Type().Field(i).Name, perrors.Errorf("the float64 value {%v} from config center is overflow", x))
}
}
+ default:
+ logger.Warnf("The kind of field {%v} is not supported ", f.Kind().String())
}
+
}
}
@@ -180,25 +179,32 @@ func setFieldValue(val reflect.Value, id reflect.Value, config *config.InmemoryC
}
if f.Kind() == reflect.Map {
- //initiate config
- s := reflect.New(f.Type().Elem().Elem())
- prefix := s.MethodByName("Prefix").Call(nil)[0].String()
- m := config.GetSubProperty(prefix)
- for k := range m {
- f.SetMapIndex(reflect.ValueOf(k), reflect.New(f.Type().Elem().Elem()))
+ if f.Type().Elem().Kind() == reflect.Ptr {
+ //initiate config
+ s := reflect.New(f.Type().Elem().Elem())
+ prefix := s.MethodByName("Prefix").Call(nil)[0].String()
+ m := config.GetSubProperty(prefix)
+ for k := range m {
+ f.SetMapIndex(reflect.ValueOf(k), reflect.New(f.Type().Elem().Elem()))
+ }
}
+
//iter := f.MapRange()
for _, k := range f.MapKeys() {
v := f.MapIndex(k)
- if v.Kind() == reflect.Ptr {
+ switch v.Kind() {
+ case reflect.Ptr:
if v.Elem().Kind() == reflect.Struct {
setFieldValue(v.Elem(), k, config)
} else {
setBaseValue(v.Elem())
}
+ case reflect.Int64, reflect.String, reflect.Bool, reflect.Float64:
+ setBaseValue(v)
+ default:
+ logger.Warnf("The kind of field {%v} is not supported ", v.Kind().String())
}
-
}
}
diff --git a/config/base_config_test.go b/config/base_config_test.go
index 7676a11d025975b604ce3c493e7462a4bdba23f1..d07d983f64ed33fcac73f8430737dfb2f01c40c3 100644
--- a/config/base_config_test.go
+++ b/config/base_config_test.go
@@ -35,8 +35,8 @@ func Test_refresh(t *testing.T) {
c := &BaseConfig{}
mockMap := map[string]string{}
mockMap["dubbo.registries.shanghai_reg1.protocol"] = "mock100"
- mockMap["dubbo.reference.MockService.MockService.retries"] = "10"
- mockMap["dubbo.MockService.MockService.GetUser.retries"] = "10"
+ mockMap["dubbo.reference.com.MockService.MockService.retries"] = "10"
+ mockMap["dubbo.com.MockService.MockService.GetUser.retries"] = "10"
mockMap["dubbo.consumer.check"] = "false"
mockMap["dubbo.application.name"] = "dubbo"
@@ -88,7 +88,7 @@ func Test_refresh(t *testing.T) {
},
References: map[string]*ReferenceConfig{
"MockService": {
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Protocol: "mock",
Cluster: "failover",
Loadbalance: "random",
@@ -98,13 +98,14 @@ func Test_refresh(t *testing.T) {
Methods: []*MethodConfig{
{
InterfaceId: "MockService",
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Name: "GetUser",
Retries: 2,
Loadbalance: "random",
},
- {InterfaceId: "MockService",
- InterfaceName: "MockService",
+ {
+ InterfaceId: "MockService",
+ InterfaceName: "com.MockService",
Name: "GetUser1",
Retries: 2,
Loadbalance: "random",
@@ -128,8 +129,8 @@ func Test_refreshProvider(t *testing.T) {
c := &BaseConfig{}
mockMap := map[string]string{}
mockMap["dubbo.registries.shanghai_reg1.protocol"] = "mock100"
- mockMap["dubbo.service.MockService.MockService.retries"] = "10"
- mockMap["dubbo.MockService.MockService.GetUser.retries"] = "10"
+ mockMap["dubbo.service.com.MockService.MockService.retries"] = "10"
+ mockMap["dubbo.com.MockService.MockService.GetUser.retries"] = "10"
mockMap["dubbo.consumer.check"] = "false"
mockMap["dubbo.application.name"] = "dubbo"
mockMap["dubbo.protocols.jsonrpc1.name"] = "jsonrpc"
@@ -183,7 +184,7 @@ func Test_refreshProvider(t *testing.T) {
},
Services: map[string]*ServiceConfig{
"MockService": {
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Protocol: "mock",
Cluster: "failover",
Loadbalance: "random",
@@ -193,13 +194,13 @@ func Test_refreshProvider(t *testing.T) {
Methods: []*MethodConfig{
{
InterfaceId: "MockService",
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Name: "GetUser",
Retries: 2,
Loadbalance: "random",
},
{InterfaceId: "MockService",
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Name: "GetUser1",
Retries: 2,
Loadbalance: "random",
diff --git a/config/config_loader.go b/config/config_loader.go
index 86260c86734d88527ab03fede8286dd484953ba3..720f65f5de6b24b445b7ce07dd2daaba0a856681 100644
--- a/config/config_loader.go
+++ b/config/config_loader.go
@@ -46,11 +46,11 @@ func init() {
confConFile = os.Getenv(constant.CONF_CONSUMER_FILE_PATH)
confProFile = os.Getenv(constant.CONF_PROVIDER_FILE_PATH)
- if errCon := consumerInit(confConFile); errCon != nil {
+ if errCon := ConsumerInit(confConFile); errCon != nil {
log.Printf("[consumerInit] %#v", errCon)
consumerConfig = nil
}
- if errPro := providerInit(confProFile); errPro != nil {
+ if errPro := ProviderInit(confProFile); errPro != nil {
log.Printf("[providerInit] %#v", errPro)
providerConfig = nil
}
@@ -58,11 +58,6 @@ func init() {
// Dubbo Init
func Load() {
- var (
- refMap map[string]*ReferenceConfig
- srvMap map[string]*ServiceConfig
- )
-
// reference config
if consumerConfig == nil {
logger.Warnf("consumerConfig is nil!")
@@ -70,18 +65,20 @@ func Load() {
if err := configCenterRefreshConsumer(); err != nil {
logger.Errorf("[consumer config center refresh] %#v", err)
}
- refMap = make(map[string]*ReferenceConfig)
- for _, ref := range consumerConfig.References {
- rpcService := GetConsumerService(ref.InterfaceName)
+ for key, ref := range consumerConfig.References {
+ if ref.Generic {
+ genericService := NewGenericService(key)
+ SetConsumerService(genericService)
+ }
+ rpcService := GetConsumerService(key)
if rpcService == nil {
- logger.Warnf("%s is not exsist!", ref.InterfaceName)
+ logger.Warnf("%s is not exsist!", key)
continue
}
+ ref.id = key
ref.Refer()
ref.Implement(rpcService)
- refMap[ref.InterfaceName] = ref
-
}
//wait for invoker is available, if wait over default 3s, then panic
var count int
@@ -121,18 +118,17 @@ func Load() {
if err := configCenterRefreshProvider(); err != nil {
logger.Errorf("[provider config center refresh] %#v", err)
}
- srvMap = make(map[string]*ServiceConfig)
- for _, svs := range providerConfig.Services {
- rpcService := GetProviderService(svs.InterfaceName)
+ for key, svs := range providerConfig.Services {
+ rpcService := GetProviderService(key)
if rpcService == nil {
- logger.Warnf("%s is not exsist!", svs.InterfaceName)
+ logger.Warnf("%s is not exsist!", key)
continue
}
+ svs.id = key
svs.Implement(rpcService)
if err := svs.Export(); err != nil {
- panic(fmt.Sprintf("service %s export failed! ", svs.InterfaceName))
+ panic(fmt.Sprintf("service %s export failed! ", key))
}
- srvMap[svs.InterfaceName] = svs
}
}
}
@@ -144,5 +140,5 @@ func GetRPCService(name string) common.RPCService {
// create rpc service for consumer
func RPCService(service common.RPCService) {
- providerConfig.Services[service.Service()].Implement(service)
+ consumerConfig.References[service.Reference()].Implement(service)
}
diff --git a/config/config_loader_test.go b/config/config_loader_test.go
index 6e9689c76322686fff0fab585dc08436a07cd55c..107fea0b1d737f7be92d3e0042b6eebb7add78ed 100644
--- a/config/config_loader_test.go
+++ b/config/config_loader_test.go
@@ -45,15 +45,16 @@ func TestConfigLoader(t *testing.T) {
assert.Nil(t, providerConfig)
assert.Equal(t, ProviderConfig{}, GetProviderConfig())
- err = consumerInit(conPath)
+ err = ConsumerInit(conPath)
assert.NoError(t, err)
- err = providerInit(proPath)
+ err = ProviderInit(proPath)
assert.NoError(t, err)
assert.NotNil(t, consumerConfig)
assert.NotEqual(t, ConsumerConfig{}, GetConsumerConfig())
assert.NotNil(t, providerConfig)
assert.NotEqual(t, ProviderConfig{}, GetProviderConfig())
+ assert.Equal(t, "soa.com.ikurento.user.UserProvider", GetConsumerConfig().References["UserProvider"].Params["serviceid"])
}
func TestLoad(t *testing.T) {
@@ -70,12 +71,12 @@ func TestLoad(t *testing.T) {
Load()
- assert.Equal(t, ms, GetRPCService(ms.Service()))
+ assert.Equal(t, ms, GetRPCService(ms.Reference()))
ms2 := &struct {
MockService
}{}
RPCService(ms2)
- assert.NotEqual(t, ms2, GetRPCService(ms2.Service()))
+ assert.NotEqual(t, ms2, GetRPCService(ms2.Reference()))
conServices = map[string]common.RPCService{}
proServices = map[string]common.RPCService{}
@@ -83,6 +84,7 @@ func TestLoad(t *testing.T) {
consumerConfig = nil
providerConfig = nil
}
+
func TestWithNoRegLoad(t *testing.T) {
doInit()
doinit()
@@ -98,12 +100,12 @@ func TestWithNoRegLoad(t *testing.T) {
Load()
- assert.Equal(t, ms, GetRPCService(ms.Service()))
+ assert.Equal(t, ms, GetRPCService(ms.Reference()))
ms2 := &struct {
MockService
}{}
RPCService(ms2)
- assert.NotEqual(t, ms2, GetRPCService(ms2.Service()))
+ assert.NotEqual(t, ms2, GetRPCService(ms2.Reference()))
conServices = map[string]common.RPCService{}
proServices = map[string]common.RPCService{}
@@ -111,6 +113,7 @@ func TestWithNoRegLoad(t *testing.T) {
consumerConfig = nil
providerConfig = nil
}
+
func TestConfigLoaderWithConfigCenter(t *testing.T) {
extension.SetConfigCenterFactory("mock", func() config_center.DynamicConfigurationFactory {
return &config_center.MockDynamicConfigurationFactory{}
@@ -126,10 +129,10 @@ func TestConfigLoaderWithConfigCenter(t *testing.T) {
assert.Nil(t, providerConfig)
assert.Equal(t, ProviderConfig{}, GetProviderConfig())
- err = consumerInit(conPath)
+ err = ConsumerInit(conPath)
configCenterRefreshConsumer()
assert.NoError(t, err)
- err = providerInit(proPath)
+ err = ProviderInit(proPath)
configCenterRefreshProvider()
assert.NoError(t, err)
diff --git a/config/consumer_config.go b/config/consumer_config.go
index 5d3aec18e91ab3d9284c00fac3838d16414f2755..737339a0ad195201327eb4fac3445b18eb4bbf26 100644
--- a/config/consumer_config.go
+++ b/config/consumer_config.go
@@ -61,6 +61,7 @@ func (*ConsumerConfig) Prefix() string {
func SetConsumerConfig(c ConsumerConfig) {
consumerConfig = &c
}
+
func GetConsumerConfig() ConsumerConfig {
if consumerConfig == nil {
logger.Warnf("consumerConfig is nil!")
@@ -69,7 +70,7 @@ func GetConsumerConfig() ConsumerConfig {
return *consumerConfig
}
-func consumerInit(confConFile string) error {
+func ConsumerInit(confConFile string) error {
if confConFile == "" {
return perrors.Errorf("application configure(consumer) file name is nil")
}
diff --git a/config/generic_service.go b/config/generic_service.go
new file mode 100644
index 0000000000000000000000000000000000000000..8a4e88df9788554bc4a5ee33884166e4ccede37f
--- /dev/null
+++ b/config/generic_service.go
@@ -0,0 +1,30 @@
+/*
+ * 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 config
+
+type GenericService struct {
+ Invoke func(req []interface{}) (interface{}, error) `dubbo:"$invoke"`
+ referenceStr string
+}
+
+func NewGenericService(referenceStr string) *GenericService {
+ return &GenericService{referenceStr: referenceStr}
+}
+
+func (u *GenericService) Reference() string {
+ return u.referenceStr
+}
diff --git a/config/mock_rpcservice.go b/config/mock_rpcservice.go
index 0b3b9f22b497c66067eff5969b8dca044a34735a..64d431ffb6dfbc7e25a988c6093cf0ab5cbd2db5 100644
--- a/config/mock_rpcservice.go
+++ b/config/mock_rpcservice.go
@@ -23,14 +23,10 @@ import (
type MockService struct{}
-func (*MockService) Service() string {
+func (*MockService) Reference() string {
return "MockService"
}
-func (*MockService) Version() string {
- return "1.0"
-}
-
func (*MockService) GetUser(ctx context.Context, itf []interface{}, str *struct{}) error {
return nil
}
diff --git a/config/provider_config.go b/config/provider_config.go
index fc7a4d50d2ede6c3a64dade9c90914e3b5d51779..a504eea237dc47f66c4ed27d334ce5eea5c87d45 100644
--- a/config/provider_config.go
+++ b/config/provider_config.go
@@ -63,7 +63,7 @@ func GetProviderConfig() ProviderConfig {
return *providerConfig
}
-func providerInit(confProFile string) error {
+func ProviderInit(confProFile string) error {
if len(confProFile) == 0 {
return perrors.Errorf("application configure(provider) file name is nil")
}
diff --git a/config/reference_config.go b/config/reference_config.go
index 2c38d8aa4aa31576c94724d4537aa752df2fb96c..67a4a3d816060475fa49182f7141aba9807849e1 100644
--- a/config/reference_config.go
+++ b/config/reference_config.go
@@ -38,29 +38,33 @@ import (
type ReferenceConfig struct {
context context.Context
pxy *proxy.Proxy
- InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"`
- Check *bool `yaml:"check" json:"check,omitempty" property:"check"`
- Url string `yaml:"url" json:"url,omitempty" property:"url"`
- Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
- Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
- Registry string `yaml:"registry" json:"registry,omitempty" property:"registry"`
- Cluster string `yaml:"cluster" json:"cluster,omitempty" property:"cluster"`
- Loadbalance string `yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
- Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"`
- Group string `yaml:"group" json:"group,omitempty" property:"group"`
- Version string `yaml:"version" json:"version,omitempty" property:"version"`
- Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"`
- async bool `yaml:"async" json:"async,omitempty" property:"async"`
+ id string
+ InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"`
+ Check *bool `yaml:"check" json:"check,omitempty" property:"check"`
+ Url string `yaml:"url" json:"url,omitempty" property:"url"`
+ Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
+ Protocol string `yaml:"protocol" json:"protocol,omitempty" property:"protocol"`
+ Registry string `yaml:"registry" json:"registry,omitempty" property:"registry"`
+ Cluster string `yaml:"cluster" json:"cluster,omitempty" property:"cluster"`
+ Loadbalance string `yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
+ Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"`
+ Group string `yaml:"group" json:"group,omitempty" property:"group"`
+ Version string `yaml:"version" json:"version,omitempty" property:"version"`
+ Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"`
+ async bool `yaml:"async" json:"async,omitempty" property:"async"`
+ Params map[string]string `yaml:"params" json:"params,omitempty" property:"params"`
invoker protocol.Invoker
urls []*common.URL
+ Generic bool `yaml:"generic" json:"generic,omitempty" property:"generic"`
}
func (c *ReferenceConfig) Prefix() string {
return constant.ReferenceConfigPrefix + c.InterfaceName + "."
}
-func NewReferenceConfig(ctx context.Context) *ReferenceConfig {
- return &ReferenceConfig{context: ctx}
+// The only way to get a new ReferenceConfig
+func NewReferenceConfig(id string, ctx context.Context) *ReferenceConfig {
+ return &ReferenceConfig{id: id, context: ctx}
}
func (refconfig *ReferenceConfig) UnmarshalYAML(unmarshal func(interface{}) error) error {
@@ -75,7 +79,7 @@ func (refconfig *ReferenceConfig) UnmarshalYAML(unmarshal func(interface{}) erro
}
func (refconfig *ReferenceConfig) Refer() {
- url := common.NewURLWithOptions(common.WithPath(refconfig.InterfaceName), common.WithProtocol(refconfig.Protocol), common.WithParams(refconfig.getUrlMap()))
+ url := common.NewURLWithOptions(common.WithPath(refconfig.id), common.WithProtocol(refconfig.Protocol), common.WithParams(refconfig.getUrlMap()))
//1. user specified URL, could be peer-to-peer address, or register center's address.
if refconfig.Url != "" {
@@ -90,7 +94,7 @@ func (refconfig *ReferenceConfig) Refer() {
refconfig.urls = append(refconfig.urls, &serviceUrl)
} else {
if serviceUrl.Path == "" {
- serviceUrl.Path = "/" + refconfig.InterfaceName
+ serviceUrl.Path = "/" + refconfig.id
}
// merge url need to do
newUrl := common.MergeUrl(serviceUrl, url)
@@ -107,7 +111,6 @@ func (refconfig *ReferenceConfig) Refer() {
regUrl.SubURL = url
}
}
-
if len(refconfig.urls) == 1 {
refconfig.invoker = extension.GetProtocol(refconfig.urls[0].Protocol).Refer(*refconfig.urls[0])
} else {
@@ -143,6 +146,10 @@ func (refconfig *ReferenceConfig) GetRPCService() common.RPCService {
func (refconfig *ReferenceConfig) getUrlMap() url.Values {
urlMap := url.Values{}
+ //first set user params
+ for k, v := range refconfig.Params {
+ urlMap.Set(k, v)
+ }
urlMap.Set(constant.INTERFACE_KEY, refconfig.InterfaceName)
urlMap.Set(constant.TIMESTAMP_KEY, strconv.FormatInt(time.Now().Unix(), 10))
urlMap.Set(constant.CLUSTER_KEY, refconfig.Cluster)
@@ -150,6 +157,7 @@ func (refconfig *ReferenceConfig) getUrlMap() url.Values {
urlMap.Set(constant.RETRIES_KEY, strconv.FormatInt(refconfig.Retries, 10))
urlMap.Set(constant.GROUP_KEY, refconfig.Group)
urlMap.Set(constant.VERSION_KEY, refconfig.Version)
+ urlMap.Set(constant.GENERIC_KEY, strconv.FormatBool(refconfig.Generic))
//getty invoke async or sync
urlMap.Set(constant.ASYNC_KEY, strconv.FormatBool(refconfig.async))
@@ -163,7 +171,11 @@ func (refconfig *ReferenceConfig) getUrlMap() url.Values {
urlMap.Set(constant.ENVIRONMENT_KEY, consumerConfig.ApplicationConfig.Environment)
//filter
- urlMap.Set(constant.REFERENCE_FILTER_KEY, mergeValue(consumerConfig.Filter, refconfig.Filter, constant.DEFAULT_REFERENCE_FILTERS))
+ var defaultReferenceFilter = constant.DEFAULT_REFERENCE_FILTERS
+ if refconfig.Generic {
+ defaultReferenceFilter = constant.GENERIC_REFERENCE_FILTERS + defaultReferenceFilter
+ }
+ urlMap.Set(constant.REFERENCE_FILTER_KEY, mergeValue(consumerConfig.Filter, refconfig.Filter, defaultReferenceFilter))
for _, v := range refconfig.Methods {
urlMap.Set("methods."+v.Name+"."+constant.LOADBALANCE_KEY, v.Loadbalance)
@@ -173,3 +185,11 @@ func (refconfig *ReferenceConfig) getUrlMap() url.Values {
return urlMap
}
+func (refconfig *ReferenceConfig) GenericLoad(id string) {
+ genericService := NewGenericService(refconfig.id)
+ SetConsumerService(genericService)
+ refconfig.id = id
+ refconfig.Refer()
+ refconfig.Implement(genericService)
+ return
+}
diff --git a/config/reference_config_test.go b/config/reference_config_test.go
index c41e2a16de1cdc347d204cfae9d36b0b54f12808..296cde65fad6017b930ef06e0045a45b4af27c86 100644
--- a/config/reference_config_test.go
+++ b/config/reference_config_test.go
@@ -80,8 +80,11 @@ func doInit() {
},
References: map[string]*ReferenceConfig{
"MockService": {
+ Params: map[string]string{
+ "serviceid": "soa.mock",
+ },
Registry: "shanghai_reg1,shanghai_reg2,hangzhou_reg1,hangzhou_reg2",
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Protocol: "mock",
Cluster: "failover",
Loadbalance: "random",
@@ -125,6 +128,7 @@ func Test_Refer(t *testing.T) {
for _, reference := range consumerConfig.References {
reference.Refer()
+ assert.Equal(t, "soa.mock", reference.Params["serviceid"])
assert.NotNil(t, reference.invoker)
assert.NotNil(t, reference.pxy)
}
@@ -143,6 +147,7 @@ func Test_ReferP2P(t *testing.T) {
}
consumerConfig = nil
}
+
func Test_ReferMultiP2P(t *testing.T) {
doInit()
extension.SetProtocol("dubbo", GetProtocol)
diff --git a/config/registry_config.go b/config/registry_config.go
index 1a926b459e598ff313e141a39956dc88cb3daad3..3d54c348aadd2a2f836849d12e50887c36909d31 100644
--- a/config/registry_config.go
+++ b/config/registry_config.go
@@ -68,13 +68,28 @@ func loadRegistries(targetRegistries string, registries map[string]*RegistryConf
}
if target {
- url, err := common.NewURL(
- context.TODO(),
- constant.REGISTRY_PROTOCOL+"://"+registryConf.Address,
- common.WithParams(registryConf.getUrlMap(roleType)),
- common.WithUsername(registryConf.Username),
- common.WithPassword(registryConf.Password),
+ var (
+ url common.URL
+ err error
)
+ if addresses := strings.Split(registryConf.Address, ","); len(addresses) > 1 {
+ url, err = common.NewURL(
+ context.Background(),
+ constant.REGISTRY_PROTOCOL+"://"+addresses[0],
+ common.WithParams(registryConf.getUrlMap(roleType)),
+ common.WithUsername(registryConf.Username),
+ common.WithPassword(registryConf.Password),
+ common.WithLocation(registryConf.Address),
+ )
+ } else {
+ url, err = common.NewURL(
+ context.Background(),
+ constant.REGISTRY_PROTOCOL+"://"+registryConf.Address,
+ common.WithParams(registryConf.getUrlMap(roleType)),
+ common.WithUsername(registryConf.Username),
+ common.WithPassword(registryConf.Password),
+ )
+ }
if err != nil {
logger.Errorf("The registry id:%s url is invalid ,and will skip the registry, error: %#v", k, err)
diff --git a/config/registry_config_test.go b/config/registry_config_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..f600a21a0117572349aaf4de1bdee5e1270f67b4
--- /dev/null
+++ b/config/registry_config_test.go
@@ -0,0 +1,61 @@
+/*
+ * 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 config
+
+import (
+ "fmt"
+ "testing"
+)
+import (
+ "github.com/apache/dubbo-go/common"
+ "github.com/stretchr/testify/assert"
+)
+
+func Test_loadRegistries(t *testing.T) {
+ target := "shanghai1"
+ regs := map[string]*RegistryConfig{
+
+ "shanghai1": {
+ Protocol: "mock",
+ TimeoutStr: "2s",
+ Group: "shanghai_idc",
+ Address: "127.0.0.2:2181,128.0.0.1:2181",
+ Username: "user1",
+ Password: "pwd1",
+ },
+ }
+ urls := loadRegistries(target, regs, common.CONSUMER)
+ fmt.Println(urls[0])
+ assert.Equal(t, "127.0.0.2:2181,128.0.0.1:2181", urls[0].Location)
+}
+func Test_loadRegistries1(t *testing.T) {
+ target := "shanghai1"
+ regs := map[string]*RegistryConfig{
+
+ "shanghai1": {
+ Protocol: "mock",
+ TimeoutStr: "2s",
+ Group: "shanghai_idc",
+ Address: "127.0.0.2:2181",
+ Username: "user1",
+ Password: "pwd1",
+ },
+ }
+ urls := loadRegistries(target, regs, common.CONSUMER)
+ fmt.Println(urls[0])
+ assert.Equal(t, "127.0.0.2:2181", urls[0].Location)
+}
diff --git a/config/service.go b/config/service.go
index 0f3356f710dc89f25db102d73026e2bde9b9f466..2bceac4a8c20bb598dc2607c90c8206e4a448808 100644
--- a/config/service.go
+++ b/config/service.go
@@ -28,12 +28,12 @@ var (
// SetConService is called by init() of implement of RPCService
func SetConsumerService(service common.RPCService) {
- conServices[service.Service()] = service
+ conServices[service.Reference()] = service
}
// SetProService is called by init() of implement of RPCService
func SetProviderService(service common.RPCService) {
- proServices[service.Service()] = service
+ proServices[service.Reference()] = service
}
func GetConsumerService(name string) common.RPCService {
diff --git a/config/service_config.go b/config/service_config.go
index 79a29aa33058dfc47fca282a71ba28292a2b1ff3..76913319f6f0ac27ec36ebaa2d89db09bbd79c7c 100644
--- a/config/service_config.go
+++ b/config/service_config.go
@@ -43,17 +43,19 @@ import (
type ServiceConfig struct {
context context.Context
- Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
- Protocol string `required:"true" yaml:"protocol" json:"protocol,omitempty" property:"protocol"` //multi protocol support, split by ','
- InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"`
- Registry string `yaml:"registry" json:"registry,omitempty" property:"registry"`
- Cluster string `default:"failover" yaml:"cluster" json:"cluster,omitempty" property:"cluster"`
- Loadbalance string `default:"random" yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
- Group string `yaml:"group" json:"group,omitempty" property:"group"`
- Version string `yaml:"version" json:"version,omitempty" property:"version" `
- Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"`
- Warmup string `yaml:"warmup" json:"warmup,omitempty" property:"warmup"`
- Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"`
+ id string
+ Filter string `yaml:"filter" json:"filter,omitempty" property:"filter"`
+ Protocol string `required:"true" yaml:"protocol" json:"protocol,omitempty" property:"protocol"` //multi protocol support, split by ','
+ InterfaceName string `required:"true" yaml:"interface" json:"interface,omitempty" property:"interface"`
+ Registry string `yaml:"registry" json:"registry,omitempty" property:"registry"`
+ Cluster string `default:"failover" yaml:"cluster" json:"cluster,omitempty" property:"cluster"`
+ Loadbalance string `default:"random" yaml:"loadbalance" json:"loadbalance,omitempty" property:"loadbalance"`
+ Group string `yaml:"group" json:"group,omitempty" property:"group"`
+ Version string `yaml:"version" json:"version,omitempty" property:"version" `
+ Methods []*MethodConfig `yaml:"methods" json:"methods,omitempty" property:"methods"`
+ Warmup string `yaml:"warmup" json:"warmup,omitempty" property:"warmup"`
+ Retries int64 `yaml:"retries" json:"retries,omitempty" property:"retries"`
+ Params map[string]string `yaml:"params" json:"params,omitempty" property:"params"`
unexported *atomic.Bool
exported *atomic.Bool
rpcService common.RPCService
@@ -66,8 +68,12 @@ func (c *ServiceConfig) Prefix() string {
return constant.ServiceConfigPrefix + c.InterfaceName + "."
}
-func NewServiceConfig() *ServiceConfig {
+// The only way to get a new ServiceConfig
+func NewServiceConfig(id string, context context.Context) *ServiceConfig {
+
return &ServiceConfig{
+ context: context,
+ id: id,
unexported: atomic.NewBool(false),
exported: atomic.NewBool(false),
}
@@ -99,15 +105,12 @@ func (srvconfig *ServiceConfig) Export() error {
logger.Errorf(err.Error())
return err
}
- //contextPath := proto.ContextPath
- //if contextPath == "" {
- // contextPath = providerConfig.Path
- //}
- url := common.NewURLWithOptions(common.WithPath(srvconfig.InterfaceName),
+ url := common.NewURLWithOptions(common.WithPath(srvconfig.id),
common.WithProtocol(proto.Name),
common.WithIp(proto.Ip),
common.WithPort(proto.Port),
common.WithParams(urlMap),
+ common.WithParamsValue(constant.BEAN_NAME_KEY, srvconfig.id),
common.WithMethods(strings.Split(methods, ",")))
if len(regUrls) > 0 {
@@ -148,6 +151,10 @@ func (srvconfig *ServiceConfig) Implement(s common.RPCService) {
func (srvconfig *ServiceConfig) getUrlMap() url.Values {
urlMap := url.Values{}
+ //first set user params
+ for k, v := range srvconfig.Params {
+ urlMap.Set(k, v)
+ }
urlMap.Set(constant.INTERFACE_KEY, srvconfig.InterfaceName)
urlMap.Set(constant.TIMESTAMP_KEY, strconv.FormatInt(time.Now().Unix(), 10))
urlMap.Set(constant.CLUSTER_KEY, srvconfig.Cluster)
diff --git a/config/service_config_test.go b/config/service_config_test.go
index 4e0b7f95d6b156eeda021e3c02e5457e8b52b244..e111c8d110a14a039f3ab1a6c14f8044847f87e5 100644
--- a/config/service_config_test.go
+++ b/config/service_config_test.go
@@ -74,7 +74,7 @@ func doinit() {
},
Services: map[string]*ServiceConfig{
"MockService": {
- InterfaceName: "MockService",
+ InterfaceName: "com.MockService",
Protocol: "mock",
Registry: "shanghai_reg1,shanghai_reg2,hangzhou_reg1,hangzhou_reg2",
Cluster: "failover",
diff --git a/config/testdata/consumer_config.yml b/config/testdata/consumer_config.yml
index 08ff59f6fc403a0aa31e090fa8f9341a6e11d490..373871dccbc6c3f7272b7abcb1a9a104c8f13090 100644
--- a/config/testdata/consumer_config.yml
+++ b/config/testdata/consumer_config.yml
@@ -36,12 +36,17 @@ references:
registry: "hangzhouzk,shanghaizk"
filter: ""
protocol : "dubbo"
+ version: "1.0"
+ group: "as"
interface : "com.ikurento.user.UserProvider"
- url: "dubbo://127.0.0.1:20000"
+ url: "dubbo://127.0.0.1:20000/UserProvider"
cluster: "failover"
methods :
- name: "GetUser"
retries: 3
+ params:
+ "serviceid":
+ "soa.com.ikurento.user.UserProvider"
protocol_conf:
dubbo:
@@ -49,9 +54,14 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
+ # gr_pool_size is recommended to be set to [cpu core number] * 100
+ gr_pool_size: 1200
+ # queue_len is recommended to be set to 64 or 128
+ queue_len: 64
+ # queue_number is recommended to be set to gr_pool_size / 20
+ queue_number: 60
getty_session_param:
compress_encoding: false
tcp_no_delay: true
@@ -59,7 +69,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/config/testdata/consumer_config_with_configcenter.yml b/config/testdata/consumer_config_with_configcenter.yml
index df896d2442ce6eb5cf0cc41bb92f39964325d885..c6505e4492887cc6602ab0b2ee9a9fbd9fdce9c9 100644
--- a/config/testdata/consumer_config_with_configcenter.yml
+++ b/config/testdata/consumer_config_with_configcenter.yml
@@ -9,7 +9,7 @@ references:
filter: ""
protocol : "dubbo"
interface : "com.ikurento.user.UserProvider"
- url: "dubbo://127.0.0.1:20000"
+ url: "dubbo://127.0.0.1:20000/UserProvider"
cluster: "failover"
methods :
- name: "GetUser"
@@ -21,7 +21,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
@@ -31,7 +30,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/config/testdata/provider_config.yml b/config/testdata/provider_config.yml
index 38952220e270b2b0a929a7583d1f5650ecab0121..e135860c208ff4d386a1abd658049e0e0aac73a3 100644
--- a/config/testdata/provider_config.yml
+++ b/config/testdata/provider_config.yml
@@ -33,6 +33,8 @@ services:
# equivalent to interface of dubbo.xml
interface : "com.ikurento.user.UserProvider"
loadbalance: "random"
+ version: "1.0"
+ group: "as"
warmup: "100"
cluster: "failover"
methods:
@@ -53,8 +55,13 @@ protocols:
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
+ # gr_pool_size is recommended to be set to [cpu core number] * 10
+ gr_pool_size: 120
+ # queue_len is recommended to be set to 64 or 128
+ queue_len: 64
+ # queue_number is recommended to be set to gr_pool_size / 20
+ queue_number: 6
getty_session_param:
compress_encoding: false
tcp_no_delay: true
@@ -62,7 +69,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/dubbo/with-configcenter-go-client/app/client.go b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/client.go
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/app/client.go
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/client.go
diff --git a/examples/dubbo/with-configcenter-go-client/app/user.go b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/user.go
similarity index 95%
rename from examples/dubbo/with-configcenter-go-client/app/user.go
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/user.go
index 76f499c4d38d83af97b965b6d33e68d639ae7bfb..8140acaef621f361e5b35fa90318d73546902913 100644
--- a/examples/dubbo/with-configcenter-go-client/app/user.go
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/user.go
@@ -108,10 +108,6 @@ type UserProvider struct {
Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
}
diff --git a/examples/dubbo/go-client/app/version.go b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/version.go
similarity index 100%
rename from examples/dubbo/go-client/app/version.go
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/app/version.go
diff --git a/examples/dubbo/go-client/assembly/bin/load.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/bin/load.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/bin/load.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/bin/load.sh
diff --git a/examples/dubbo/go-client/assembly/common/app.properties b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/common/app.properties
similarity index 100%
rename from examples/dubbo/go-client/assembly/common/app.properties
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/common/app.properties
diff --git a/examples/dubbo/go-client/assembly/common/build.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/common/build.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/common/build.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/common/build.sh
diff --git a/examples/dubbo/go-client/assembly/linux/dev.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/linux/dev.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/linux/dev.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/linux/dev.sh
diff --git a/examples/dubbo/go-client/assembly/linux/release.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/linux/release.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/linux/release.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/linux/release.sh
diff --git a/examples/dubbo/go-client/assembly/linux/test.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/linux/test.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/linux/test.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/linux/test.sh
diff --git a/examples/dubbo/go-client/assembly/mac/dev.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/mac/dev.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/mac/dev.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/mac/dev.sh
diff --git a/examples/dubbo/go-client/assembly/mac/release.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/mac/release.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/mac/release.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/mac/release.sh
diff --git a/examples/dubbo/go-client/assembly/mac/test.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/mac/test.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/mac/test.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/mac/test.sh
diff --git a/examples/dubbo/go-client/assembly/windows/dev.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/windows/dev.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/windows/dev.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/windows/dev.sh
diff --git a/examples/dubbo/go-client/assembly/windows/release.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/windows/release.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/windows/release.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/windows/release.sh
diff --git a/examples/dubbo/go-client/assembly/windows/test.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/windows/test.sh
similarity index 100%
rename from examples/dubbo/go-client/assembly/windows/test.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/assembly/windows/test.sh
diff --git a/examples/dubbo/with-configcenter-go-client/profiles/dev/client.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/dev/client.yml
similarity index 94%
rename from examples/dubbo/with-configcenter-go-client/profiles/dev/client.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/dev/client.yml
index c809041f14d15230a02f154571c02a038ee2ca92..c8e7bd0b053f797f3a5320451f08dcc590832330 100644
--- a/examples/dubbo/with-configcenter-go-client/profiles/dev/client.yml
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/dev/client.yml
@@ -21,7 +21,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
@@ -31,7 +30,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/dubbo/go-client/profiles/dev/log.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/dev/log.yml
similarity index 100%
rename from examples/dubbo/go-client/profiles/dev/log.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/dev/log.yml
diff --git a/examples/dubbo/with-configcenter-go-client/profiles/release/client.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/release/client.yml
similarity index 94%
rename from examples/dubbo/with-configcenter-go-client/profiles/release/client.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/release/client.yml
index c809041f14d15230a02f154571c02a038ee2ca92..c8e7bd0b053f797f3a5320451f08dcc590832330 100644
--- a/examples/dubbo/with-configcenter-go-client/profiles/release/client.yml
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/release/client.yml
@@ -21,7 +21,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
@@ -31,7 +30,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/dubbo/go-client/profiles/release/log.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/release/log.yml
similarity index 100%
rename from examples/dubbo/go-client/profiles/release/log.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/release/log.yml
diff --git a/examples/dubbo/with-configcenter-go-client/profiles/test/client.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/test/client.yml
similarity index 94%
rename from examples/dubbo/with-configcenter-go-client/profiles/test/client.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/test/client.yml
index c809041f14d15230a02f154571c02a038ee2ca92..c8e7bd0b053f797f3a5320451f08dcc590832330 100644
--- a/examples/dubbo/with-configcenter-go-client/profiles/test/client.yml
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/test/client.yml
@@ -21,7 +21,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
@@ -31,7 +30,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/dubbo/go-client/profiles/test/log.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/test/log.yml
similarity index 100%
rename from examples/dubbo/go-client/profiles/test/log.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-client/profiles/test/log.yml
diff --git a/examples/dubbo/with-configcenter-go-server/app/server.go b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/server.go
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/app/server.go
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/server.go
diff --git a/examples/dubbo/with-configcenter-go-server/app/user.go b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/user.go
similarity index 96%
rename from examples/dubbo/with-configcenter-go-server/app/user.go
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/user.go
index f25b6f48623f9e855dc0dd2f471187bec4499e2b..d0ac61e4c41e805dbcadc30238993e3946da7cd0 100644
--- a/examples/dubbo/with-configcenter-go-server/app/user.go
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/user.go
@@ -25,12 +25,12 @@ import (
)
import (
+ hessian "github.com/apache/dubbo-go-hessian2"
+ "github.com/apache/dubbo-go-hessian2/java_exception"
perrors "github.com/pkg/errors"
)
import (
- hessian "github.com/apache/dubbo-go-hessian2"
- "github.com/apache/dubbo-go-hessian2/java_exception"
"github.com/apache/dubbo-go/config"
)
@@ -183,12 +183,8 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) {
return []interface{}{user, user1}, err
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
}
func println(format string, args ...interface{}) {
diff --git a/examples/dubbo/go-server/app/version.go b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/version.go
similarity index 100%
rename from examples/dubbo/go-server/app/version.go
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/app/version.go
diff --git a/examples/dubbo/go-server/assembly/bin/load.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/bin/load.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/bin/load.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/bin/load.sh
diff --git a/examples/dubbo/go-server/assembly/common/app.properties b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/common/app.properties
similarity index 100%
rename from examples/dubbo/go-server/assembly/common/app.properties
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/common/app.properties
diff --git a/examples/dubbo/go-server/assembly/common/build.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/common/build.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/common/build.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/common/build.sh
diff --git a/examples/dubbo/go-server/assembly/linux/dev.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/linux/dev.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/linux/dev.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/linux/dev.sh
diff --git a/examples/dubbo/go-server/assembly/linux/release.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/linux/release.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/linux/release.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/linux/release.sh
diff --git a/examples/dubbo/go-server/assembly/linux/test.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/linux/test.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/linux/test.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/linux/test.sh
diff --git a/examples/dubbo/go-server/assembly/mac/dev.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/mac/dev.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/mac/dev.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/mac/dev.sh
diff --git a/examples/dubbo/go-server/assembly/mac/release.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/mac/release.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/mac/release.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/mac/release.sh
diff --git a/examples/dubbo/go-server/assembly/mac/test.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/mac/test.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/mac/test.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/mac/test.sh
diff --git a/examples/dubbo/go-server/assembly/windows/dev.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/windows/dev.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/windows/dev.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/windows/dev.sh
diff --git a/examples/dubbo/go-server/assembly/windows/release.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/windows/release.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/windows/release.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/windows/release.sh
diff --git a/examples/dubbo/go-server/assembly/windows/test.sh b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/windows/test.sh
similarity index 100%
rename from examples/dubbo/go-server/assembly/windows/test.sh
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/assembly/windows/test.sh
diff --git a/examples/dubbo/go-server/profiles/dev/log.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/dev/log.yml
similarity index 100%
rename from examples/dubbo/go-server/profiles/dev/log.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/dev/log.yml
diff --git a/examples/dubbo/with-configcenter-go-server/profiles/release/server.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/dev/server.yml
similarity index 94%
rename from examples/dubbo/with-configcenter-go-server/profiles/release/server.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/dev/server.yml
index 05f758592f5aa69e097f19d14299e15bc9bf5f0f..cdaaca4c3803cf6126f00d67631dd1507d14505c 100644
--- a/examples/dubbo/with-configcenter-go-server/profiles/release/server.yml
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/dev/server.yml
@@ -23,7 +23,6 @@ services:
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
getty_session_param:
compress_encoding: false
@@ -32,7 +31,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/dubbo/go-server/profiles/release/log.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/release/log.yml
similarity index 100%
rename from examples/dubbo/go-server/profiles/release/log.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/release/log.yml
diff --git a/examples/dubbo/with-configcenter-go-server/profiles/test/server.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/release/server.yml
similarity index 94%
rename from examples/dubbo/with-configcenter-go-server/profiles/test/server.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/release/server.yml
index 05f758592f5aa69e097f19d14299e15bc9bf5f0f..cdaaca4c3803cf6126f00d67631dd1507d14505c 100644
--- a/examples/dubbo/with-configcenter-go-server/profiles/test/server.yml
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/release/server.yml
@@ -23,7 +23,6 @@ services:
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
getty_session_param:
compress_encoding: false
@@ -32,7 +31,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/dubbo/go-server/profiles/test/log.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/test/log.yml
similarity index 100%
rename from examples/dubbo/go-server/profiles/test/log.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/test/log.yml
diff --git a/examples/dubbo/with-configcenter-go-server/profiles/dev/server.yml b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/test/server.yml
similarity index 94%
rename from examples/dubbo/with-configcenter-go-server/profiles/dev/server.yml
rename to examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/test/server.yml
index 05f758592f5aa69e097f19d14299e15bc9bf5f0f..cdaaca4c3803cf6126f00d67631dd1507d14505c 100644
--- a/examples/dubbo/with-configcenter-go-server/profiles/dev/server.yml
+++ b/examples/configcenter/zookeeper/dubbo/with-configcenter-go-server/profiles/test/server.yml
@@ -23,7 +23,6 @@ services:
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
getty_session_param:
compress_encoding: false
@@ -32,7 +31,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/jsonrpc/with-configcenter-go-client/app/client.go b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/client.go
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/app/client.go
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/client.go
diff --git a/examples/jsonrpc/go-client/app/user.go b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/user.go
similarity index 93%
rename from examples/jsonrpc/go-client/app/user.go
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/user.go
index ca98b1af0b3c1379c73623162546db9fb4fc95d6..fef665bb3d14709ffd584cbb184c18ffe8d87580 100644
--- a/examples/jsonrpc/go-client/app/user.go
+++ b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/user.go
@@ -58,10 +58,6 @@ type UserProvider struct {
Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
}
diff --git a/examples/dubbo/with-configcenter-go-client/app/version.go b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/version.go
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/app/version.go
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/app/version.go
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/bin/load.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/bin/load.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/bin/load.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/bin/load.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/common/app.properties b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/common/app.properties
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/common/app.properties
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/common/app.properties
diff --git a/examples/jsonrpc/go-client/assembly/common/build.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/common/build.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/common/build.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/common/build.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/linux/dev.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/linux/dev.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/linux/dev.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/linux/dev.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/linux/release.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/linux/release.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/linux/release.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/linux/release.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/linux/test.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/linux/test.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/linux/test.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/linux/test.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/mac/dev.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/mac/dev.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/mac/dev.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/mac/dev.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/mac/release.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/mac/release.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/mac/release.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/mac/release.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/mac/test.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/mac/test.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/mac/test.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/mac/test.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/windows/dev.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/windows/dev.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/windows/dev.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/windows/dev.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/windows/release.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/windows/release.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/windows/release.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/windows/release.sh
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/windows/test.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/windows/test.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/windows/test.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/assembly/windows/test.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/profiles/dev/client.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/dev/client.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/profiles/dev/client.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/dev/client.yml
diff --git a/examples/dubbo/with-configcenter-go-client/profiles/dev/log.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/dev/log.yml
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/profiles/dev/log.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/dev/log.yml
diff --git a/examples/jsonrpc/with-configcenter-go-client/profiles/release/client.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/release/client.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/profiles/release/client.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/release/client.yml
diff --git a/examples/dubbo/with-configcenter-go-client/profiles/release/log.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/release/log.yml
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/profiles/release/log.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/release/log.yml
diff --git a/examples/jsonrpc/with-configcenter-go-client/profiles/test/client.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/test/client.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/profiles/test/client.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/test/client.yml
diff --git a/examples/dubbo/with-configcenter-go-client/profiles/test/log.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/test/log.yml
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/profiles/test/log.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-client/profiles/test/log.yml
diff --git a/examples/jsonrpc/with-configcenter-go-server/app/server.go b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/server.go
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/app/server.go
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/server.go
diff --git a/examples/jsonrpc/with-configcenter-go-server/app/user.go b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/user.go
similarity index 96%
rename from examples/jsonrpc/with-configcenter-go-server/app/user.go
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/user.go
index fbe6f3339c212d2bd42d52b6bbf7c7fcec6fb9c3..9ab9e58cb4d469dda347519674a8eef85b429fce 100644
--- a/examples/jsonrpc/with-configcenter-go-server/app/user.go
+++ b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/user.go
@@ -146,12 +146,8 @@ func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
return []User{*user, *user1}, err
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
}
func println(format string, args ...interface{}) {
diff --git a/examples/dubbo/with-configcenter-go-server/app/version.go b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/version.go
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/app/version.go
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/app/version.go
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/bin/load.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/bin/load.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/bin/load.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/bin/load.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/common/app.properties b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/common/app.properties
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/common/app.properties
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/common/app.properties
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/common/build.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/common/build.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/common/build.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/common/build.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/linux/dev.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/linux/dev.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/linux/dev.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/linux/dev.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/linux/release.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/linux/release.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/linux/release.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/linux/release.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/linux/test.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/linux/test.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/linux/test.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/linux/test.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/mac/dev.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/mac/dev.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/mac/dev.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/mac/dev.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/mac/release.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/mac/release.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/mac/release.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/mac/release.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/mac/test.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/mac/test.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/mac/test.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/mac/test.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/windows/dev.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/windows/dev.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/windows/dev.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/windows/dev.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/windows/release.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/windows/release.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/windows/release.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/windows/release.sh
diff --git a/examples/dubbo/with-configcenter-go-server/assembly/windows/test.sh b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/windows/test.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/assembly/windows/test.sh
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/assembly/windows/test.sh
diff --git a/examples/dubbo/with-configcenter-go-server/profiles/dev/log.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/dev/log.yml
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/profiles/dev/log.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/dev/log.yml
diff --git a/examples/jsonrpc/with-configcenter-go-server/profiles/dev/server.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/dev/server.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/profiles/dev/server.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/dev/server.yml
diff --git a/examples/dubbo/with-configcenter-go-server/profiles/release/log.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/release/log.yml
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/profiles/release/log.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/release/log.yml
diff --git a/examples/jsonrpc/with-configcenter-go-server/profiles/release/server.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/release/server.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/profiles/release/server.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/release/server.yml
diff --git a/examples/dubbo/with-configcenter-go-server/profiles/test/log.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/test/log.yml
similarity index 100%
rename from examples/dubbo/with-configcenter-go-server/profiles/test/log.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/test/log.yml
diff --git a/examples/jsonrpc/with-configcenter-go-server/profiles/test/server.yml b/examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/test/server.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/profiles/test/server.yml
rename to examples/configcenter/zookeeper/jsonrpc/with-configcenter-go-server/profiles/test/server.yml
diff --git a/examples/dubbo/go-server/app/user.go b/examples/dubbo/go-server/app/user.go
deleted file mode 100644
index d180e02376728ef3391166b83a4d624bf1370a5c..0000000000000000000000000000000000000000
--- a/examples/dubbo/go-server/app/user.go
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
- "context"
- "fmt"
- "strconv"
- "time"
-)
-
-import (
- "github.com/apache/dubbo-go-hessian2"
- "github.com/apache/dubbo-go-hessian2/java_exception"
- perrors "github.com/pkg/errors"
-)
-
-import (
- "github.com/apache/dubbo-go/config"
-)
-
-type Gender hessian.JavaEnum
-
-func init() {
- config.SetProviderService(new(UserProvider))
-}
-
-const (
- MAN hessian.JavaEnum = iota
- WOMAN
-)
-
-var genderName = map[hessian.JavaEnum]string{
- MAN: "MAN",
- WOMAN: "WOMAN",
-}
-
-var genderValue = map[string]hessian.JavaEnum{
- "MAN": MAN,
- "WOMAN": WOMAN,
-}
-
-func (g Gender) JavaClassName() string {
- return "com.ikurento.user.Gender"
-}
-
-func (g Gender) String() string {
- s, ok := genderName[hessian.JavaEnum(g)]
- if ok {
- return s
- }
-
- return strconv.Itoa(int(g))
-}
-
-func (g Gender) EnumValue(s string) hessian.JavaEnum {
- v, ok := genderValue[s]
- if ok {
- return v
- }
-
- return hessian.InvalidJavaEnum
-}
-
-type (
- User struct {
- // !!! Cannot define lowercase names of variable
- Id string
- Name string
- Age int32
- Time time.Time
- Sex Gender // 注意此处,java enum Object <--> go string
- }
-
- UserProvider struct {
- user map[string]User
- }
-)
-
-var (
- DefaultUser = User{
- Id: "0", Name: "Alex Stocks", Age: 31,
- Sex: Gender(MAN),
- }
-
- userMap = UserProvider{user: make(map[string]User)}
-)
-
-func init() {
- userMap.user["A000"] = DefaultUser
- userMap.user["A001"] = User{Id: "001", Name: "ZhangSheng", Age: 18, Sex: Gender(MAN)}
- userMap.user["A002"] = User{Id: "002", Name: "Lily", Age: 20, Sex: Gender(WOMAN)}
- userMap.user["A003"] = User{Id: "113", Name: "Moorse", Age: 30, Sex: Gender(WOMAN)}
- for k, v := range userMap.user {
- v.Time = time.Now()
- userMap.user[k] = v
- }
-}
-
-func (u User) String() string {
- return fmt.Sprintf(
- "User{Id:%s, Name:%s, Age:%d, Time:%s, Sex:%s}",
- u.Id, u.Name, u.Age, u.Time, u.Sex,
- )
-}
-
-func (u User) JavaClassName() string {
- return "com.ikurento.user.User"
-}
-
-func (u *UserProvider) getUser(userId string) (*User, error) {
- if user, ok := userMap.user[userId]; ok {
- return &user, nil
- }
-
- return nil, fmt.Errorf("invalid user id:%s", userId)
-}
-
-func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
- var (
- err error
- user *User
- )
-
- println("req:%#v", req)
- user, err = u.getUser(req[0].(string))
- if err == nil {
- *rsp = *user
- println("rsp:%#v", rsp)
- }
- return err
-}
-
-func (u *UserProvider) GetUser0(id string, name string) (User, error) {
- var err error
-
- println("id:%s, name:%s", id, name)
- user, err := u.getUser(id)
- if err != nil {
- return User{}, err
- }
- if user.Name != name {
- return User{}, perrors.New("name is not " + user.Name)
- }
- return *user, err
-}
-
-func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
- var err error
-
- println("req:%#v", req)
- rsp.Id = strconv.Itoa(int(req[0].(int32)))
- return err
-}
-
-func (u *UserProvider) GetUser3() error {
- return nil
-}
-
-func (u *UserProvider) GetErr(ctx context.Context, req []interface{}, rsp *User) error {
- return java_exception.NewThrowable("exception")
-}
-
-func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) {
- var err error
-
- println("req:%s", req)
- t := req[0].([]interface{})
- user, err := u.getUser(t[0].(string))
- if err != nil {
- return nil, err
- }
- println("user:%v", user)
- user1, err := u.getUser(t[1].(string))
- if err != nil {
- return nil, err
- }
- println("user1:%v", user1)
-
- return []interface{}{user, user1}, err
-}
-
-func (s *UserProvider) MethodMapper() map[string]string {
- return map[string]string{
- "GetUser2": "getUser",
- }
-}
-
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
-}
-
-func println(format string, args ...interface{}) {
- fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
-}
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
deleted file mode 100644
index edf4c0d2b20a08c17241132cd03bf16a51b2fbb8..0000000000000000000000000000000000000000
--- a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
+++ /dev/null
@@ -1,101 +0,0 @@
-// *****************************************************
-// DESC : dubbo consumer
-// AUTHOR : writtey by 包增辉(https://github.com/baozh)
-// VERSION : 1.0
-// LICENCE : Apache License 2.0
-// EMAIL : alexstocks@foxmail.com
-// MOD : 2016-10-19 17:03
-// FILE : Consumer.java
-// ******************************************************
-
-package com.ikurento.user;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import com.alibaba.dubbo.rpc.service.EchoService;
-import java.util.List;
-
-public class Consumer {
- //定义一个私有变量 (Spring中要求)
- private UserProvider userProvider;
-
- //Spring注入(Spring中要求)
- public void setUserProvider(UserProvider u) {
- this.userProvider = u;
- }
-
- private void benchmarkSayHello() {
- for (int i = 0; i < Integer.MAX_VALUE; i ++) {
- try {
- // String hello = demoService.sayHello("world" + i);
- // System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + hello);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- // Thread.sleep(2000);
- }
- }
-
- private void testGetUser() throws Exception {
- try {
- EchoService echoService = (EchoService)userProvider;
- Object status = echoService.$echo("OK");
- System.out.println("echo: "+status);
- User user1 = userProvider.GetUser("A003");
- System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
- " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
- + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
- User user2 = userProvider.GetUser0("A003","Moorse");
- 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 user3 = userProvider.getUser(1);
- System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
- " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
- + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
- userProvider.GetUser3();
- System.out.println("GetUser3 succ");
-
- 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 {
- try {
- List<String> userIDList = new ArrayList<String>();
- userIDList.add("A001");
- userIDList.add("A002");
- userIDList.add("A003");
-
- List<User> userList = userProvider.GetUsers(userIDList);
-
- for (int i = 0; i < userList.size(); i++) {
- User user = userList.get(i);
- System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
- " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
- + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- //启动consumer的入口函数(在配置文件中指定)
- public void start() throws Exception {
- testGetUser();
- testGetUsers();
-// Thread.sleep(120000);
-Thread.sleep(2000);
- }
-}
diff --git a/examples/dubbo/go-client/app/client.go b/examples/general/dubbo/go-client/app/client.go
similarity index 52%
rename from examples/dubbo/go-client/app/client.go
rename to examples/general/dubbo/go-client/app/client.go
index 836a9248ae66568974af926e394d08b4cf3e0922..04aba98ec6339d25009b9295e1202e6f8e2771a2 100644
--- a/examples/dubbo/go-client/app/client.go
+++ b/examples/general/dubbo/go-client/app/client.go
@@ -25,16 +25,14 @@ import (
"syscall"
"time"
)
-
import (
- "github.com/apache/dubbo-go-hessian2"
+ hessian "github.com/apache/dubbo-go-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"
_ "github.com/apache/dubbo-go/registry/protocol"
_ "github.com/apache/dubbo-go/filter/impl"
@@ -59,6 +57,44 @@ func main() {
config.Load()
+ println("\n\ntest")
+ test()
+ println("\n\ntest1")
+ test1()
+ println("\n\ntest2")
+ test2()
+ initSignal()
+}
+
+func initSignal() {
+ signals := make(chan os.Signal, 1)
+ // It is not possible to block SIGKILL or syscall.SIGSTOP
+ signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP,
+ syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
+ for {
+ sig := <-signals
+ logger.Infof("get signal %s", sig.String())
+ switch sig {
+ case syscall.SIGHUP:
+ // reload()
+ default:
+ go time.AfterFunc(time.Duration(survivalTimeout), func() {
+ logger.Warnf("app exit now by force...")
+ os.Exit(1)
+ })
+
+ // 要么fastFailTimeout时间内执行完毕下面的逻辑然后程序退出,要么执行上面的超时函数程序强行退出
+ fmt.Println("app exit now...")
+ return
+ }
+ }
+}
+
+func println(format string, args ...interface{}) {
+ fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
+}
+
+func test() {
println("\n\n\necho")
res, err := userProvider.Echo(context.TODO(), "OK")
if err != nil {
@@ -109,43 +145,143 @@ func main() {
println("\n\n\nstart to test dubbo - getErr")
user = &User{}
err = userProvider.GetErr(context.TODO(), []interface{}{"A003"}, user)
- if err != nil {
- println("getErr - error: %v", err)
+ if err == nil {
+ panic("err is nil")
}
+ println("getErr - error: %v", err)
println("\n\n\nstart to test dubbo illegal method")
err = userProvider.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("error: %v", err)
+}
+
+func test1() {
+ println("\n\n\necho")
+ res, err := userProvider1.Echo(context.TODO(), "OK")
if err != nil {
panic(err)
}
+ println("res: %v\n", res)
- initSignal()
-}
+ time.Sleep(3e9)
-func initSignal() {
- signals := make(chan os.Signal, 1)
- // It is not possible to block SIGKILL or syscall.SIGSTOP
- signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP,
- syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
- for {
- sig := <-signals
- logger.Infof("get signal %s", sig.String())
- switch sig {
- case syscall.SIGHUP:
- // reload()
- default:
- go time.AfterFunc(time.Duration(survivalTimeout)*time.Second, func() {
- logger.Warnf("app exit now by force...")
- os.Exit(1)
- })
+ println("\n\n\nstart to test dubbo")
+ user := &User{}
+ err = userProvider1.GetUser(context.TODO(), []interface{}{"A003"}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
- // 要么fastFailTimeout时间内执行完毕下面的逻辑然后程序退出,要么执行上面的超时函数程序强行退出
- fmt.Println("app exit now...")
- return
- }
+ println("\n\n\nstart to test dubbo - GetUser0")
+ ret, err := userProvider1.GetUser0("A003", "Moorse")
+ if err != nil {
+ panic(err)
}
+ println("response result: %v", ret)
+
+ println("\n\n\nstart to test dubbo - GetUsers")
+ ret1, err := userProvider1.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret1)
+
+ println("\n\n\nstart to test dubbo - getUser")
+ user = &User{}
+ var i int32 = 1
+ err = userProvider1.GetUser2(context.TODO(), []interface{}{i}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
+
+ println("\n\n\nstart to test dubbo - GetUser3")
+ err = userProvider1.GetUser3()
+ if err != nil {
+ panic(err)
+ }
+ println("succ!")
+
+ println("\n\n\nstart to test dubbo - getErr")
+ user = &User{}
+ err = userProvider1.GetErr(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("getErr - error: %v", err)
+
+ println("\n\n\nstart to test dubbo illegal method")
+ err = userProvider1.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("error: %v", err)
}
-func println(format string, args ...interface{}) {
- fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
+func test2() {
+ println("\n\n\necho")
+ res, err := userProvider2.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 = userProvider2.GetUser(context.TODO(), []interface{}{"A003"}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
+
+ println("\n\n\nstart to test dubbo - GetUser0")
+ ret, err := userProvider2.GetUser0("A003", "Moorse")
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret)
+
+ println("\n\n\nstart to test dubbo - GetUsers")
+ ret1, err := userProvider2.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret1)
+
+ println("\n\n\nstart to test dubbo - getUser")
+ user = &User{}
+ var i int32 = 1
+ err = userProvider2.GetUser2(context.TODO(), []interface{}{i}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
+
+ println("\n\n\nstart to test dubbo - GetUser3")
+ err = userProvider2.GetUser3()
+ if err != nil {
+ panic(err)
+ }
+ println("succ!")
+
+ println("\n\n\nstart to test dubbo - getErr")
+ user = &User{}
+ err = userProvider2.GetErr(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("getErr - error: %v", err)
+
+ println("\n\n\nstart to test dubbo illegal method")
+ err = userProvider2.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("error: %v", err)
}
diff --git a/examples/dubbo/go-client/app/user.go b/examples/general/dubbo/go-client/app/user.go
similarity index 62%
rename from examples/dubbo/go-client/app/user.go
rename to examples/general/dubbo/go-client/app/user.go
index 76f499c4d38d83af97b965b6d33e68d639ae7bfb..affa5418a701842e890f9e2498c2ef7a769532bd 100644
--- a/examples/dubbo/go-client/app/user.go
+++ b/examples/general/dubbo/go-client/app/user.go
@@ -34,10 +34,16 @@ import (
type Gender hessian.JavaEnum
-var userProvider = new(UserProvider)
+var (
+ userProvider = new(UserProvider)
+ userProvider1 = new(UserProvider1)
+ userProvider2 = new(UserProvider2)
+)
func init() {
config.SetConsumerService(userProvider)
+ config.SetConsumerService(userProvider1)
+ config.SetConsumerService(userProvider2)
}
const (
@@ -108,10 +114,36 @@ type UserProvider struct {
Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
+}
+
+type UserProvider1 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
+ GetUser2 func(ctx context.Context, req []interface{}, rsp *User) error `dubbo:"getUser"`
+ GetUser3 func() error
+ Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
+}
+
+func (u *UserProvider1) Reference() string {
+ return "UserProvider1"
+}
+
+type UserProvider2 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
+ GetUser2 func(ctx context.Context, req []interface{}, rsp *User) error `dubbo:"getUser"`
+ GetUser3 func() error
+ Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
}
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider2) Reference() string {
+ return "UserProvider2"
}
diff --git a/examples/jsonrpc/go-client/app/version.go b/examples/general/dubbo/go-client/app/version.go
similarity index 100%
rename from examples/jsonrpc/go-client/app/version.go
rename to examples/general/dubbo/go-client/app/version.go
diff --git a/examples/jsonrpc/go-client/assembly/bin/load.sh b/examples/general/dubbo/go-client/assembly/bin/load.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/bin/load.sh
rename to examples/general/dubbo/go-client/assembly/bin/load.sh
diff --git a/examples/jsonrpc/go-client/assembly/common/app.properties b/examples/general/dubbo/go-client/assembly/common/app.properties
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/common/app.properties
rename to examples/general/dubbo/go-client/assembly/common/app.properties
diff --git a/examples/dubbo/with-configcenter-go-client/assembly/common/build.sh b/examples/general/dubbo/go-client/assembly/common/build.sh
similarity index 100%
rename from examples/dubbo/with-configcenter-go-client/assembly/common/build.sh
rename to examples/general/dubbo/go-client/assembly/common/build.sh
diff --git a/examples/jsonrpc/go-client/assembly/linux/dev.sh b/examples/general/dubbo/go-client/assembly/linux/dev.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/linux/dev.sh
rename to examples/general/dubbo/go-client/assembly/linux/dev.sh
diff --git a/examples/jsonrpc/go-client/assembly/linux/release.sh b/examples/general/dubbo/go-client/assembly/linux/release.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/linux/release.sh
rename to examples/general/dubbo/go-client/assembly/linux/release.sh
diff --git a/examples/jsonrpc/go-client/assembly/linux/test.sh b/examples/general/dubbo/go-client/assembly/linux/test.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/linux/test.sh
rename to examples/general/dubbo/go-client/assembly/linux/test.sh
diff --git a/examples/jsonrpc/go-client/assembly/mac/dev.sh b/examples/general/dubbo/go-client/assembly/mac/dev.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/mac/dev.sh
rename to examples/general/dubbo/go-client/assembly/mac/dev.sh
diff --git a/examples/jsonrpc/go-client/assembly/mac/release.sh b/examples/general/dubbo/go-client/assembly/mac/release.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/mac/release.sh
rename to examples/general/dubbo/go-client/assembly/mac/release.sh
diff --git a/examples/jsonrpc/go-client/assembly/mac/test.sh b/examples/general/dubbo/go-client/assembly/mac/test.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/mac/test.sh
rename to examples/general/dubbo/go-client/assembly/mac/test.sh
diff --git a/examples/jsonrpc/go-client/assembly/windows/dev.sh b/examples/general/dubbo/go-client/assembly/windows/dev.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/windows/dev.sh
rename to examples/general/dubbo/go-client/assembly/windows/dev.sh
diff --git a/examples/jsonrpc/go-client/assembly/windows/release.sh b/examples/general/dubbo/go-client/assembly/windows/release.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/windows/release.sh
rename to examples/general/dubbo/go-client/assembly/windows/release.sh
diff --git a/examples/jsonrpc/go-client/assembly/windows/test.sh b/examples/general/dubbo/go-client/assembly/windows/test.sh
similarity index 100%
rename from examples/jsonrpc/go-client/assembly/windows/test.sh
rename to examples/general/dubbo/go-client/assembly/windows/test.sh
diff --git a/examples/general/dubbo/go-client/profiles/dev/client.yml b/examples/general/dubbo/go-client/profiles/dev/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ff696688416dc1e77f87d7831922894979d78da2
--- /dev/null
+++ b/examples/general/dubbo/go-client/profiles/dev/client.yml
@@ -0,0 +1,83 @@
+# dubbo client yaml configure file
+
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ 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 : "dubbo"
+ interface : "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods :
+ - name: "GetUser"
+ retries: 3
+ "UserProvider1":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ interface: "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 3
+ "UserProvider2":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ group: "as"
+ interface: "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 3
+
+protocol_conf:
+ dubbo:
+ reconnect_interval: 0
+ connection_number: 2
+ heartbeat_period: "5s"
+ session_timeout: "20s"
+ pool_size: 64
+ pool_ttl: 600
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 10240
+ session_name: "client"
diff --git a/examples/jsonrpc/go-client/profiles/dev/log.yml b/examples/general/dubbo/go-client/profiles/dev/log.yml
similarity index 100%
rename from examples/jsonrpc/go-client/profiles/dev/log.yml
rename to examples/general/dubbo/go-client/profiles/dev/log.yml
diff --git a/examples/jsonrpc/go-client/profiles/dev/client.yml b/examples/general/dubbo/go-client/profiles/release/client.yml
similarity index 66%
rename from examples/jsonrpc/go-client/profiles/dev/client.yml
rename to examples/general/dubbo/go-client/profiles/release/client.yml
index 8d4346510fac9f7350b3d680b07a3d258b84e521..b4d897fda2b78e30dd912eab9f5a43bbcef9f595 100644
--- a/examples/jsonrpc/go-client/profiles/dev/client.yml
+++ b/examples/general/dubbo/go-client/profiles/release/client.yml
@@ -1,5 +1,6 @@
# dubbo client yaml configure file
+
check: true
# client
request_timeout : "3s"
@@ -8,12 +9,12 @@ connect_timeout : "3s"
# application config
application_config:
- organization : "ikurento.com"
- name : "BDTService"
- module : "dubbogo user-info client"
- version : "0.0.1"
- owner : "ZX"
- environment : "dev"
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info client"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "release"
registries :
"hangzhouzk":
@@ -33,14 +34,31 @@ references:
"UserProvider":
# 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
registry: "hangzhouzk"
- protocol : "jsonrpc"
-# version : "2.0"
-# group: "as"
+ protocol : "dubbo"
interface : "com.ikurento.user.UserProvider"
cluster: "failover"
methods :
- name: "GetUser"
retries: 3
+ "UserProvider1":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ interface: "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 3
+ "UserProvider2":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ group: "as"
+ interface: "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 3
protocol_conf:
dubbo:
@@ -48,7 +66,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
@@ -58,7 +75,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/jsonrpc/go-client/profiles/release/log.yml b/examples/general/dubbo/go-client/profiles/release/log.yml
similarity index 100%
rename from examples/jsonrpc/go-client/profiles/release/log.yml
rename to examples/general/dubbo/go-client/profiles/release/log.yml
diff --git a/examples/general/dubbo/go-client/profiles/test/client.yml b/examples/general/dubbo/go-client/profiles/test/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..c8b5c58691a0b35b55adb8f27cd1108433655b45
--- /dev/null
+++ b/examples/general/dubbo/go-client/profiles/test/client.yml
@@ -0,0 +1,83 @@
+# dubbo client yaml configure file
+
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info client"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "test"
+
+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 : "dubbo"
+ interface : "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods :
+ - name: "GetUser"
+ retries: 3
+ "UserProvider1":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ interface: "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 3
+ "UserProvider2":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ group: "as"
+ interface: "com.ikurento.user.UserProvider"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 3
+
+protocol_conf:
+ dubbo:
+ reconnect_interval: 0
+ connection_number: 2
+ heartbeat_period: "5s"
+ session_timeout: "20s"
+ pool_size: 64
+ pool_ttl: 600
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 10240
+ session_name: "client"
diff --git a/examples/jsonrpc/go-client/profiles/test/log.yml b/examples/general/dubbo/go-client/profiles/test/log.yml
similarity index 100%
rename from examples/jsonrpc/go-client/profiles/test/log.yml
rename to examples/general/dubbo/go-client/profiles/test/log.yml
diff --git a/examples/dubbo/go-server/app/app b/examples/general/dubbo/go-server/app/app
similarity index 100%
rename from examples/dubbo/go-server/app/app
rename to examples/general/dubbo/go-server/app/app
diff --git a/examples/dubbo/go-server/app/server.go b/examples/general/dubbo/go-server/app/server.go
similarity index 96%
rename from examples/dubbo/go-server/app/server.go
rename to examples/general/dubbo/go-server/app/server.go
index 5a591056d8c99a9da35328b0d9aae7bd4c32d53c..de9c28737b43cee780494c6f0824cabac84b6595 100644
--- a/examples/dubbo/go-server/app/server.go
+++ b/examples/general/dubbo/go-server/app/server.go
@@ -74,7 +74,7 @@ func initSignal() {
case syscall.SIGHUP:
// reload()
default:
- go time.AfterFunc(time.Duration(float64(survivalTimeout)*float64(time.Second)), func() {
+ go time.AfterFunc(time.Duration(survivalTimeout), func() {
logger.Warnf("app exit now by force...")
os.Exit(1)
})
diff --git a/examples/general/dubbo/go-server/app/user.go b/examples/general/dubbo/go-server/app/user.go
new file mode 100644
index 0000000000000000000000000000000000000000..ce53bca080e388c2ef8bb852a4ddc7f95a232d96
--- /dev/null
+++ b/examples/general/dubbo/go-server/app/user.go
@@ -0,0 +1,113 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+ "fmt"
+ "strconv"
+ "time"
+)
+
+import (
+ "github.com/apache/dubbo-go-hessian2"
+)
+
+type Gender hessian.JavaEnum
+
+const (
+ MAN hessian.JavaEnum = iota
+ WOMAN
+)
+
+var genderName = map[hessian.JavaEnum]string{
+ MAN: "MAN",
+ WOMAN: "WOMAN",
+}
+
+var genderValue = map[string]hessian.JavaEnum{
+ "MAN": MAN,
+ "WOMAN": WOMAN,
+}
+
+func (g Gender) JavaClassName() string {
+ return "com.ikurento.user.Gender"
+}
+
+func (g Gender) String() string {
+ s, ok := genderName[hessian.JavaEnum(g)]
+ if ok {
+ return s
+ }
+
+ return strconv.Itoa(int(g))
+}
+
+func (g Gender) EnumValue(s string) hessian.JavaEnum {
+ v, ok := genderValue[s]
+ if ok {
+ return v
+ }
+
+ return hessian.InvalidJavaEnum
+}
+
+type (
+ User struct {
+ // !!! Cannot define lowercase names of variable
+ Id string
+ Name string
+ Age int32
+ Time time.Time
+ Sex Gender // 注意此处,java enum Object <--> go string
+ }
+)
+
+var (
+ DefaultUser = User{
+ Id: "0", Name: "Alex Stocks", Age: 31,
+ Sex: Gender(MAN),
+ }
+
+ userMap = make(map[string]User)
+)
+
+func init() {
+ userMap["A000"] = DefaultUser
+ userMap["A001"] = User{Id: "001", Name: "ZhangSheng", Age: 18, Sex: Gender(MAN)}
+ userMap["A002"] = User{Id: "002", Name: "Lily", Age: 20, Sex: Gender(WOMAN)}
+ userMap["A003"] = User{Id: "113", Name: "Moorse", Age: 30, Sex: Gender(WOMAN)}
+ for k, v := range userMap {
+ v.Time = time.Now()
+ userMap[k] = v
+ }
+}
+
+func (u User) String() string {
+ return fmt.Sprintf(
+ "User{Id:%s, Name:%s, Age:%d, Time:%s, Sex:%s}",
+ u.Id, u.Name, u.Age, u.Time, u.Sex,
+ )
+}
+
+func (u User) JavaClassName() string {
+ return "com.ikurento.user.User"
+}
+
+func println(format string, args ...interface{}) {
+ fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
+}
diff --git a/examples/general/dubbo/go-server/app/user_provider.go b/examples/general/dubbo/go-server/app/user_provider.go
new file mode 100644
index 0000000000000000000000000000000000000000..fdf0a3abb2ac26cc2cbfa5971db3f02b18fe0be0
--- /dev/null
+++ b/examples/general/dubbo/go-server/app/user_provider.go
@@ -0,0 +1,102 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+)
+
+import (
+ "github.com/apache/dubbo-go-hessian2/java_exception"
+ "github.com/apache/dubbo-go/config"
+ perrors "github.com/pkg/errors"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider))
+}
+
+type UserProvider struct {
+}
+
+func (u *UserProvider) getUser(userId string) (*User, error) {
+ if user, ok := userMap[userId]; ok {
+ return &user, nil
+ }
+
+ return nil, fmt.Errorf("invalid user id:%s", userId)
+}
+
+func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+ var (
+ err error
+ user *User
+ )
+
+ println("req:%#v", req)
+ user, err = u.getUser(req[0].(string))
+ if err == nil {
+ *rsp = *user
+ println("rsp:%#v", rsp)
+ }
+ return err
+}
+
+func (u *UserProvider) GetUser0(id string, name string) (User, error) {
+ var err error
+
+ println("id:%s, name:%s", id, name)
+ user, err := u.getUser(id)
+ if err != nil {
+ return User{}, err
+ }
+ if user.Name != name {
+ return User{}, perrors.New("name is not " + user.Name)
+ }
+ return *user, err
+}
+
+func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+ var err error
+
+ println("req:%#v", req)
+ rsp.Id = strconv.Itoa(int(req[0].(int32)))
+ return err
+}
+
+func (u *UserProvider) GetUser3() error {
+ return nil
+}
+
+func (u *UserProvider) GetErr(ctx context.Context, req []interface{}, rsp *User) error {
+ return java_exception.NewThrowable("exception")
+}
+
+func (u *UserProvider) GetUsers(req []interface{}) ([]interface{}, error) {
+ var err error
+
+ println("req:%s", req)
+ t := req[0].([]interface{})
+ user, err := u.getUser(t[0].(string))
+ if err != nil {
+ return nil, err
+ }
+ println("user:%v", user)
+ user1, err := u.getUser(t[1].(string))
+ if err != nil {
+ return nil, err
+ }
+ println("user1:%v", user1)
+
+ return []interface{}{user, user1}, err
+}
+
+func (s *UserProvider) MethodMapper() map[string]string {
+ return map[string]string{
+ "GetUser2": "getUser",
+ }
+}
+
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
+}
diff --git a/examples/general/dubbo/go-server/app/user_provider1.go b/examples/general/dubbo/go-server/app/user_provider1.go
new file mode 100644
index 0000000000000000000000000000000000000000..3edc816b592f9e165f149a792a9401a25c8c73c0
--- /dev/null
+++ b/examples/general/dubbo/go-server/app/user_provider1.go
@@ -0,0 +1,88 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+)
+
+import (
+ "github.com/apache/dubbo-go-hessian2/java_exception"
+ "github.com/apache/dubbo-go/config"
+ perrors "github.com/pkg/errors"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider1))
+}
+
+type UserProvider1 struct {
+}
+
+func (u *UserProvider1) getUser(userId string) (*User, error) {
+ if user, ok := userMap[userId]; ok {
+ return &user, nil
+ }
+
+ return nil, fmt.Errorf("invalid user id:%s", userId)
+}
+
+func (u *UserProvider1) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+ var (
+ err error
+ user *User
+ )
+
+ println("req:%#v", req)
+ user, err = u.getUser(req[0].(string))
+ if err == nil {
+ *rsp = *user
+ println("rsp:%#v", rsp)
+ }
+ return err
+}
+
+func (u *UserProvider1) GetUser0(id string, name string) (User, error) {
+ var err error
+
+ println("id:%s, name:%s", id, name)
+ user, err := u.getUser(id)
+ if err != nil {
+ return User{}, err
+ }
+ if user.Name != name {
+ return User{}, perrors.New("name is not " + user.Name)
+ }
+ return *user, err
+}
+
+func (u *UserProvider1) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+ var err error
+
+ println("req:%#v", req)
+ rsp.Id = strconv.Itoa(int(req[0].(int32)))
+ return err
+}
+
+func (u *UserProvider1) GetUser3() error {
+ return nil
+}
+
+func (u *UserProvider1) GetErr(ctx context.Context, req []interface{}, rsp *User) error {
+ return java_exception.NewThrowable("exception")
+}
+
+func (u *UserProvider1) GetUsers(req []interface{}) ([]interface{}, error) {
+
+ return []interface{}{}, nil
+}
+
+func (s *UserProvider1) MethodMapper() map[string]string {
+ return map[string]string{
+ "GetUser2": "getUser",
+ }
+}
+
+func (u *UserProvider1) Reference() string {
+ return "UserProvider1"
+}
diff --git a/examples/general/dubbo/go-server/app/user_provider2.go b/examples/general/dubbo/go-server/app/user_provider2.go
new file mode 100644
index 0000000000000000000000000000000000000000..d28bcc33963ef73b372508e057679a5910948c25
--- /dev/null
+++ b/examples/general/dubbo/go-server/app/user_provider2.go
@@ -0,0 +1,97 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+)
+
+import (
+ "github.com/apache/dubbo-go-hessian2/java_exception"
+ "github.com/apache/dubbo-go/config"
+ perrors "github.com/pkg/errors"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider2))
+}
+
+type UserProvider2 struct {
+}
+
+func (u *UserProvider2) getUser(userId string) (*User, error) {
+ if user, ok := userMap[userId]; ok {
+ return &user, nil
+ }
+
+ return nil, fmt.Errorf("invalid user id:%s", userId)
+}
+
+func (u *UserProvider2) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+ var (
+ err error
+ user *User
+ )
+
+ println("req:%#v", req)
+ user, err = u.getUser(req[0].(string))
+ if err == nil {
+ *rsp = *user
+ println("rsp:%#v", rsp)
+ }
+ return err
+}
+
+func (u *UserProvider2) GetUser0(id string, name string) (User, error) {
+ var err error
+
+ println("id:%s, name:%s", id, name)
+ user, err := u.getUser(id)
+ if err != nil {
+ return User{}, err
+ }
+ if user.Name != name {
+ return User{}, perrors.New("name is not " + user.Name)
+ }
+ return *user, err
+}
+
+func (u *UserProvider2) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+ var err error
+
+ println("req:%#v", req)
+ rsp.Id = strconv.Itoa(int(req[0].(int32)))
+ return err
+}
+
+func (u *UserProvider2) GetUser3() error {
+ return nil
+}
+
+func (u *UserProvider2) GetErr(ctx context.Context, req []interface{}, rsp *User) error {
+ return java_exception.NewThrowable("exception")
+}
+
+func (u *UserProvider2) GetUsers(req []interface{}) ([]interface{}, error) {
+ var err error
+
+ println("req:%s", req)
+ t := req[0].([]interface{})
+ user, err := u.getUser(t[0].(string))
+ if err != nil {
+ return nil, err
+ }
+ println("user:%v", user)
+
+ return []interface{}{user}, err
+}
+
+func (s *UserProvider2) MethodMapper() map[string]string {
+ return map[string]string{
+ "GetUser2": "getUser",
+ }
+}
+
+func (u *UserProvider2) Reference() string {
+ return "UserProvider2"
+}
diff --git a/examples/jsonrpc/go-server/app/version.go b/examples/general/dubbo/go-server/app/version.go
similarity index 100%
rename from examples/jsonrpc/go-server/app/version.go
rename to examples/general/dubbo/go-server/app/version.go
diff --git a/examples/jsonrpc/go-server/assembly/bin/load.sh b/examples/general/dubbo/go-server/assembly/bin/load.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/bin/load.sh
rename to examples/general/dubbo/go-server/assembly/bin/load.sh
diff --git a/examples/jsonrpc/go-server/assembly/common/app.properties b/examples/general/dubbo/go-server/assembly/common/app.properties
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/common/app.properties
rename to examples/general/dubbo/go-server/assembly/common/app.properties
diff --git a/examples/jsonrpc/go-server/assembly/common/build.sh b/examples/general/dubbo/go-server/assembly/common/build.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/common/build.sh
rename to examples/general/dubbo/go-server/assembly/common/build.sh
diff --git a/examples/jsonrpc/go-server/assembly/linux/dev.sh b/examples/general/dubbo/go-server/assembly/linux/dev.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/linux/dev.sh
rename to examples/general/dubbo/go-server/assembly/linux/dev.sh
diff --git a/examples/jsonrpc/go-server/assembly/linux/release.sh b/examples/general/dubbo/go-server/assembly/linux/release.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/linux/release.sh
rename to examples/general/dubbo/go-server/assembly/linux/release.sh
diff --git a/examples/jsonrpc/go-server/assembly/linux/test.sh b/examples/general/dubbo/go-server/assembly/linux/test.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/linux/test.sh
rename to examples/general/dubbo/go-server/assembly/linux/test.sh
diff --git a/examples/jsonrpc/go-server/assembly/mac/dev.sh b/examples/general/dubbo/go-server/assembly/mac/dev.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/mac/dev.sh
rename to examples/general/dubbo/go-server/assembly/mac/dev.sh
diff --git a/examples/jsonrpc/go-server/assembly/mac/release.sh b/examples/general/dubbo/go-server/assembly/mac/release.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/mac/release.sh
rename to examples/general/dubbo/go-server/assembly/mac/release.sh
diff --git a/examples/jsonrpc/go-server/assembly/mac/test.sh b/examples/general/dubbo/go-server/assembly/mac/test.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/mac/test.sh
rename to examples/general/dubbo/go-server/assembly/mac/test.sh
diff --git a/examples/jsonrpc/go-server/assembly/windows/dev.sh b/examples/general/dubbo/go-server/assembly/windows/dev.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/windows/dev.sh
rename to examples/general/dubbo/go-server/assembly/windows/dev.sh
diff --git a/examples/jsonrpc/go-server/assembly/windows/release.sh b/examples/general/dubbo/go-server/assembly/windows/release.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/windows/release.sh
rename to examples/general/dubbo/go-server/assembly/windows/release.sh
diff --git a/examples/jsonrpc/go-server/assembly/windows/test.sh b/examples/general/dubbo/go-server/assembly/windows/test.sh
similarity index 100%
rename from examples/jsonrpc/go-server/assembly/windows/test.sh
rename to examples/general/dubbo/go-server/assembly/windows/test.sh
diff --git a/examples/jsonrpc/go-server/profiles/dev/log.yml b/examples/general/dubbo/go-server/profiles/dev/log.yml
similarity index 100%
rename from examples/jsonrpc/go-server/profiles/dev/log.yml
rename to examples/general/dubbo/go-server/profiles/dev/log.yml
diff --git a/examples/general/dubbo/go-server/profiles/dev/server.yml b/examples/general/dubbo/go-server/profiles/dev/server.yml
new file mode 100644
index 0000000000000000000000000000000000000000..79c2cb2cc22a1b626a631009a0a4c6f29a8f9127
--- /dev/null
+++ b/examples/general/dubbo/go-server/profiles/dev/server.yml
@@ -0,0 +1,92 @@
+# dubbo server yaml configure file
+
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info server"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "dev"
+
+registries :
+ "hangzhouzk":
+ # 对应java配置中address属性的zookeeper <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
+ 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 : "dubbo"
+ # 相当于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: "dubbo"
+ version: "2.0"
+ interface: "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
+ "UserProvider2":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ group: "as"
+ interface: "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
+
+protocols:
+ "dubbo1":
+ name: "dubbo"
+ # ip : "127.0.0.1"
+ port: 20000
+
+
+protocol_conf:
+ dubbo:
+ session_number: 700
+ session_timeout: "20s"
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 1024
+ session_name: "server"
diff --git a/examples/jsonrpc/go-server/profiles/release/log.yml b/examples/general/dubbo/go-server/profiles/release/log.yml
similarity index 100%
rename from examples/jsonrpc/go-server/profiles/release/log.yml
rename to examples/general/dubbo/go-server/profiles/release/log.yml
diff --git a/examples/dubbo/go-server/profiles/dev/server.yml b/examples/general/dubbo/go-server/profiles/release/server.yml
similarity index 69%
rename from examples/dubbo/go-server/profiles/dev/server.yml
rename to examples/general/dubbo/go-server/profiles/release/server.yml
index bc4b288542322c8644c7af643dcb8dfafa099b1a..6890ed3bdb5048b02578ca8eba1620464378463c 100644
--- a/examples/dubbo/go-server/profiles/dev/server.yml
+++ b/examples/general/dubbo/go-server/profiles/release/server.yml
@@ -8,11 +8,10 @@ application_config:
module : "dubbogo user-info server"
version : "0.0.1"
owner : "ZX"
- environment : "dev"
+ environment : "release"
registries :
"hangzhouzk":
- # 对应java配置中address属性的zookeeper <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
protocol: "zookeeper"
timeout : "3s"
address: "127.0.0.1:2181"
@@ -27,7 +26,6 @@ registries :
services:
-
"UserProvider":
# 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
registry: "hangzhouzk"
@@ -41,6 +39,31 @@ services:
- name: "GetUser"
retries: 1
loadbalance: "random"
+ "UserProvider1":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ interface: "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
+ "UserProvider2":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ group: "as"
+ interface: "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
protocols:
"dubbo1":
@@ -52,7 +75,6 @@ protocols:
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
getty_session_param:
compress_encoding: false
@@ -61,7 +83,6 @@ protocol_conf:
keep_alive_period: "120s"
tcp_r_buf_size: 262144
tcp_w_buf_size: 65536
- pkg_rq_size: 1024
pkg_wq_size: 512
tcp_read_timeout: "1s"
tcp_write_timeout: "5s"
diff --git a/examples/jsonrpc/go-server/profiles/test/log.yml b/examples/general/dubbo/go-server/profiles/test/log.yml
similarity index 100%
rename from examples/jsonrpc/go-server/profiles/test/log.yml
rename to examples/general/dubbo/go-server/profiles/test/log.yml
diff --git a/examples/general/dubbo/go-server/profiles/test/server.yml b/examples/general/dubbo/go-server/profiles/test/server.yml
new file mode 100644
index 0000000000000000000000000000000000000000..b6dd41da448d7531a3c5f4f24a8f460e5d1775bc
--- /dev/null
+++ b/examples/general/dubbo/go-server/profiles/test/server.yml
@@ -0,0 +1,91 @@
+# dubbo server yaml configure file
+
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info server"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "test"
+
+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 : "dubbo"
+ # 相当于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: "dubbo"
+ version: "2.0"
+ interface: "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
+ "UserProvider2":
+ registry: "hangzhouzk"
+ protocol: "dubbo"
+ version: "2.0"
+ group: "as"
+ interface: "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
+
+protocols:
+ "dubbo1":
+ name: "dubbo"
+ # ip : "127.0.0.1"
+ port: 20000
+
+
+protocol_conf:
+ dubbo:
+ session_number: 700
+ session_timeout: "20s"
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 1024
+ session_name: "server"
diff --git a/examples/dubbo/java-client/build.sh b/examples/general/dubbo/java-client/build.sh
similarity index 100%
rename from examples/dubbo/java-client/build.sh
rename to examples/general/dubbo/java-client/build.sh
diff --git a/examples/dubbo/java-client/pom.xml b/examples/general/dubbo/java-client/pom.xml
similarity index 100%
rename from examples/dubbo/java-client/pom.xml
rename to examples/general/dubbo/java-client/pom.xml
diff --git a/examples/dubbo/java-client/src/main/assembly/assembly.xml b/examples/general/dubbo/java-client/src/main/assembly/assembly.xml
similarity index 100%
rename from examples/dubbo/java-client/src/main/assembly/assembly.xml
rename to examples/general/dubbo/java-client/src/main/assembly/assembly.xml
diff --git a/examples/dubbo/java-client/src/main/assembly/conf/dubbo.properties b/examples/general/dubbo/java-client/src/main/assembly/conf/dubbo.properties
similarity index 100%
rename from examples/dubbo/java-client/src/main/assembly/conf/dubbo.properties
rename to examples/general/dubbo/java-client/src/main/assembly/conf/dubbo.properties
diff --git a/examples/dubbo/java-client/src/main/assembly/conf/log4j.properties b/examples/general/dubbo/java-client/src/main/assembly/conf/log4j.properties
similarity index 100%
rename from examples/dubbo/java-client/src/main/assembly/conf/log4j.properties
rename to examples/general/dubbo/java-client/src/main/assembly/conf/log4j.properties
diff --git a/examples/general/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/general/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
new file mode 100644
index 0000000000000000000000000000000000000000..9122a629f49cb1e5eeee1641e89fa0c91091e960
--- /dev/null
+++ b/examples/general/dubbo/java-client/src/main/java/com/ikurento/user/Consumer.java
@@ -0,0 +1,208 @@
+// *****************************************************
+// DESC : dubbo consumer
+// AUTHOR : writtey by 包增辉(https://github.com/baozh)
+// VERSION : 1.0
+// LICENCE : Apache License 2.0
+// EMAIL : alexstocks@foxmail.com
+// MOD : 2016-10-19 17:03
+// FILE : Consumer.java
+// ******************************************************
+
+package com.ikurento.user;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import com.alibaba.dubbo.rpc.service.EchoService;
+import java.util.List;
+
+public class Consumer {
+ //定义一个私有变量 (Spring中要求)
+ private UserProvider userProvider;
+ private UserProvider userProvider1;
+ private UserProvider userProvider2;
+
+ //Spring注入(Spring中要求)
+ public void setUserProvider(UserProvider u) {
+ this.userProvider = u;
+ }
+ public void setUserProvider1(UserProvider u) {
+ this.userProvider1 = u;
+ }
+ public void setUserProvider2(UserProvider u) {
+ this.userProvider2 = u;
+ }
+
+ //启动consumer的入口函数(在配置文件中指定)
+ public void start() throws Exception {
+ System.out.println("\n\ntest");
+ testGetUser();
+ testGetUsers();
+ System.out.println("\n\ntest1");
+ testGetUser1();
+ testGetUsers1();
+ System.out.println("\n\ntest2");
+ testGetUser2();
+ testGetUsers2();
+ Thread.sleep(2000);
+ }
+
+ private void testGetUser() throws Exception {
+ try {
+ EchoService echoService = (EchoService)userProvider;
+ Object status = echoService.$echo("OK");
+ System.out.println("echo: "+status);
+ User user1 = userProvider.GetUser("A003");
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
+ + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
+ User user2 = userProvider.GetUser0("A003","Moorse");
+ 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 user3 = userProvider.getUser(1);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
+ userProvider.GetUser3();
+ System.out.println("GetUser3 succ");
+
+ 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 {
+ try {
+ List<String> userIDList = new ArrayList<String>();
+ userIDList.add("A001");
+ userIDList.add("A002");
+ userIDList.add("A003");
+
+ List<User> userList = userProvider.GetUsers(userIDList);
+
+ for (int i = 0; i < userList.size(); i++) {
+ User user = userList.get(i);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
+ + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUser1() throws Exception {
+ try {
+ EchoService echoService = (EchoService)userProvider1;
+ Object status = echoService.$echo("OK");
+ System.out.println("echo: "+status);
+ User user1 = userProvider1.GetUser("A003");
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
+ + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
+ User user2 = userProvider1.GetUser0("A003","Moorse");
+ 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 user3 = userProvider1.getUser(1);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
+ userProvider1.GetUser3();
+ System.out.println("GetUser3 succ");
+
+ User user9 = userProvider1.GetUser1("A003");
+ } catch (Exception e) {
+ System.out.println("*************exception***********");
+ e.printStackTrace();
+ }
+ try {
+ userProvider1.GetErr("A003");
+ } catch (Throwable t) {
+ System.out.println("*************exception***********");
+ t.printStackTrace();
+ }
+ }
+
+ private void testGetUsers1() throws Exception {
+ try {
+ List<String> userIDList = new ArrayList<String>();
+ userIDList.add("A001");
+ userIDList.add("A002");
+ userIDList.add("A003");
+
+ List<User> userList = userProvider1.GetUsers(userIDList);
+
+ for (int i = 0; i < userList.size(); i++) {
+ User user = userList.get(i);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
+ + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUser2() throws Exception {
+ try {
+ EchoService echoService = (EchoService)userProvider2;
+ Object status = echoService.$echo("OK");
+ System.out.println("echo: "+status);
+ User user1 = userProvider2.GetUser("A003");
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
+ + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
+ User user2 = userProvider2.GetUser0("A003","Moorse");
+ 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 user3 = userProvider2.getUser(1);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
+ userProvider2.GetUser3();
+ System.out.println("GetUser3 succ");
+
+ User user9 = userProvider2.GetUser1("A003");
+ } catch (Exception e) {
+ System.out.println("*************exception***********");
+ e.printStackTrace();
+ }
+ try {
+ userProvider2.GetErr("A003");
+ } catch (Throwable t) {
+ System.out.println("*************exception***********");
+ t.printStackTrace();
+ }
+ }
+
+ private void testGetUsers2() throws Exception {
+ try {
+ List<String> userIDList = new ArrayList<String>();
+ userIDList.add("A001");
+ userIDList.add("A002");
+ userIDList.add("A003");
+
+ List<User> userList = userProvider2.GetUsers(userIDList);
+
+ for (int i = 0; i < userList.size(); i++) {
+ User user = userList.get(i);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
+ + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/Gender.java b/examples/general/dubbo/java-client/src/main/java/com/ikurento/user/Gender.java
similarity index 100%
rename from examples/dubbo/java-client/src/main/java/com/ikurento/user/Gender.java
rename to examples/general/dubbo/java-client/src/main/java/com/ikurento/user/Gender.java
diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/User.java b/examples/general/dubbo/java-client/src/main/java/com/ikurento/user/User.java
similarity index 100%
rename from examples/dubbo/java-client/src/main/java/com/ikurento/user/User.java
rename to examples/general/dubbo/java-client/src/main/java/com/ikurento/user/User.java
diff --git a/examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java b/examples/general/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java
similarity index 100%
rename from examples/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java
rename to examples/general/dubbo/java-client/src/main/java/com/ikurento/user/UserProvider.java
diff --git a/examples/dubbo/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml b/examples/general/dubbo/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
similarity index 84%
rename from examples/dubbo/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
rename to examples/general/dubbo/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
index 727007257fc5bb1e4d1aa73cfca8aa804a766e93..e7e5445a951614f599a63029f6d42508aaa4fccf 100644
--- a/examples/dubbo/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
+++ b/examples/general/dubbo/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
@@ -33,9 +33,12 @@
<dubbo:protocol id="jsonrpc" name="jsonrpc" />
<!-- 声明需要使用的服务接口 -->
- <!--<dubbo:reference id="userProvider" protocol="jsonrpc" interface="com.ikurento.user.UserProvider">-->
<dubbo:reference registry="ikurento" check="false" id="userProvider" protocol="dubbo" interface="com.ikurento.user.UserProvider">
<!--<dubbo:parameter key="heartbeat" value="10000"/ -->
</dubbo:reference>
+ <dubbo:reference registry="ikurento" check="false" id="userProvider1" protocol="dubbo" version="2.0" interface="com.ikurento.user.UserProvider">
+ </dubbo:reference>
+ <dubbo:reference registry="ikurento" check="false" id="userProvider2" protocol="dubbo" version="2.0" group="as" interface="com.ikurento.user.UserProvider">
+ </dubbo:reference>
</beans>
diff --git a/examples/jsonrpc/java-client/src/main/resources/META-INF/spring/service.xml b/examples/general/dubbo/java-client/src/main/resources/META-INF/spring/service.xml
similarity index 90%
rename from examples/jsonrpc/java-client/src/main/resources/META-INF/spring/service.xml
rename to examples/general/dubbo/java-client/src/main/resources/META-INF/spring/service.xml
index 625a879f97f5a21498be1efc1aa97fce68e76c61..db9fc3cba5a359b8835af53b81e50f8296d2e489 100644
--- a/examples/jsonrpc/java-client/src/main/resources/META-INF/spring/service.xml
+++ b/examples/general/dubbo/java-client/src/main/resources/META-INF/spring/service.xml
@@ -24,6 +24,8 @@
<bean class="com.ikurento.user.Consumer" init-method="start">
<!-- 声明这个类 要使用的服务名-->
<property name="userProvider" ref="userProvider" />
+ <property name="userProvider1" ref="userProvider1" />
+ <property name="userProvider2" ref="userProvider2" />
</bean>
<!-- App config -->
diff --git a/examples/dubbo/java-client/src/main/resources/log4j.properties b/examples/general/dubbo/java-client/src/main/resources/log4j.properties
similarity index 100%
rename from examples/dubbo/java-client/src/main/resources/log4j.properties
rename to examples/general/dubbo/java-client/src/main/resources/log4j.properties
diff --git a/examples/dubbo/java-server/build.sh b/examples/general/dubbo/java-server/build.sh
similarity index 100%
rename from examples/dubbo/java-server/build.sh
rename to examples/general/dubbo/java-server/build.sh
diff --git a/examples/dubbo/java-server/pom.xml b/examples/general/dubbo/java-server/pom.xml
similarity index 100%
rename from examples/dubbo/java-server/pom.xml
rename to examples/general/dubbo/java-server/pom.xml
diff --git a/examples/dubbo/java-server/script/debug.sh b/examples/general/dubbo/java-server/script/debug.sh
similarity index 100%
rename from examples/dubbo/java-server/script/debug.sh
rename to examples/general/dubbo/java-server/script/debug.sh
diff --git a/examples/dubbo/java-server/src/main/assembly/assembly.xml b/examples/general/dubbo/java-server/src/main/assembly/assembly.xml
similarity index 100%
rename from examples/dubbo/java-server/src/main/assembly/assembly.xml
rename to examples/general/dubbo/java-server/src/main/assembly/assembly.xml
diff --git a/examples/dubbo/java-server/src/main/assembly/conf/dubbo.properties b/examples/general/dubbo/java-server/src/main/assembly/conf/dubbo.properties
similarity index 100%
rename from examples/dubbo/java-server/src/main/assembly/conf/dubbo.properties
rename to examples/general/dubbo/java-server/src/main/assembly/conf/dubbo.properties
diff --git a/examples/dubbo/java-server/src/main/assembly/conf/log4j.properties b/examples/general/dubbo/java-server/src/main/assembly/conf/log4j.properties
similarity index 100%
rename from examples/dubbo/java-server/src/main/assembly/conf/log4j.properties
rename to examples/general/dubbo/java-server/src/main/assembly/conf/log4j.properties
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/Gender.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/Gender.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/Gender.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/Gender.java
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/Response.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/Response.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/Response.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/Response.java
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/User.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/User.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/User.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/User.java
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
diff --git a/examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/general/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
similarity index 100%
rename from examples/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
rename to examples/general/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
diff --git a/examples/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml b/examples/general/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
similarity index 100%
rename from examples/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
rename to examples/general/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
diff --git a/examples/dubbo/java-server/src/main/resources/log4j.properties b/examples/general/dubbo/java-server/src/main/resources/log4j.properties
similarity index 100%
rename from examples/dubbo/java-server/src/main/resources/log4j.properties
rename to examples/general/dubbo/java-server/src/main/resources/log4j.properties
diff --git a/examples/jsonrpc/go-client/app/client.go b/examples/general/jsonrpc/go-client/app/client.go
similarity index 54%
rename from examples/jsonrpc/go-client/app/client.go
rename to examples/general/jsonrpc/go-client/app/client.go
index 478a88d19404be612c1caf6be4885edc01bb414b..b781f860bc41cdc616f8836499d584056c29af43 100644
--- a/examples/jsonrpc/go-client/app/client.go
+++ b/examples/general/jsonrpc/go-client/app/client.go
@@ -51,6 +51,45 @@ func main() {
config.Load()
+ println("\n\ntest")
+ test()
+ println("\n\ntest1")
+ test1()
+ println("\n\ntest2")
+ test2()
+
+ initSignal()
+}
+
+func initSignal() {
+ signals := make(chan os.Signal, 1)
+ // It is not possible to block SIGKILL or syscall.SIGSTOP
+ signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP,
+ syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
+ for {
+ sig := <-signals
+ logger.Infof("get signal %s", sig.String())
+ switch sig {
+ case syscall.SIGHUP:
+ // reload()
+ default:
+ go time.AfterFunc(time.Duration(survivalTimeout), func() {
+ logger.Warnf("app exit now by force...")
+ os.Exit(1)
+ })
+
+ // 要么fastFailTimeout时间内执行完毕下面的逻辑然后程序退出,要么执行上面的超时函数程序强行退出
+ fmt.Println("app exit now...")
+ return
+ }
+ }
+}
+
+func println(format string, args ...interface{}) {
+ fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
+}
+
+func test() {
println("\n\n\necho")
res, err := userProvider.Echo(context.TODO(), "OK")
if err != nil {
@@ -100,37 +139,120 @@ func main() {
println("\n\n\nstart to test jsonrpc illegal method")
err = userProvider.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("error: %v", err)
+}
+
+func test1() {
+ println("\n\n\necho")
+ res, err := userProvider1.Echo(context.TODO(), "OK")
+ if err != nil {
+ println("echo - error: %v", err)
+ } else {
+ println("res: %v", res)
+ }
+
+ time.Sleep(3e9)
+
+ println("\n\n\nstart to test jsonrpc")
+ user := &JsonRPCUser{}
+ err = userProvider1.GetUser(context.TODO(), []interface{}{"A003"}, user)
if err != nil {
panic(err)
}
+ println("response result: %v", user)
- initSignal()
-}
+ println("\n\n\nstart to test jsonrpc - GetUser0")
+ ret, err := userProvider1.GetUser0("A003", "Moorse")
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret)
-func initSignal() {
- signals := make(chan os.Signal, 1)
- // It is not possible to block SIGKILL or syscall.SIGSTOP
- signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP,
- syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
- for {
- sig := <-signals
- logger.Infof("get signal %s", sig.String())
- switch sig {
- case syscall.SIGHUP:
- // reload()
- default:
- go time.AfterFunc(time.Duration(survivalTimeout)*time.Second, func() {
- logger.Warnf("app exit now by force...")
- os.Exit(1)
- })
+ println("\n\n\nstart to test jsonrpc - GetUsers")
+ ret1, err := userProvider1.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret1)
- // 要么fastFailTimeout时间内执行完毕下面的逻辑然后程序退出,要么执行上面的超时函数程序强行退出
- fmt.Println("app exit now...")
- return
- }
+ println("\n\n\nstart to test jsonrpc - getUser")
+ user = &JsonRPCUser{}
+ err = userProvider1.GetUser2(context.TODO(), []interface{}{1}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
+
+ println("\n\n\nstart to test jsonrpc - GetUser3")
+ err = userProvider1.GetUser3()
+ if err != nil {
+ panic(err)
}
+ println("succ!")
+
+ println("\n\n\nstart to test jsonrpc illegal method")
+ err = userProvider1.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("error: %v", err)
}
-func println(format string, args ...interface{}) {
- fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
+func test2() {
+ println("\n\n\necho")
+ res, err := userProvider2.Echo(context.TODO(), "OK")
+ if err != nil {
+ println("echo - error: %v", err)
+ } else {
+ println("res: %v", res)
+ }
+
+ time.Sleep(3e9)
+
+ println("\n\n\nstart to test jsonrpc")
+ user := &JsonRPCUser{}
+ err = userProvider2.GetUser(context.TODO(), []interface{}{"A003"}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
+
+ println("\n\n\nstart to test jsonrpc - GetUser0")
+ ret, err := userProvider2.GetUser0("A003", "Moorse")
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret)
+
+ println("\n\n\nstart to test jsonrpc - GetUsers")
+ ret1, err := userProvider2.GetUsers([]interface{}{[]interface{}{"A002", "A003"}})
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", ret1)
+
+ println("\n\n\nstart to test jsonrpc - getUser")
+ user = &JsonRPCUser{}
+ err = userProvider2.GetUser2(context.TODO(), []interface{}{1}, user)
+ if err != nil {
+ panic(err)
+ }
+ println("response result: %v", user)
+
+ println("\n\n\nstart to test jsonrpc - GetUser3")
+ err = userProvider2.GetUser3()
+ if err != nil {
+ panic(err)
+ }
+ println("succ!")
+
+ println("\n\n\nstart to test jsonrpc illegal method")
+ err = userProvider2.GetUser1(context.TODO(), []interface{}{"A003"}, user)
+ if err == nil {
+ panic("err is nil")
+ }
+ println("error: %v", err)
}
diff --git a/examples/jsonrpc/with-configcenter-go-client/app/user.go b/examples/general/jsonrpc/go-client/app/user.go
similarity index 55%
rename from examples/jsonrpc/with-configcenter-go-client/app/user.go
rename to examples/general/jsonrpc/go-client/app/user.go
index ca98b1af0b3c1379c73623162546db9fb4fc95d6..c6fdbe13a8533c1bfb5ac4d442ef0c3ec968c298 100644
--- a/examples/jsonrpc/with-configcenter-go-client/app/user.go
+++ b/examples/general/jsonrpc/go-client/app/user.go
@@ -27,10 +27,16 @@ import (
"github.com/apache/dubbo-go/config"
)
-var userProvider = new(UserProvider)
+var (
+ userProvider = new(UserProvider)
+ userProvider1 = new(UserProvider1)
+ userProvider2 = new(UserProvider2)
+)
func init() {
config.SetConsumerService(userProvider)
+ config.SetConsumerService(userProvider1)
+ config.SetConsumerService(userProvider2)
}
type JsonRPCUser struct {
@@ -58,10 +64,34 @@ type UserProvider struct {
Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
+func (u *UserProvider) Reference() string {
+ return "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"`
+ GetUser3 func() error
+ Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
+}
+
+func (u *UserProvider1) Reference() string {
+ return "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"`
+ GetUser3 func() error
+ Echo func(ctx context.Context, req interface{}) (interface{}, error) // Echo represent EchoFilter will be used
}
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider2) Reference() string {
+ return "UserProvider2"
}
diff --git a/examples/jsonrpc/with-configcenter-go-client/app/version.go b/examples/general/jsonrpc/go-client/app/version.go
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/app/version.go
rename to examples/general/jsonrpc/go-client/app/version.go
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/bin/load.sh b/examples/general/jsonrpc/go-client/assembly/bin/load.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/bin/load.sh
rename to examples/general/jsonrpc/go-client/assembly/bin/load.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/common/app.properties b/examples/general/jsonrpc/go-client/assembly/common/app.properties
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/common/app.properties
rename to examples/general/jsonrpc/go-client/assembly/common/app.properties
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/common/build.sh b/examples/general/jsonrpc/go-client/assembly/common/build.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/common/build.sh
rename to examples/general/jsonrpc/go-client/assembly/common/build.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/linux/dev.sh b/examples/general/jsonrpc/go-client/assembly/linux/dev.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/linux/dev.sh
rename to examples/general/jsonrpc/go-client/assembly/linux/dev.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/linux/release.sh b/examples/general/jsonrpc/go-client/assembly/linux/release.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/linux/release.sh
rename to examples/general/jsonrpc/go-client/assembly/linux/release.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/linux/test.sh b/examples/general/jsonrpc/go-client/assembly/linux/test.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/linux/test.sh
rename to examples/general/jsonrpc/go-client/assembly/linux/test.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/mac/dev.sh b/examples/general/jsonrpc/go-client/assembly/mac/dev.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/mac/dev.sh
rename to examples/general/jsonrpc/go-client/assembly/mac/dev.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/mac/release.sh b/examples/general/jsonrpc/go-client/assembly/mac/release.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/mac/release.sh
rename to examples/general/jsonrpc/go-client/assembly/mac/release.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/mac/test.sh b/examples/general/jsonrpc/go-client/assembly/mac/test.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/mac/test.sh
rename to examples/general/jsonrpc/go-client/assembly/mac/test.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/windows/dev.sh b/examples/general/jsonrpc/go-client/assembly/windows/dev.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/windows/dev.sh
rename to examples/general/jsonrpc/go-client/assembly/windows/dev.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/windows/release.sh b/examples/general/jsonrpc/go-client/assembly/windows/release.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/windows/release.sh
rename to examples/general/jsonrpc/go-client/assembly/windows/release.sh
diff --git a/examples/jsonrpc/with-configcenter-go-client/assembly/windows/test.sh b/examples/general/jsonrpc/go-client/assembly/windows/test.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/assembly/windows/test.sh
rename to examples/general/jsonrpc/go-client/assembly/windows/test.sh
diff --git a/examples/general/jsonrpc/go-client/profiles/dev/client.yml b/examples/general/jsonrpc/go-client/profiles/dev/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..788e06eecd6014eefaf12913b6394e5e0a95efdf
--- /dev/null
+++ b/examples/general/jsonrpc/go-client/profiles/dev/client.yml
@@ -0,0 +1,60 @@
+# dubbo client yaml configure file
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ 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/examples/jsonrpc/with-configcenter-go-client/profiles/dev/log.yml b/examples/general/jsonrpc/go-client/profiles/dev/log.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/profiles/dev/log.yml
rename to examples/general/jsonrpc/go-client/profiles/dev/log.yml
diff --git a/examples/jsonrpc/go-client/profiles/release/client.yml b/examples/general/jsonrpc/go-client/profiles/release/client.yml
similarity index 59%
rename from examples/jsonrpc/go-client/profiles/release/client.yml
rename to examples/general/jsonrpc/go-client/profiles/release/client.yml
index 3b82dd07bd0b41ace267721d151238c71beaa5a4..0084e5b04d48fea480f22df8e031eb91e1d6e835 100644
--- a/examples/jsonrpc/go-client/profiles/release/client.yml
+++ b/examples/general/jsonrpc/go-client/profiles/release/client.yml
@@ -34,34 +34,27 @@ references:
# 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
registry: "hangzhouzk"
protocol : "jsonrpc"
-# version : "2.0"
-# group: "as"
interface : "com.ikurento.user.UserProvider"
cluster: "failover"
methods :
- name: "GetUser"
retries: 3
-
-protocol_conf:
- dubbo:
- reconnect_interval: 0
- connection_number: 2
- heartbeat_period: "5s"
- session_timeout: "20s"
- fail_fast_timeout: "5s"
- pool_size: 64
- pool_ttl: 600
- getty_session_param:
- compress_encoding: false
- tcp_no_delay: true
- tcp_keep_alive: true
- keep_alive_period: "120s"
- tcp_r_buf_size: 262144
- tcp_w_buf_size: 65536
- pkg_rq_size: 1024
- pkg_wq_size: 512
- tcp_read_timeout: "1s"
- tcp_write_timeout: "5s"
- wait_timeout: "1s"
- max_msg_len: 10240
- session_name: "client"
+ "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/examples/jsonrpc/with-configcenter-go-client/profiles/release/log.yml b/examples/general/jsonrpc/go-client/profiles/release/log.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/profiles/release/log.yml
rename to examples/general/jsonrpc/go-client/profiles/release/log.yml
diff --git a/examples/general/jsonrpc/go-client/profiles/test/client.yml b/examples/general/jsonrpc/go-client/profiles/test/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3efdedad4ab8acffb9d8724273deb8c12117837d
--- /dev/null
+++ b/examples/general/jsonrpc/go-client/profiles/test/client.yml
@@ -0,0 +1,60 @@
+# dubbo client yaml configure file
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info client"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "test"
+
+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/examples/jsonrpc/with-configcenter-go-client/profiles/test/log.yml b/examples/general/jsonrpc/go-client/profiles/test/log.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-client/profiles/test/log.yml
rename to examples/general/jsonrpc/go-client/profiles/test/log.yml
diff --git a/examples/jsonrpc/go-server/app/server.go b/examples/general/jsonrpc/go-server/app/server.go
similarity index 95%
rename from examples/jsonrpc/go-server/app/server.go
rename to examples/general/jsonrpc/go-server/app/server.go
index 8a226e23ad74960612ef1cfe2f82740a6e7516d8..231082b5b4accbbb9aa78b2241416f0c8014c5ef 100644
--- a/examples/jsonrpc/go-server/app/server.go
+++ b/examples/general/jsonrpc/go-server/app/server.go
@@ -64,7 +64,7 @@ func initSignal() {
case syscall.SIGHUP:
// reload()
default:
- go time.AfterFunc(time.Duration(float64(survivalTimeout)*float64(time.Second)), func() {
+ go time.AfterFunc(time.Duration(survivalTimeout), func() {
logger.Warnf("app exit now by force...")
os.Exit(1)
})
diff --git a/examples/general/jsonrpc/go-server/app/user.go b/examples/general/jsonrpc/go-server/app/user.go
new file mode 100644
index 0000000000000000000000000000000000000000..837661003e75f1d8c2d5442c756f45cb32f5d590
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/app/user.go
@@ -0,0 +1,78 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+ "fmt"
+ "time"
+)
+
+type Gender int
+
+const (
+ MAN = iota
+ WOMAN
+)
+
+var genderStrings = [...]string{
+ "MAN",
+ "WOMAN",
+}
+
+func (g Gender) String() string {
+ return genderStrings[g]
+}
+
+type (
+ User struct {
+ Id string `json:"id"`
+ Name string `json:"name"`
+ Age int `json:"age"`
+ sex Gender
+ Birth int `json:"time"`
+ Sex string `json:"sex"`
+ }
+)
+
+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),
+ }
+
+ userMap = make(map[string]User)
+)
+
+func init() {
+ DefaultUser.Sex = DefaultUser.sex.String()
+ userMap["A000"] = DefaultUser
+ userMap["A001"] = User{Id: "001", Name: "ZhangSheng", Age: 18, sex: MAN}
+ userMap["A002"] = User{Id: "002", Name: "Lily", Age: 20, sex: WOMAN}
+ userMap["A003"] = User{Id: "113", Name: "Moorse", Age: 30, sex: MAN}
+ for k, v := range userMap {
+ v.Birth = int(time.Now().AddDate(-1*v.Age, 0, 0).Unix())
+ v.Sex = userMap[k].sex.String()
+ userMap[k] = v
+ }
+}
+
+func println(format string, args ...interface{}) {
+ fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
+}
diff --git a/examples/general/jsonrpc/go-server/app/user_provider.go b/examples/general/jsonrpc/go-server/app/user_provider.go
new file mode 100644
index 0000000000000000000000000000000000000000..4af4bb040484eb8613c50545e93312aa232f7de2
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/app/user_provider.go
@@ -0,0 +1,98 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+)
+
+import (
+ "github.com/apache/dubbo-go/config"
+ perrors "github.com/pkg/errors"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider))
+}
+
+type UserProvider struct {
+}
+
+func (u *UserProvider) getUser(userId string) (*User, error) {
+ if user, ok := userMap[userId]; ok {
+ return &user, nil
+ }
+
+ return nil, fmt.Errorf("invalid user id:%s", userId)
+}
+
+func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+ var (
+ err error
+ user *User
+ )
+
+ println("req:%#v", req)
+ user, err = u.getUser(req[0].(string))
+ if err == nil {
+ *rsp = *user
+ println("rsp:%#v", rsp)
+ }
+ return err
+}
+
+func (u *UserProvider) GetUser0(id string, name string) (User, error) {
+ var err error
+
+ println("id:%s, name:%s", id, name)
+ user, err := u.getUser(id)
+ if err != nil {
+ return User{}, err
+ }
+ if user.Name != name {
+ return User{}, perrors.New("name is not " + user.Name)
+ }
+ return *user, err
+}
+
+func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+ var err error
+
+ println("req:%#v", req)
+ rsp.Id = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
+ rsp.Sex = Gender(MAN).String()
+ return err
+}
+
+func (u *UserProvider) GetUser3() error {
+ return nil
+}
+
+func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
+ var err error
+
+ println("req:%s", req)
+ t := req[0].([]interface{})
+ user, err := u.getUser(t[0].(string))
+ if err != nil {
+ return nil, err
+ }
+ println("user:%v", user)
+ user1, err := u.getUser(t[1].(string))
+ if err != nil {
+ return nil, err
+ }
+ println("user1:%v", user1)
+
+ return []User{*user, *user1}, err
+}
+
+func (s *UserProvider) MethodMapper() map[string]string {
+ return map[string]string{
+ "GetUser2": "getUser",
+ }
+}
+
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
+}
diff --git a/examples/general/jsonrpc/go-server/app/user_provider1.go b/examples/general/jsonrpc/go-server/app/user_provider1.go
new file mode 100644
index 0000000000000000000000000000000000000000..1557c6b8d22c3e6969e8b48b87008576eb71a984
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/app/user_provider1.go
@@ -0,0 +1,83 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+)
+
+import (
+ "github.com/apache/dubbo-go/config"
+ perrors "github.com/pkg/errors"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider1))
+}
+
+type UserProvider1 struct {
+}
+
+func (u *UserProvider1) getUser(userId string) (*User, error) {
+ if user, ok := userMap[userId]; ok {
+ return &user, nil
+ }
+
+ return nil, fmt.Errorf("invalid user id:%s", userId)
+}
+
+func (u *UserProvider1) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+ var (
+ err error
+ user *User
+ )
+
+ println("req:%#v", req)
+ user, err = u.getUser(req[0].(string))
+ if err == nil {
+ *rsp = *user
+ println("rsp:%#v", rsp)
+ }
+ return err
+}
+
+func (u *UserProvider1) GetUser0(id string, name string) (User, error) {
+ var err error
+
+ println("id:%s, name:%s", id, name)
+ user, err := u.getUser(id)
+ if err != nil {
+ return User{}, err
+ }
+ if user.Name != name {
+ return User{}, perrors.New("name is not " + user.Name)
+ }
+ return *user, err
+}
+
+func (u *UserProvider1) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+ var err error
+
+ println("req:%#v", req)
+ rsp.Id = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
+ rsp.Sex = Gender(MAN).String()
+ return err
+}
+
+func (u *UserProvider1) GetUser3() error {
+ return nil
+}
+
+func (u *UserProvider1) GetUsers(req []interface{}) ([]User, error) {
+ return []User{}, nil
+}
+
+func (s *UserProvider1) MethodMapper() map[string]string {
+ return map[string]string{
+ "GetUser2": "getUser",
+ }
+}
+
+func (u *UserProvider1) Reference() string {
+ return "UserProvider1"
+}
diff --git a/examples/general/jsonrpc/go-server/app/user_provider2.go b/examples/general/jsonrpc/go-server/app/user_provider2.go
new file mode 100644
index 0000000000000000000000000000000000000000..7d2fb80a99763235610628865b4704a3999c489b
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/app/user_provider2.go
@@ -0,0 +1,93 @@
+package main
+
+import (
+ "context"
+ "fmt"
+ "strconv"
+)
+
+import (
+ "github.com/apache/dubbo-go/config"
+ perrors "github.com/pkg/errors"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider2))
+}
+
+type UserProvider2 struct {
+}
+
+func (u *UserProvider2) getUser(userId string) (*User, error) {
+ if user, ok := userMap[userId]; ok {
+ return &user, nil
+ }
+
+ return nil, fmt.Errorf("invalid user id:%s", userId)
+}
+
+func (u *UserProvider2) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
+ var (
+ err error
+ user *User
+ )
+
+ println("req:%#v", req)
+ user, err = u.getUser(req[0].(string))
+ if err == nil {
+ *rsp = *user
+ println("rsp:%#v", rsp)
+ }
+ return err
+}
+
+func (u *UserProvider2) GetUser0(id string, name string) (User, error) {
+ var err error
+
+ println("id:%s, name:%s", id, name)
+ user, err := u.getUser(id)
+ if err != nil {
+ return User{}, err
+ }
+ if user.Name != name {
+ return User{}, perrors.New("name is not " + user.Name)
+ }
+ return *user, err
+}
+
+func (u *UserProvider2) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
+ var err error
+
+ println("req:%#v", req)
+ rsp.Id = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
+ rsp.Sex = Gender(MAN).String()
+ return err
+}
+
+func (u *UserProvider2) GetUser3() error {
+ return nil
+}
+
+func (u *UserProvider2) GetUsers(req []interface{}) ([]User, error) {
+ var err error
+
+ println("req:%s", req)
+ t := req[0].([]interface{})
+ user, err := u.getUser(t[0].(string))
+ if err != nil {
+ return nil, err
+ }
+ println("user:%v", user)
+
+ return []User{*user}, err
+}
+
+func (s *UserProvider2) MethodMapper() map[string]string {
+ return map[string]string{
+ "GetUser2": "getUser",
+ }
+}
+
+func (u *UserProvider2) Reference() string {
+ return "UserProvider2"
+}
diff --git a/examples/jsonrpc/with-configcenter-go-server/app/version.go b/examples/general/jsonrpc/go-server/app/version.go
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/app/version.go
rename to examples/general/jsonrpc/go-server/app/version.go
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/bin/load.sh b/examples/general/jsonrpc/go-server/assembly/bin/load.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/bin/load.sh
rename to examples/general/jsonrpc/go-server/assembly/bin/load.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/common/app.properties b/examples/general/jsonrpc/go-server/assembly/common/app.properties
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/common/app.properties
rename to examples/general/jsonrpc/go-server/assembly/common/app.properties
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/common/build.sh b/examples/general/jsonrpc/go-server/assembly/common/build.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/common/build.sh
rename to examples/general/jsonrpc/go-server/assembly/common/build.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/linux/dev.sh b/examples/general/jsonrpc/go-server/assembly/linux/dev.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/linux/dev.sh
rename to examples/general/jsonrpc/go-server/assembly/linux/dev.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/linux/release.sh b/examples/general/jsonrpc/go-server/assembly/linux/release.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/linux/release.sh
rename to examples/general/jsonrpc/go-server/assembly/linux/release.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/linux/test.sh b/examples/general/jsonrpc/go-server/assembly/linux/test.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/linux/test.sh
rename to examples/general/jsonrpc/go-server/assembly/linux/test.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/mac/dev.sh b/examples/general/jsonrpc/go-server/assembly/mac/dev.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/mac/dev.sh
rename to examples/general/jsonrpc/go-server/assembly/mac/dev.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/mac/release.sh b/examples/general/jsonrpc/go-server/assembly/mac/release.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/mac/release.sh
rename to examples/general/jsonrpc/go-server/assembly/mac/release.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/mac/test.sh b/examples/general/jsonrpc/go-server/assembly/mac/test.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/mac/test.sh
rename to examples/general/jsonrpc/go-server/assembly/mac/test.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/windows/dev.sh b/examples/general/jsonrpc/go-server/assembly/windows/dev.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/windows/dev.sh
rename to examples/general/jsonrpc/go-server/assembly/windows/dev.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/windows/release.sh b/examples/general/jsonrpc/go-server/assembly/windows/release.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/windows/release.sh
rename to examples/general/jsonrpc/go-server/assembly/windows/release.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/assembly/windows/test.sh b/examples/general/jsonrpc/go-server/assembly/windows/test.sh
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/assembly/windows/test.sh
rename to examples/general/jsonrpc/go-server/assembly/windows/test.sh
diff --git a/examples/jsonrpc/with-configcenter-go-server/profiles/dev/log.yml b/examples/general/jsonrpc/go-server/profiles/dev/log.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/profiles/dev/log.yml
rename to examples/general/jsonrpc/go-server/profiles/dev/log.yml
diff --git a/examples/general/jsonrpc/go-server/profiles/dev/server.yml b/examples/general/jsonrpc/go-server/profiles/dev/server.yml
new file mode 100644
index 0000000000000000000000000000000000000000..4d74d2ef6fed9b0206729717d7b7081a3eadec96
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/profiles/dev/server.yml
@@ -0,0 +1,75 @@
+# dubbo server yaml configure file
+
+# application config
+application_config:
+ 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
+ "jsonrpc1":
+ name: "jsonrpc"
+ ip: "127.0.0.1"
+ port: 20001
+
diff --git a/examples/jsonrpc/with-configcenter-go-server/profiles/release/log.yml b/examples/general/jsonrpc/go-server/profiles/release/log.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/profiles/release/log.yml
rename to examples/general/jsonrpc/go-server/profiles/release/log.yml
diff --git a/examples/general/jsonrpc/go-server/profiles/release/server.yml b/examples/general/jsonrpc/go-server/profiles/release/server.yml
new file mode 100644
index 0000000000000000000000000000000000000000..3f7d2fdfff208801a6b89e7a90350e57133f31c3
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/profiles/release/server.yml
@@ -0,0 +1,75 @@
+# dubbo server yaml configure file
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info server"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "release"
+
+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
+ "jsonrpc1":
+ name: "jsonrpc"
+ ip: "127.0.0.1"
+ port: 20001
+
diff --git a/examples/jsonrpc/with-configcenter-go-server/profiles/test/log.yml b/examples/general/jsonrpc/go-server/profiles/test/log.yml
similarity index 100%
rename from examples/jsonrpc/with-configcenter-go-server/profiles/test/log.yml
rename to examples/general/jsonrpc/go-server/profiles/test/log.yml
diff --git a/examples/general/jsonrpc/go-server/profiles/test/server.yml b/examples/general/jsonrpc/go-server/profiles/test/server.yml
new file mode 100644
index 0000000000000000000000000000000000000000..dd0637e7970281236b92e37888c554d83d87de96
--- /dev/null
+++ b/examples/general/jsonrpc/go-server/profiles/test/server.yml
@@ -0,0 +1,75 @@
+# dubbo server yaml configure file
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info server"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "test"
+
+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
+ "jsonrpc1":
+ name: "jsonrpc"
+ ip: "127.0.0.1"
+ port: 20001
+
diff --git a/examples/jsonrpc/java-client/build.sh b/examples/general/jsonrpc/java-client/build.sh
similarity index 100%
rename from examples/jsonrpc/java-client/build.sh
rename to examples/general/jsonrpc/java-client/build.sh
diff --git a/examples/jsonrpc/java-client/pom.xml b/examples/general/jsonrpc/java-client/pom.xml
similarity index 100%
rename from examples/jsonrpc/java-client/pom.xml
rename to examples/general/jsonrpc/java-client/pom.xml
diff --git a/examples/jsonrpc/java-client/src/main/assembly/assembly.xml b/examples/general/jsonrpc/java-client/src/main/assembly/assembly.xml
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/assembly/assembly.xml
rename to examples/general/jsonrpc/java-client/src/main/assembly/assembly.xml
diff --git a/examples/jsonrpc/java-client/src/main/assembly/conf/dubbo.properties b/examples/general/jsonrpc/java-client/src/main/assembly/conf/dubbo.properties
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/assembly/conf/dubbo.properties
rename to examples/general/jsonrpc/java-client/src/main/assembly/conf/dubbo.properties
diff --git a/examples/jsonrpc/java-client/src/main/assembly/conf/log4j.properties b/examples/general/jsonrpc/java-client/src/main/assembly/conf/log4j.properties
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/assembly/conf/log4j.properties
rename to examples/general/jsonrpc/java-client/src/main/assembly/conf/log4j.properties
diff --git a/examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
new file mode 100644
index 0000000000000000000000000000000000000000..2c7b27b5e6a494420a57d6614a8f76017fccbea7
--- /dev/null
+++ b/examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
@@ -0,0 +1,196 @@
+// *****************************************************
+// DESC : dubbo consumer
+// AUTHOR : writtey by 包增辉(https://github.com/baozh)
+// VERSION : 1.0
+// LICENCE : Apache License 2.0
+// EMAIL : alexstocks@foxmail.com
+// MOD : 2016-10-19 17:03
+// FILE : Consumer.java
+// ******************************************************
+
+package com.ikurento.user;
+
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import com.alibaba.dubbo.rpc.service.EchoService;
+import java.util.List;
+
+public class Consumer {
+ //定义一个私有变量 (Spring中要求)
+ private UserProvider userProvider;
+ private UserProvider userProvider1;
+ private UserProvider userProvider2;
+
+ //Spring注入(Spring中要求)
+ public void setUserProvider(UserProvider u) {
+ this.userProvider = u;
+ }
+ public void setUserProvider1(UserProvider u) {
+ this.userProvider1 = u;
+ }
+ public void setUserProvider2(UserProvider u) {
+ this.userProvider2 = u;
+ }
+
+ //启动consumer的入口函数(在配置文件中指定)
+ public void start() throws Exception {
+ System.out.println("\n\ntest");
+ testGetUser();
+ testGetUsers();
+ System.out.println("\n\ntest1");
+ testGetUser1();
+ testGetUsers1();
+ System.out.println("\n\ntest2");
+ testGetUser2();
+ testGetUsers2();
+ Thread.sleep(2000);
+ }
+
+ private void testGetUser() throws Exception {
+ try {
+ EchoService echoService = (EchoService)userProvider;
+ Object status = echoService.$echo("OK");
+ System.out.println("echo: "+status);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ User user1 = userProvider.GetUser("A003");
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
+ + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
+ User user2 = userProvider.GetUser0("A003","Moorse");
+ 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 user3 = userProvider.getUser(1);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
+
+ userProvider.GetUser3();
+ System.out.println("GetUser3 succ");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUsers() throws Exception {
+ try {
+ List<String> userIDList = new ArrayList<String>();
+ userIDList.add("A001");
+ userIDList.add("A002");
+ userIDList.add("A003");
+
+ List<User> userList = userProvider.GetUsers(userIDList);
+
+ for (int i = 0; i < userList.size(); i++) {
+ User user = userList.get(i);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
+ + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUser1() throws Exception {
+ try {
+ EchoService echoService = (EchoService)userProvider1;
+ Object status = echoService.$echo("OK");
+ System.out.println("echo: "+status);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ User user1 = userProvider1.GetUser("A003");
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
+ + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
+ User user2 = userProvider1.GetUser0("A003","Moorse");
+ 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 user3 = userProvider1.getUser(1);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
+
+ userProvider1.GetUser3();
+ System.out.println("GetUser3 succ");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUsers1() throws Exception {
+ try {
+ List<String> userIDList = new ArrayList<String>();
+ userIDList.add("A001");
+ userIDList.add("A002");
+ userIDList.add("A003");
+
+ List<User> userList = userProvider1.GetUsers(userIDList);
+
+ for (int i = 0; i < userList.size(); i++) {
+ User user = userList.get(i);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
+ + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUser2() throws Exception {
+ try {
+ EchoService echoService = (EchoService)userProvider2;
+ Object status = echoService.$echo("OK");
+ System.out.println("echo: "+status);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ try {
+ User user1 = userProvider2.GetUser("A003");
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
+ + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
+ User user2 = userProvider2.GetUser0("A003","Moorse");
+ 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 user3 = userProvider2.getUser(1);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
+ + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
+
+ userProvider2.GetUser3();
+ System.out.println("GetUser3 succ");
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ private void testGetUsers2() throws Exception {
+ try {
+ List<String> userIDList = new ArrayList<String>();
+ userIDList.add("A001");
+ userIDList.add("A002");
+ userIDList.add("A003");
+
+ List<User> userList = userProvider2.GetUsers(userIDList);
+
+ for (int i = 0; i < userList.size(); i++) {
+ User user = userList.get(i);
+ System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
+ " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
+ + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
+ }
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Gender.java b/examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/Gender.java
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Gender.java
rename to examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/Gender.java
diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java b/examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java
rename to examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/User.java
diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java b/examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java
rename to examples/general/jsonrpc/java-client/src/main/java/com/ikurento/user/UserProvider.java
diff --git a/examples/jsonrpc/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml b/examples/general/jsonrpc/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
similarity index 87%
rename from examples/jsonrpc/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
rename to examples/general/jsonrpc/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
index c01f4ab064a83aa62adc7de676cdaede7108bd23..da21e8a359c003983ebea3269d4f2dfd255e3b29 100644
--- a/examples/jsonrpc/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
+++ b/examples/general/jsonrpc/java-client/src/main/resources/META-INF/spring/dubbo.consumer.xml
@@ -37,5 +37,9 @@
<!-- dubbo:reference id="userProvider" protocol="dubbo" interface="com.ikurento.user.UserProvider">
<dubbo:parameter key="heartbeat" value="10000"/ -->
</dubbo:reference>
+ <dubbo:reference id="userProvider1" protocol="jsonrpc" version="2.0" interface="com.ikurento.user.UserProvider">
+ </dubbo:reference>
+ <dubbo:reference id="userProvider2" protocol="jsonrpc" version="2.0" group="as" interface="com.ikurento.user.UserProvider">
+ </dubbo:reference>
</beans>
diff --git a/examples/dubbo/java-client/src/main/resources/META-INF/spring/service.xml b/examples/general/jsonrpc/java-client/src/main/resources/META-INF/spring/service.xml
similarity index 90%
rename from examples/dubbo/java-client/src/main/resources/META-INF/spring/service.xml
rename to examples/general/jsonrpc/java-client/src/main/resources/META-INF/spring/service.xml
index 625a879f97f5a21498be1efc1aa97fce68e76c61..db9fc3cba5a359b8835af53b81e50f8296d2e489 100644
--- a/examples/dubbo/java-client/src/main/resources/META-INF/spring/service.xml
+++ b/examples/general/jsonrpc/java-client/src/main/resources/META-INF/spring/service.xml
@@ -24,6 +24,8 @@
<bean class="com.ikurento.user.Consumer" init-method="start">
<!-- 声明这个类 要使用的服务名-->
<property name="userProvider" ref="userProvider" />
+ <property name="userProvider1" ref="userProvider1" />
+ <property name="userProvider2" ref="userProvider2" />
</bean>
<!-- App config -->
diff --git a/examples/jsonrpc/java-client/src/main/resources/log4j.properties b/examples/general/jsonrpc/java-client/src/main/resources/log4j.properties
similarity index 100%
rename from examples/jsonrpc/java-client/src/main/resources/log4j.properties
rename to examples/general/jsonrpc/java-client/src/main/resources/log4j.properties
diff --git a/examples/jsonrpc/java-server/build.sh b/examples/general/jsonrpc/java-server/build.sh
similarity index 100%
rename from examples/jsonrpc/java-server/build.sh
rename to examples/general/jsonrpc/java-server/build.sh
diff --git a/examples/jsonrpc/java-server/pom.xml b/examples/general/jsonrpc/java-server/pom.xml
similarity index 100%
rename from examples/jsonrpc/java-server/pom.xml
rename to examples/general/jsonrpc/java-server/pom.xml
diff --git a/examples/jsonrpc/java-server/script/debug.sh b/examples/general/jsonrpc/java-server/script/debug.sh
similarity index 100%
rename from examples/jsonrpc/java-server/script/debug.sh
rename to examples/general/jsonrpc/java-server/script/debug.sh
diff --git a/examples/jsonrpc/java-server/src/main/assembly/assembly.xml b/examples/general/jsonrpc/java-server/src/main/assembly/assembly.xml
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/assembly/assembly.xml
rename to examples/general/jsonrpc/java-server/src/main/assembly/assembly.xml
diff --git a/examples/jsonrpc/java-server/src/main/assembly/conf/dubbo.properties b/examples/general/jsonrpc/java-server/src/main/assembly/conf/dubbo.properties
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/assembly/conf/dubbo.properties
rename to examples/general/jsonrpc/java-server/src/main/assembly/conf/dubbo.properties
diff --git a/examples/jsonrpc/java-server/src/main/assembly/conf/log4j.properties b/examples/general/jsonrpc/java-server/src/main/assembly/conf/log4j.properties
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/assembly/conf/log4j.properties
rename to examples/general/jsonrpc/java-server/src/main/assembly/conf/log4j.properties
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/Gender.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/Gender.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/Gender.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/Gender.java
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/Provider.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/Provider.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/Provider.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/Provider.java
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/Response.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/Response.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/Response.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/Response.java
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/User.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/User.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/User.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/User.java
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProvider.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProvider.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProvider.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProvider.java
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
diff --git a/examples/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
rename to examples/general/jsonrpc/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
diff --git a/examples/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml b/examples/general/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
rename to examples/general/jsonrpc/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
diff --git a/examples/jsonrpc/java-server/src/main/resources/log4j.properties b/examples/general/jsonrpc/java-server/src/main/resources/log4j.properties
similarity index 100%
rename from examples/jsonrpc/java-server/src/main/resources/log4j.properties
rename to examples/general/jsonrpc/java-server/src/main/resources/log4j.properties
diff --git a/examples/generic/go-client/app/client.go b/examples/generic/go-client/app/client.go
new file mode 100644
index 0000000000000000000000000000000000000000..8d5a1bc5fa6cb186fcf456d385f8dad16b750ea3
--- /dev/null
+++ b/examples/generic/go-client/app/client.go
@@ -0,0 +1,100 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+ "fmt"
+ "time"
+)
+
+import (
+ _ "github.com/apache/dubbo-go/common/proxy/proxy_factory"
+ "github.com/apache/dubbo-go/config"
+ "github.com/apache/dubbo-go/protocol/dubbo"
+ _ "github.com/apache/dubbo-go/registry/protocol"
+
+ _ "github.com/apache/dubbo-go/filter/impl"
+
+ _ "github.com/apache/dubbo-go/cluster/cluster_impl"
+ _ "github.com/apache/dubbo-go/cluster/loadbalance"
+ _ "github.com/apache/dubbo-go/registry/zookeeper"
+)
+
+var (
+ survivalTimeout int = 10e9
+)
+
+// they are necessary:
+// export CONF_CONSUMER_FILE_PATH="xxx"
+// export APP_LOG_CONF_FILE="xxx"
+func main() {
+ println("\n\ntest")
+ test()
+ println("\n\ntest2")
+ test2()
+
+}
+func test() {
+ var appName = "UserProviderGer"
+ var referenceConfig = config.ReferenceConfig{
+ InterfaceName: "com.ikurento.user.UserProvider",
+ Cluster: "failover",
+ Registry: "hangzhouzk",
+ Protocol: dubbo.DUBBO,
+ Generic: true,
+ }
+ referenceConfig.GenericLoad(appName) //appName is the unique identification of RPCService
+
+ time.Sleep(3 * time.Second)
+ println("\n\n\nstart to generic invoke")
+ resp, err := referenceConfig.GetRPCService().(*config.GenericService).Invoke([]interface{}{"GetUser", []string{"java.lang.String"}, []interface{}{"A003"}})
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("res: %+v\n", resp)
+ println("succ!")
+
+}
+func test2() {
+ var appName = "UserProviderGer"
+ var referenceConfig = config.ReferenceConfig{
+ InterfaceName: "com.ikurento.user.UserProvider",
+ Cluster: "failover",
+ Registry: "hangzhouzk",
+ Protocol: dubbo.DUBBO,
+ Generic: true,
+ }
+ referenceConfig.GenericLoad(appName) //appName is the unique identification of RPCService
+
+ time.Sleep(3 * time.Second)
+ println("\n\n\nstart to generic invoke")
+ user := User{
+ Id: "3213",
+ Name: "panty",
+ Age: 25,
+ Time: time.Now(),
+ Sex: Gender(MAN),
+ }
+ resp, err := referenceConfig.GetRPCService().(*config.GenericService).Invoke([]interface{}{"queryUser", []string{"com.ikurento.user.User"}, []interface{}{user}})
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("res: %+v\n", resp)
+ println("succ!")
+
+}
diff --git a/examples/generic/go-client/app/user.go b/examples/generic/go-client/app/user.go
new file mode 100644
index 0000000000000000000000000000000000000000..9b226e24456e850f1b31fc0501e04d573cec35fd
--- /dev/null
+++ b/examples/generic/go-client/app/user.go
@@ -0,0 +1,57 @@
+package main
+
+import (
+ "strconv"
+ "time"
+)
+import (
+ hessian "github.com/apache/dubbo-go-hessian2"
+)
+
+type Gender hessian.JavaEnum
+
+const (
+ MAN hessian.JavaEnum = iota
+ WOMAN
+)
+
+var genderName = map[hessian.JavaEnum]string{
+ MAN: "MAN",
+ WOMAN: "WOMAN",
+}
+
+var genderValue = map[string]hessian.JavaEnum{
+ "MAN": MAN,
+ "WOMAN": WOMAN,
+}
+
+func (g Gender) JavaClassName() string {
+ return "com.ikurento.user.Gender"
+}
+
+func (g Gender) String() string {
+ s, ok := genderName[hessian.JavaEnum(g)]
+ if ok {
+ return s
+ }
+
+ return strconv.Itoa(int(g))
+}
+
+func (g Gender) EnumValue(s string) hessian.JavaEnum {
+ v, ok := genderValue[s]
+ if ok {
+ return v
+ }
+
+ return hessian.InvalidJavaEnum
+}
+
+type User struct {
+ // !!! Cannot define lowercase names of variable
+ Id string
+ Name string
+ Age int32
+ Time time.Time
+ Sex Gender // 注意此处,java enum Object <--> go string
+}
diff --git a/examples/generic/go-client/assembly/bin/load.sh b/examples/generic/go-client/assembly/bin/load.sh
new file mode 100644
index 0000000000000000000000000000000000000000..07d5d15eac7b7974845e36c3807e7ec55875de65
--- /dev/null
+++ b/examples/generic/go-client/assembly/bin/load.sh
@@ -0,0 +1,196 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : dubbogo app devops script
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-05-13 02:01
+# FILE : load.sh
+# ******************************************************
+
+APP_NAME="APPLICATION_NAME"
+APP_ARGS=""
+SLEEP_INTERVAL=5
+MAX_LIFETIME=4000
+
+PROJECT_HOME=""
+OS_NAME=`uname`
+if [[ ${OS_NAME} != "Windows" ]]; then
+ PROJECT_HOME=`pwd`
+ PROJECT_HOME=${PROJECT_HOME}"/"
+else
+ APP_NAME="APPLICATION_NAME.exe"
+fi
+
+export CONF_CONSUMER_FILE_PATH=${PROJECT_HOME}"TARGET_CONF_FILE"
+export APP_LOG_CONF_FILE=${PROJECT_HOME}"TARGET_LOG_CONF_FILE"
+# export GOTRACEBACK=system
+# export GODEBUG=gctrace=1
+
+usage() {
+ echo "Usage: $0 start [conf suffix]"
+ echo " $0 stop"
+ echo " $0 term"
+ echo " $0 restart"
+ echo " $0 list"
+ echo " $0 monitor"
+ echo " $0 crontab"
+ exit
+}
+
+start() {
+ arg=$1
+ if [ "$arg" = "" ];then
+ echo "No registry type! Default client.yml!"
+ else
+ export CONF_CONSUMER_FILE_PATH=${CONF_CONSUMER_FILE_PATH//\.yml/\_$arg\.yml}
+ fi
+ if [ ! -f "${CONF_CONSUMER_FILE_PATH}" ];then
+ echo $CONF_CONSUMER_FILE_PATH" is not existing!"
+ return
+ fi
+ APP_LOG_PATH=${PROJECT_HOME}"logs/"
+ mkdir -p ${APP_LOG_PATH}
+ APP_BIN=${PROJECT_HOME}sbin/${APP_NAME}
+ chmod u+x ${APP_BIN}
+ # CMD="nohup ${APP_BIN} ${APP_ARGS} >>${APP_NAME}.nohup.out 2>&1 &"
+ CMD="${APP_BIN}"
+ eval ${CMD}
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ CUR=`date +%FT%T`
+ if [ "${PID}" != "" ]; then
+ for p in ${PID}
+ do
+ echo "start ${APP_NAME} ( pid =" ${p} ") at " ${CUR}
+ done
+ fi
+}
+
+stop() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [ "${PID}" != "" ];
+ then
+ for ps in ${PID}
+ do
+ echo "kill -SIGINT ${APP_NAME} ( pid =" ${ps} ")"
+ kill -2 ${ps}
+ done
+ fi
+}
+
+
+term() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [ "${PID}" != "" ];
+ then
+ for ps in ${PID}
+ do
+ echo "kill -9 ${APP_NAME} ( pid =" ${ps} ")"
+ kill -9 ${ps}
+ done
+ fi
+}
+
+list() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{printf("%s,%s,%s,%s\n", $1, $2, $9, $10)}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{printf("%s,%s,%s,%s,%s\n", $1, $4, $6, $7, $8)}'`
+ fi
+
+ if [ "${PID}" != "" ]; then
+ echo "list ${APP_NAME}"
+
+ if [[ ${OS_NAME} == "Linux" || ${OS_NAME} == "Darwin" ]]; then
+ echo "index: user, pid, start, duration"
+ else
+ echo "index: PID, WINPID, UID, STIME, COMMAND"
+ fi
+ idx=0
+ for ps in ${PID}
+ do
+ echo "${idx}: ${ps}"
+ ((idx ++))
+ done
+ fi
+}
+
+monitor() {
+ idx=0
+ while true; do
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [[ "${PID}" == "" ]]; then
+ start
+ idx=0
+ fi
+
+ ((LIFE=idx*${SLEEP_INTERVAL}))
+ echo "${APP_NAME} ( pid = " ${PID} ") has been working in normal state for " $LIFE " seconds."
+ ((idx ++))
+ sleep ${SLEEP_INTERVAL}
+ done
+}
+
+crontab() {
+ idx=0
+ while true; do
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [[ "${PID}" == "" ]]; then
+ start
+ idx=0
+ fi
+
+ ((LIFE=idx*${SLEEP_INTERVAL}))
+ echo "${APP_NAME} ( pid = " ${PID} ") has been working in normal state for " $LIFE " seconds."
+ ((idx ++))
+ sleep ${SLEEP_INTERVAL}
+ if [[ ${LIFE} -gt ${MAX_LIFETIME} ]]; then
+ kill -9 ${PID}
+ fi
+ done
+}
+
+opt=$1
+case C"$opt" in
+ Cstart)
+ start $2
+ ;;
+ Cstop)
+ stop
+ ;;
+ Cterm)
+ term
+ ;;
+ Crestart)
+ term
+ start $2
+ ;;
+ Clist)
+ list
+ ;;
+ Cmonitor)
+ monitor
+ ;;
+ Ccrontab)
+ crontab
+ ;;
+ C*)
+ usage
+ ;;
+esac
+
diff --git a/examples/generic/go-client/assembly/common/app.properties b/examples/generic/go-client/assembly/common/app.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6bbd6db850ceeaf5ff873fee01a3578237cbd557
--- /dev/null
+++ b/examples/generic/go-client/assembly/common/app.properties
@@ -0,0 +1,17 @@
+# dubbogo application configure script
+# ******************************************************
+# DESC : dubbogo environment variable
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:29
+# FILE : app.properties
+# ******************************************************
+
+export TARGET_EXEC_NAME="user_info_client"
+# BUILD_PACKAGE="dubbogo-examples/user-info/client/app"
+export BUILD_PACKAGE="app"
+
+export TARGET_CONF_FILE="conf/client.yml"
+export TARGET_LOG_CONF_FILE="conf/log.yml"
diff --git a/examples/generic/go-client/assembly/common/build.sh b/examples/generic/go-client/assembly/common/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e72418297ad2f0ac6985476b5a8d5e03b9e7584e
--- /dev/null
+++ b/examples/generic/go-client/assembly/common/build.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:28
+# FILE : build.sh
+# ******************************************************
+
+rm -rf target/
+
+PROJECT_HOME=`pwd`
+TARGET_FOLDER=${PROJECT_HOME}/target/${GOOS}
+
+TARGET_SBIN_NAME=${TARGET_EXEC_NAME}
+version=`cat app/version.go | grep Version | grep -v "Apache" | awk -F '=' '{print $2}' | awk -F '"' '{print $2}'`
+if [[ ${GOOS} == "windows" ]]; then
+ TARGET_SBIN_NAME=${TARGET_SBIN_NAME}.exe
+fi
+TARGET_NAME=${TARGET_FOLDER}/${TARGET_SBIN_NAME}
+if [[ $PROFILE == "dev" || $PROFILE == "test" ]]; then
+ # GFLAGS=-gcflags "-N -l" -race -x -v # -x会把go build的详细过程输出
+ # GFLAGS=-gcflags "-N -l" -race -v
+ # GFLAGS="-gcflags \"-N -l\" -v"
+ cd ${BUILD_PACKAGE} && GOOS=$GOOS GOARCH=$GOARCH go build -gcflags "-N -l" -x -v -i -o ${TARGET_NAME} && cd -
+else
+ # -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果),
+ # -w去掉DWARF调试信息,得到的程序就不能用gdb调试了。-s和-w也可以分开使用,一般来说如果不打算用gdb调试,
+ # -w基本没啥损失。-s的损失就有点大了。
+ cd ${BUILD_PACKAGE} && GOOS=$GOOS GOARCH=$GOARCH go build -ldflags "-w" -x -v -i -o ${TARGET_NAME} && cd -
+fi
+
+TAR_NAME=${TARGET_EXEC_NAME}-${version}-`date "+%Y%m%d-%H%M"`-${PROFILE}
+
+mkdir -p ${TARGET_FOLDER}/${TAR_NAME}
+
+SBIN_DIR=${TARGET_FOLDER}/${TAR_NAME}/sbin
+BIN_DIR=${TARGET_FOLDER}/${TAR_NAME}
+CONF_DIR=${TARGET_FOLDER}/${TAR_NAME}/conf
+
+mkdir -p ${SBIN_DIR}
+mkdir -p ${CONF_DIR}
+
+mv ${TARGET_NAME} ${SBIN_DIR}
+cp -r assembly/bin ${BIN_DIR}
+cd ${BIN_DIR}/bin/ && mv load.sh load_${TARGET_EXEC_NAME}.sh && cd -
+
+platform=$(uname)
+# modify APPLICATION_NAME
+if [ ${platform} == "Darwin" ]; then
+ sed -i "" "s~APPLICATION_NAME~${TARGET_EXEC_NAME}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~APPLICATION_NAME~${TARGET_EXEC_NAME}~g" ${BIN_DIR}/bin/*
+fi
+
+# modify TARGET_CONF_FILE
+if [ ${platform} == "Darwin" ]; then
+ sed -i "" "s~TARGET_CONF_FILE~${TARGET_CONF_FILE}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~TARGET_CONF_FILE~${TARGET_CONF_FILE}~g" ${BIN_DIR}/bin/*
+fi
+
+# modify TARGET_LOG_CONF_FILE
+if [ ${platform} == "Darwin" ]; then
+ sed -i "" "s~TARGET_LOG_CONF_FILE~${TARGET_LOG_CONF_FILE}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~TARGET_LOG_CONF_FILE~${TARGET_LOG_CONF_FILE}~g" ${BIN_DIR}/bin/*
+fi
+
+cp -r profiles/${PROFILE}/* ${CONF_DIR}
+
+cd ${TARGET_FOLDER}
+
+tar czf ${TAR_NAME}.tar.gz ${TAR_NAME}/*
+
diff --git a/examples/generic/go-client/assembly/linux/dev.sh b/examples/generic/go-client/assembly/linux/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3373f01b948b708cd7bc1958c9d56a9042c60a68
--- /dev/null
+++ b/examples/generic/go-client/assembly/linux/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-18 13:24
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="dev"
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/linux/release.sh b/examples/generic/go-client/assembly/linux/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..34867b8b3488778cd76a1dc7802393dcab6b0df0
--- /dev/null
+++ b/examples/generic/go-client/assembly/linux/release.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="release"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/linux/test.sh b/examples/generic/go-client/assembly/linux/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..1bbbefd1e14e08c16deaf859e2841f4d1fe88e9c
--- /dev/null
+++ b/examples/generic/go-client/assembly/linux/test.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="test"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/mac/dev.sh b/examples/generic/go-client/assembly/mac/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..b68ac83b6524a6713cd90c4fc5968fe64b1a9545
--- /dev/null
+++ b/examples/generic/go-client/assembly/mac/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-18 13:24
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+export PROFILE="dev"
+
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/mac/release.sh b/examples/generic/go-client/assembly/mac/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..688288b3b1b989e8af70a3674b34ea8e0668f3b4
--- /dev/null
+++ b/examples/generic/go-client/assembly/mac/release.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+export PROFILE="release"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/mac/test.sh b/examples/generic/go-client/assembly/mac/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..56d6c11ecd6a1dc5984c74b88c10be9239e57428
--- /dev/null
+++ b/examples/generic/go-client/assembly/mac/test.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+export PROFILE="test"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/windows/dev.sh b/examples/generic/go-client/assembly/windows/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..91cf6f23bcbecb26db798469a30529261aabbbb6
--- /dev/null
+++ b/examples/generic/go-client/assembly/windows/dev.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-18 13:24
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="dev"
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/windows/release.sh b/examples/generic/go-client/assembly/windows/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f317720bd53d9c9e5f8f484b6eb682c9c736af0c
--- /dev/null
+++ b/examples/generic/go-client/assembly/windows/release.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+export PROFILE="release"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/assembly/windows/test.sh b/examples/generic/go-client/assembly/windows/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..7dd2bec5260e647b57a46aaa37acc098babff068
--- /dev/null
+++ b/examples/generic/go-client/assembly/windows/test.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+export PROFILE="test"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/generic/go-client/profiles/dev/client.yml b/examples/generic/go-client/profiles/dev/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f4e3180aa88cbbdffd519d70b3cc83b2e2b6674a
--- /dev/null
+++ b/examples/generic/go-client/profiles/dev/client.yml
@@ -0,0 +1,55 @@
+# dubbo client yaml configure file
+
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo genric 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:
+
+protocol_conf:
+ dubbo:
+ reconnect_interval: 0
+ connection_number: 2
+ heartbeat_period: "5s"
+ session_timeout: "20s"
+ pool_size: 64
+ pool_ttl: 600
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 10240
+ session_name: "client"
diff --git a/examples/generic/go-client/profiles/dev/log.yml b/examples/generic/go-client/profiles/dev/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..59fa4279ad85272c4c49d532beaf23b74d00f58a
--- /dev/null
+++ b/examples/generic/go-client/profiles/dev/log.yml
@@ -0,0 +1,28 @@
+
+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/examples/generic/go-client/profiles/release/client.yml b/examples/generic/go-client/profiles/release/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..5a21bca6c93336a8888b55a6a7e81f9240c709a5
--- /dev/null
+++ b/examples/generic/go-client/profiles/release/client.yml
@@ -0,0 +1,55 @@
+# dubbo client yaml configure file
+
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo generic client"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "release"
+
+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:
+
+protocol_conf:
+ dubbo:
+ reconnect_interval: 0
+ connection_number: 2
+ heartbeat_period: "5s"
+ session_timeout: "20s"
+ pool_size: 64
+ pool_ttl: 600
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 10240
+ session_name: "client"
diff --git a/examples/generic/go-client/profiles/release/log.yml b/examples/generic/go-client/profiles/release/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e0514be020eedf594d99d112183cdd5ce199e46d
--- /dev/null
+++ b/examples/generic/go-client/profiles/release/log.yml
@@ -0,0 +1,28 @@
+
+level: "warn"
+development: true
+disableCaller: true
+disableStacktrace: true
+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/examples/generic/go-client/profiles/test/client.yml b/examples/generic/go-client/profiles/test/client.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7442c64c71abf47db9c15d85c6bcd2ced8057e46
--- /dev/null
+++ b/examples/generic/go-client/profiles/test/client.yml
@@ -0,0 +1,55 @@
+# dubbo client yaml configure file
+
+
+check: true
+# client
+request_timeout : "3s"
+# connect timeout
+connect_timeout : "3s"
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info client"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "test"
+
+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:
+
+protocol_conf:
+ dubbo:
+ reconnect_interval: 0
+ connection_number: 2
+ heartbeat_period: "5s"
+ session_timeout: "20s"
+ pool_size: 64
+ pool_ttl: 600
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 10240
+ session_name: "client"
diff --git a/examples/generic/go-client/profiles/test/log.yml b/examples/generic/go-client/profiles/test/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..baee0b7248484e425f88f35ab128212c931ff85e
--- /dev/null
+++ b/examples/generic/go-client/profiles/test/log.yml
@@ -0,0 +1,28 @@
+
+level: "info"
+development: false
+disableCaller: false
+disableStacktrace: true
+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/examples/generic/java-server/build.sh b/examples/generic/java-server/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0c197da639c1c1d9375e18c24dd73366c49deefe
--- /dev/null
+++ b/examples/generic/java-server/build.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+# ******************************************************
+# EMAIL : alexstocks@foxmail.com
+# FILE : build.sh
+# ******************************************************
+
+# mvn dependency:sources
+mvn clean package -Dmaven.test.skip
+# mvn -X clean compile package -DskipTests=true
diff --git a/examples/generic/java-server/pom.xml b/examples/generic/java-server/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..975157865e59f24693d755dd20b0aac4b179a793
--- /dev/null
+++ b/examples/generic/java-server/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.ikurento</groupId>
+ <artifactId>user-info-server</artifactId>
+ <packaging>jar</packaging>
+ <version>0.2.0</version>
+ <description>The demo provider module of dubbo project</description>
+ <properties>
+ <skip_maven_deploy>false</skip_maven_deploy>
+
+ <dubbo-version>2.6.5</dubbo-version>
+ <dubbo-jsonrpc-version>1.0.1</dubbo-jsonrpc-version>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>dubbo-dependencies-bom</artifactId>
+ <version>${dubbo-version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.7.25</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>dubbo</artifactId>
+ <version>${dubbo-version}</version>
+ <exclusions>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-all</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-framework</artifactId>
+ <version>2.12.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.qianmi</groupId>
+ <artifactId>dubbo-rpc-jsonrpc</artifactId>
+ <version>${dubbo-jsonrpc-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.26</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.github.sgroschupf</groupId>
+ <artifactId>zkclient</artifactId>
+ <version>0.1</version>
+ <exclusions>
+ <exclusion>
+ <artifactId>org.apache.zookeeper</artifactId>
+ <groupId>zookeeper</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.zookeeper</groupId>
+ <artifactId>zookeeper</artifactId>
+ <version>3.4.14</version>
+ </dependency>
+
+ </dependencies>
+
+ <repositories>
+ <repository>
+ <id>nexus-aliyu</id>
+ <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>nexus-aliyu</id>
+ <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+
+
+ <build>
+
+ <plugins>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>unpack</id>
+ <phase>package</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.alibaba</groupId>
+ <artifactId>dubbo</artifactId>
+ <version>${dubbo-version}</version>
+ <outputDirectory>${project.build.directory}/dubbo</outputDirectory>
+ <includes>META-INF/assembly/**</includes>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+ <descriptor>src/main/assembly/assembly.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+
+</project>
+
+
diff --git a/examples/generic/java-server/script/debug.sh b/examples/generic/java-server/script/debug.sh
new file mode 100644
index 0000000000000000000000000000000000000000..27c5d800d846018127e762944151aa8e9ad4495d
--- /dev/null
+++ b/examples/generic/java-server/script/debug.sh
@@ -0,0 +1,16 @@
+#!/us1r/bin/env bash
+# ******************************************************
+# DESC :
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-09 21:52
+# FILE : to debug user info dubbo server
+# ******************************************************
+
+# 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/examples/generic/java-server/src/main/assembly/assembly.xml b/examples/generic/java-server/src/main/assembly/assembly.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2f01fea20f5391112cccb88c87bfe4ae1b59750a
--- /dev/null
+++ b/examples/generic/java-server/src/main/assembly/assembly.xml
@@ -0,0 +1,45 @@
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -
+ - Licensed 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.
+-->
+<assembly>
+ <id>assembly</id>
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <includeBaseDirectory>true</includeBaseDirectory>
+ <fileSets>
+ <fileSet>
+ <directory>${project.build.directory}/dubbo/META-INF/assembly/bin</directory>
+ <outputDirectory>bin</outputDirectory>
+ <fileMode>0755</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ <fileSet>
+ <directory>src/main/assembly/conf</directory>
+ <includes>
+ <include>dubbo.properties</include>
+ <include>log4j.*</include>
+ </includes>
+ <outputDirectory>conf</outputDirectory>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ </fileSets>
+ <dependencySets>
+ <dependencySet>
+ <outputDirectory>lib</outputDirectory>
+ </dependencySet>
+ </dependencySets>
+</assembly>
\ No newline at end of file
diff --git a/examples/generic/java-server/src/main/assembly/conf/dubbo.properties b/examples/generic/java-server/src/main/assembly/conf/dubbo.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2826f31303717256725b02a79e1698043709d2f3
--- /dev/null
+++ b/examples/generic/java-server/src/main/assembly/conf/dubbo.properties
@@ -0,0 +1,14 @@
+### dubbo注册中心配置 ##
+dubbo.container = log4j,spring
+dubbo.application.name = user-info-server
+dubbo.application.environment = product
+dubbo.application.owner = AlexStocks
+dubbo.registry.address = 127.0.0.1:2181
+dubbo.registry.protocol = zookeeper
+dubbo.consumer.timeout = 10000
+dubbo.provider.timeout = 10000
+dubbo.protocol.name = dubbo
+dubbo.protocol.port = 10000
+
+dubbo.log4j.file = logs/dubbo.log
+dubbo.log4j.level = INFO
diff --git a/examples/generic/java-server/src/main/assembly/conf/log4j.properties b/examples/generic/java-server/src/main/assembly/conf/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..13c80493329261ea677de77624b363bf99c82652
--- /dev/null
+++ b/examples/generic/java-server/src/main/assembly/conf/log4j.properties
@@ -0,0 +1,20 @@
+## Logger configure file for myproject
+log.dir=logs/
+datestamp=yyyy-MM-dd/HH:mm:ss.SSS
+
+log4j.rootLogger=DEBUG, file, console
+
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.threshold=DEBUG
+log4j.appender.file.File=${log.dir}/log4j.log
+log4j.appender.file.DatePattern=-yyyyMMddHH
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.Append=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=DEBUG
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/Gender.java b/examples/generic/java-server/src/main/java/com/ikurento/user/Gender.java
new file mode 100644
index 0000000000000000000000000000000000000000..72c30ae8d4bae8fc71b4cb598205141b2d1d2020
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/Gender.java
@@ -0,0 +1,6 @@
+package com.ikurento.user;
+
+public enum Gender {
+ MAN,
+ WOMAN
+}
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/Provider.java b/examples/generic/java-server/src/main/java/com/ikurento/user/Provider.java
new file mode 100644
index 0000000000000000000000000000000000000000..0031f5569fd5f16ded0da6e5426f78805fad4a42
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/Provider.java
@@ -0,0 +1,33 @@
+/*
+ * 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 com.ikurento.user;
+
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class Provider {
+
+ /**
+ * To get ipv6 address to work, add
+ * System.setProperty("java.net.preferIPv6Addresses", "true");
+ * before running your application.
+ */
+ public static void main(String[] args) throws Exception {
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo.provider.xml"});
+ context.start();
+ System.in.read(); // press any key to exit
+ }
+}
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/Response.java b/examples/generic/java-server/src/main/java/com/ikurento/user/Response.java
new file mode 100644
index 0000000000000000000000000000000000000000..3447e5c2537625f424b54291c53783a51922ae7b
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/Response.java
@@ -0,0 +1,76 @@
+package com.ikurento.user;
+
+import java.io.*;
+//import java.util.Objects;
+
+public final class Response<T> implements Serializable {
+ private static final long serialVersionUID = 3727205004706510648L;
+ public static final Integer OK = 200;
+ public static final Integer ERR = 500;
+ private Integer Status;
+ private String Err;
+ private T Data;
+
+ public Response() {
+ }
+
+ public static <T> Response<T> ok() {
+ Response r = new Response();
+ r.Status = OK;
+ return r;
+ }
+
+ public static <T> Response<T> ok(Object Data) {
+ Response r = new Response();
+ r.Status = OK;
+ r.Data = Data;
+ return r;
+ }
+
+ public static <T> Response<T> notOk(String Err) {
+ Response r = new Response();
+ r.Status = ERR;
+ r.Err = Err;
+ return r;
+ }
+
+ public static <T> Response<T> notOk(Integer Status, String Err) {
+ Response r = new Response();
+ r.Status = Status;
+ r.Err = Err;
+ return r;
+ }
+
+// public Boolean isSuccess() {
+// return Objects.equals(this.Status, OK);
+// }
+
+ public Integer getStatus() {
+ return this.Status;
+ }
+
+ public void setStatus(Integer Status) {
+ this.Status = Status;
+ }
+
+ public String getErr() {
+ return this.Err;
+ }
+
+ public void setErr(String Err) {
+ this.Err = Err;
+ }
+
+ public T getData() {
+ return this.Data;
+ }
+
+ public void setData(T Data) {
+ this.Status = OK;
+ this.Data = Data;
+ }
+
+ public String toString() {
+ return "Response{Status=" + this.Status + ", Err='" + this.Err + '\'' + ", Data=" + this.Data + '}';
+ }
+}
\ No newline at end of file
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/User.java b/examples/generic/java-server/src/main/java/com/ikurento/user/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..eafc0fe1c0e0c7b72a0fce73b6a333668797145e
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/User.java
@@ -0,0 +1,79 @@
+package com.ikurento.user;
+// ref: https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+import java.util.Date;
+import java.io.Serializable;
+
+public class User implements Serializable {
+
+ private String id;
+
+ private String name;
+
+ private int age;
+
+ private Date time = new Date();
+
+ private Gender sex = Gender.MAN;
+
+ public User() {
+ }
+
+ public User(String id, String name, int age) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ }
+
+ public User(String id, String name, int age, Date time, Gender sex) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ this.time = time;
+ this.sex = sex;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public Date getTime() {
+ return time;
+ }
+
+ public void setTime(Date time) {
+ this.time = time;
+ }
+
+ public Gender getSex() {
+ return sex;
+ }
+
+ public void setSex(Gender sex) {
+ this.sex = sex;
+ }
+
+ public String toString() {
+ return "User{id:" + id + ", name:" + name + ", age:" + age + ", time:" + time + ", gender:" + sex + "}";
+ }
+}
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/UserProvider.java b/examples/generic/java-server/src/main/java/com/ikurento/user/UserProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..24567d23be662312a4750f07b605c685a8dfa5fe
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/UserProvider.java
@@ -0,0 +1,32 @@
+package com.ikurento.user;
+// https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+import java.util.List;
+import java.util.Map;
+
+public interface UserProvider {
+
+ boolean isLimit(Gender gender, String name);
+
+ User GetUser(String userId); // the first alpha is Upper case to compatible with golang.
+
+ List<User> GetUsers(List<String> userIdList);
+
+ void GetUser3();
+
+ User GetUser0(String userId, String name);
+
+ User GetErr(String userId) throws Exception;
+
+ Map<String, User> GetUserMap(List<String> userIdList);
+
+ User getUser(int usercode);
+
+ User queryUser(User user);
+
+ Map<String, User> queryAll();
+
+ int Calc(int a,int b);
+
+ Response<Integer> Sum(int a, int b);
+}
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java b/examples/generic/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..d600545c5084a40f1318e47a6a1c20bfcd6d36bc
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/UserProviderAnotherImpl.java
@@ -0,0 +1,121 @@
+package com.ikurento.user;
+//ref: https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+// import org.apache.log4j.Logger;
+// import org.apache.log4j.LoggerFactory;
+
+import java.util.*;
+
+public class UserProviderAnotherImpl implements UserProvider {
+ // private static final Logger logger = LoggerFactory.getLogger(getClass()); // 只输出到dubbo的log(logs/server.log)
+ private static final Logger logger = LoggerFactory.getLogger("userLogger"); // 输出到user-server.log
+
+ private Map<String, User> userMap = new HashMap<String, User>();
+
+ public UserProviderAnotherImpl() {
+ // userMap.put("001", new User("001", "other-zhangsan", 18, new Date(1998-1900, 1, 2, 3, 4, 5), Gender.MAN));
+ userMap.put("001", new User("001", "other-zhangsan", 18, new Date(0x12345678), Gender.MAN));
+ userMap.put("002", new User("002", "other-lisi", 20, new Date(1996-1900, 1, 2, 3, 4, 5), Gender.MAN));
+ userMap.put("003", new User("003", "other-lily", 23, new Date(1993-1900, 1, 2, 3, 4, 5), Gender.WOMAN));
+ userMap.put("004", new User("004", "other-lisa", 32, new Date(1985-1900, 1, 2, 3, 4, 5), Gender.WOMAN));
+ }
+
+ public boolean isLimit(Gender gender, String name) {
+ logger.info(String.format("input gender=%sand name=%s", gender, name));
+ return Gender.MAN == gender;
+ }
+
+ public User GetUser(String userId) {
+ logger.info("input userId = " + userId);
+ return new User(userId, "Joe", 48);
+ }
+
+ public User GetUser0(String userId, String name) {
+ return new User(userId, name, 48);
+ }
+ public void GetUser3() {
+ }
+ 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>();
+ logger.warn("@userIdList size:" + userIdList.size());
+
+ while(it.hasNext()) {
+ String id = (String)(it.next());
+ logger.info("GetUsers(@uid:" + id + ")");
+ if (userMap.containsKey(id)) {
+ userList.add(userMap.get(id));
+ logger.info("id:" + id + ", user:" + userMap.get(id));
+ }
+ }
+
+ return userList;
+ }
+
+ public Map<String, User> GetUserMap(List<String> userIdList) {
+ Iterator it = userIdList.iterator();
+ Map<String, User> map = new HashMap<String, User>();
+ logger.warn("@userIdList size:" + userIdList.size());
+
+ while(it.hasNext()) {
+ String id = (String)(it.next());
+ logger.info("GetUsers(@uid:" + id + ")");
+ if (userMap.containsKey(id)) {
+ map.put(id, userMap.get(id));
+ logger.info("id:" + id + ", user:" + userMap.get(id));
+ }
+ }
+
+ return map;
+ }
+
+ public List<User> GetUsers(List<String> userIdList) {
+ Iterator it = userIdList.iterator();
+ List<User> userList = new ArrayList<User>();
+ logger.warn("@userIdList size:" + userIdList.size());
+
+ while(it.hasNext()) {
+ String id = (String)(it.next());
+ logger.info("GetUsers(@uid:" + id + ")");
+ if (userMap.containsKey(id)) {
+ userList.add(userMap.get(id));
+ logger.info("id:" + id + ", user:" + userMap.get(id));
+ }
+ }
+
+ return userList;
+ }
+
+ // @Override
+ public User getUser(int userCode) {
+ logger.info("input userCode = " + userCode);
+ return new User(String.valueOf(userCode), "userCode get", 48);
+ }
+
+ public User queryUser(User user) {
+ logger.info("input user = " + user);
+ return new User(user.getId(), "get:" + user.getName(), user.getAge() + 18);
+ }
+
+ public Map<String, User> queryAll() {
+ logger.info("input");
+ Map<String, User> map = new HashMap<String, User>();
+ map.put("001", new User("001", "Joe", 18));
+ map.put("002", new User("002", "Wen", 20));
+
+ return map;
+ }
+
+ public int Calc(int a,int b) {
+ return a + b + 100;
+ }
+
+ public Response<Integer> Sum(int a,int b) {
+ return Response.ok(a+b);
+ }
+}
diff --git a/examples/generic/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/generic/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..47a4e2d9732aa8d8d9279d47af5bb4fb3db37195
--- /dev/null
+++ b/examples/generic/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
@@ -0,0 +1,100 @@
+package com.ikurento.user;
+
+// ref: https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Iterator;
+
+// import org.apache.log4j.Logger;
+// import org.apache.log4j.LoggerFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UserProviderImpl implements UserProvider {
+ // private static final Logger logger = LoggerFactory.getLogger(getClass()); // 只输出到dubbo的log(logs/server.log)
+ private static final Logger LOG = LoggerFactory.getLogger("UserLogger"); // 输出到user-server.log
+ Map<String, User> userMap = new HashMap<String, User>();
+
+ public UserProviderImpl() {
+ userMap.put("A001", new User("A001", "demo-zhangsan", 18));
+ userMap.put("A002", new User("A002", "demo-lisi", 20));
+ userMap.put("A003", new User("A003", "demo-lily", 23));
+ userMap.put("A004", new User("A004", "demo-lisa", 32));
+ }
+
+ public boolean isLimit(Gender gender, String name) {
+ return Gender.WOMAN == gender;
+ }
+
+ 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);
+ }
+
+ public List<User> GetUsers(List<String> userIdList) {
+ Iterator it = userIdList.iterator();
+ List<User> userList = new ArrayList<User>();
+ LOG.warn("@userIdList size:" + userIdList.size());
+
+ while(it.hasNext()) {
+ String id = (String)(it.next());
+ LOG.info("GetUsers(@uid:" + id + ")");
+ if (userMap.containsKey(id)) {
+ userList.add(userMap.get(id));
+ LOG.info("id:" + id + ", user:" + userMap.get(id));
+ }
+ }
+
+ return userList;
+ }
+
+ public void GetUser3() {
+ }
+
+ public Map<String, User> GetUserMap(List<String> userIdList) {
+ Iterator it = userIdList.iterator();
+ Map<String, User> map = new HashMap<String, User>();
+ LOG.warn("@userIdList size:" + userIdList.size());
+
+ while(it.hasNext()) {
+ String id = (String)(it.next());
+ LOG.info("GetUsers(@uid:" + id + ")");
+ if (userMap.containsKey(id)) {
+ map.put(id, userMap.get(id));
+ LOG.info("id:" + id + ", user:" + userMap.get(id));
+ }
+ }
+
+ return map;
+ }
+
+ public User queryUser(User user) {
+ return new User(user.getId(), "hello:" +user.getName(), user.getAge() + 18);
+ }
+
+ public Map<String, User> queryAll() {
+ return userMap;
+ }
+
+
+ public User getUser(int userCode) {
+ return new User(String.valueOf(userCode), "userCode get", 48);
+ }
+
+
+ public int Calc(int a,int b) {
+ return a + b;
+ }
+
+ public Response<Integer> Sum(int a,int b) {
+ return Response.ok(a+b);
+ }
+}
diff --git a/examples/generic/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml b/examples/generic/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f8dd13a833e6095485d0504e21cec272a3c9a288
--- /dev/null
+++ b/examples/generic/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -
+ - Licensed 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+
+ <!-- 应用名 -->
+ <dubbo:application name="user-info-server"/>
+ <!-- 连接到哪个本地注册中心 -->
+ <dubbo:registry id="ikurento" address="zookeeper://127.0.0.1:2181" />
+ <dubbo:registry id="ikurento2" address="zookeeper://127.0.0.1:2182" />
+ <!-- 用dubbo协议在20880端口暴露服务 -->
+ <!-- dubbo:protocol host="127.0.0.1" / -->
+ <dubbo:protocol id="dubbo" name="dubbo" host="127.0.0.1" port="20010" />
+ <dubbo:protocol id="jsonrpc" name="jsonrpc" host="127.0.0.1" port="10010" />
+ <!-- 声明需要暴露的服务接口 -->
+ <dubbo:service id="aaa" registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="demoService"/>
+ <dubbo:service id="bbb" registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="otherService" version="2.0"/>
+ <dubbo:service id="ccc" registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="otherService" group="as" version="2.0"/>
+
+ <bean id="demoService" class="com.ikurento.user.UserProviderImpl" />
+ <bean id="otherService" class="com.ikurento.user.UserProviderAnotherImpl"/>
+
+</beans>
diff --git a/examples/generic/java-server/src/main/resources/log4j.properties b/examples/generic/java-server/src/main/resources/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..13c80493329261ea677de77624b363bf99c82652
--- /dev/null
+++ b/examples/generic/java-server/src/main/resources/log4j.properties
@@ -0,0 +1,20 @@
+## Logger configure file for myproject
+log.dir=logs/
+datestamp=yyyy-MM-dd/HH:mm:ss.SSS
+
+log4j.rootLogger=DEBUG, file, console
+
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.threshold=DEBUG
+log4j.appender.file.File=${log.dir}/log4j.log
+log4j.appender.file.DatePattern=-yyyyMMddHH
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.Append=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=DEBUG
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
diff --git a/examples/helloworld/dubbo/go-client/app/client.go b/examples/helloworld/dubbo/go-client/app/client.go
new file mode 100644
index 0000000000000000000000000000000000000000..b416edb5a9b77c2782af01de854bc0c40b4b00bb
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/app/client.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 main
+
+import (
+ "context"
+ "fmt"
+ "time"
+)
+
+import (
+ _ "github.com/apache/dubbo-go/common/proxy/proxy_factory"
+ "github.com/apache/dubbo-go/config"
+ _ "github.com/apache/dubbo-go/protocol/dubbo"
+ _ "github.com/apache/dubbo-go/registry/protocol"
+
+ _ "github.com/apache/dubbo-go/filter/impl"
+
+ _ "github.com/apache/dubbo-go/cluster/cluster_impl"
+ _ "github.com/apache/dubbo-go/cluster/loadbalance"
+ _ "github.com/apache/dubbo-go/registry/zookeeper"
+)
+
+// they are necessary:
+// export CONF_CONSUMER_FILE_PATH="xxx"
+// export APP_LOG_CONF_FILE="xxx"
+func main() {
+
+ config.Load()
+ time.Sleep(3e9)
+
+ println("\n\n\nstart to test dubbo")
+ user := &User{}
+ err := userProvider.GetUser(context.TODO(), []interface{}{"A001"}, user)
+ if err != nil {
+ panic(err)
+ }
+ fmt.Printf("response result: %v\n", user)
+}
diff --git a/examples/helloworld/dubbo/go-client/app/user.go b/examples/helloworld/dubbo/go-client/app/user.go
new file mode 100644
index 0000000000000000000000000000000000000000..9820dbc08b0f52af9a6d4f9fa364344f0649fbc8
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/app/user.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 main
+
+import (
+ "context"
+ "time"
+)
+
+import (
+ hessian "github.com/apache/dubbo-go-hessian2"
+)
+
+import (
+ "github.com/apache/dubbo-go/config"
+)
+
+var userProvider = new(UserProvider)
+
+func init() {
+ config.SetConsumerService(userProvider)
+ hessian.RegisterPOJO(&User{})
+}
+
+type User struct {
+ Id string
+ Name string
+ Age int32
+ Time time.Time
+}
+
+type UserProvider struct {
+ GetUser func(ctx context.Context, req []interface{}, rsp *User) error
+}
+
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
+}
+
+func (User) JavaClassName() string {
+ return "com.ikurento.user.User"
+}
diff --git a/examples/helloworld/dubbo/go-client/assembly/bin/load.sh b/examples/helloworld/dubbo/go-client/assembly/bin/load.sh
new file mode 100644
index 0000000000000000000000000000000000000000..07d5d15eac7b7974845e36c3807e7ec55875de65
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/bin/load.sh
@@ -0,0 +1,196 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : dubbogo app devops script
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-05-13 02:01
+# FILE : load.sh
+# ******************************************************
+
+APP_NAME="APPLICATION_NAME"
+APP_ARGS=""
+SLEEP_INTERVAL=5
+MAX_LIFETIME=4000
+
+PROJECT_HOME=""
+OS_NAME=`uname`
+if [[ ${OS_NAME} != "Windows" ]]; then
+ PROJECT_HOME=`pwd`
+ PROJECT_HOME=${PROJECT_HOME}"/"
+else
+ APP_NAME="APPLICATION_NAME.exe"
+fi
+
+export CONF_CONSUMER_FILE_PATH=${PROJECT_HOME}"TARGET_CONF_FILE"
+export APP_LOG_CONF_FILE=${PROJECT_HOME}"TARGET_LOG_CONF_FILE"
+# export GOTRACEBACK=system
+# export GODEBUG=gctrace=1
+
+usage() {
+ echo "Usage: $0 start [conf suffix]"
+ echo " $0 stop"
+ echo " $0 term"
+ echo " $0 restart"
+ echo " $0 list"
+ echo " $0 monitor"
+ echo " $0 crontab"
+ exit
+}
+
+start() {
+ arg=$1
+ if [ "$arg" = "" ];then
+ echo "No registry type! Default client.yml!"
+ else
+ export CONF_CONSUMER_FILE_PATH=${CONF_CONSUMER_FILE_PATH//\.yml/\_$arg\.yml}
+ fi
+ if [ ! -f "${CONF_CONSUMER_FILE_PATH}" ];then
+ echo $CONF_CONSUMER_FILE_PATH" is not existing!"
+ return
+ fi
+ APP_LOG_PATH=${PROJECT_HOME}"logs/"
+ mkdir -p ${APP_LOG_PATH}
+ APP_BIN=${PROJECT_HOME}sbin/${APP_NAME}
+ chmod u+x ${APP_BIN}
+ # CMD="nohup ${APP_BIN} ${APP_ARGS} >>${APP_NAME}.nohup.out 2>&1 &"
+ CMD="${APP_BIN}"
+ eval ${CMD}
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ CUR=`date +%FT%T`
+ if [ "${PID}" != "" ]; then
+ for p in ${PID}
+ do
+ echo "start ${APP_NAME} ( pid =" ${p} ") at " ${CUR}
+ done
+ fi
+}
+
+stop() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [ "${PID}" != "" ];
+ then
+ for ps in ${PID}
+ do
+ echo "kill -SIGINT ${APP_NAME} ( pid =" ${ps} ")"
+ kill -2 ${ps}
+ done
+ fi
+}
+
+
+term() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [ "${PID}" != "" ];
+ then
+ for ps in ${PID}
+ do
+ echo "kill -9 ${APP_NAME} ( pid =" ${ps} ")"
+ kill -9 ${ps}
+ done
+ fi
+}
+
+list() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{printf("%s,%s,%s,%s\n", $1, $2, $9, $10)}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{printf("%s,%s,%s,%s,%s\n", $1, $4, $6, $7, $8)}'`
+ fi
+
+ if [ "${PID}" != "" ]; then
+ echo "list ${APP_NAME}"
+
+ if [[ ${OS_NAME} == "Linux" || ${OS_NAME} == "Darwin" ]]; then
+ echo "index: user, pid, start, duration"
+ else
+ echo "index: PID, WINPID, UID, STIME, COMMAND"
+ fi
+ idx=0
+ for ps in ${PID}
+ do
+ echo "${idx}: ${ps}"
+ ((idx ++))
+ done
+ fi
+}
+
+monitor() {
+ idx=0
+ while true; do
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [[ "${PID}" == "" ]]; then
+ start
+ idx=0
+ fi
+
+ ((LIFE=idx*${SLEEP_INTERVAL}))
+ echo "${APP_NAME} ( pid = " ${PID} ") has been working in normal state for " $LIFE " seconds."
+ ((idx ++))
+ sleep ${SLEEP_INTERVAL}
+ done
+}
+
+crontab() {
+ idx=0
+ while true; do
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [[ "${PID}" == "" ]]; then
+ start
+ idx=0
+ fi
+
+ ((LIFE=idx*${SLEEP_INTERVAL}))
+ echo "${APP_NAME} ( pid = " ${PID} ") has been working in normal state for " $LIFE " seconds."
+ ((idx ++))
+ sleep ${SLEEP_INTERVAL}
+ if [[ ${LIFE} -gt ${MAX_LIFETIME} ]]; then
+ kill -9 ${PID}
+ fi
+ done
+}
+
+opt=$1
+case C"$opt" in
+ Cstart)
+ start $2
+ ;;
+ Cstop)
+ stop
+ ;;
+ Cterm)
+ term
+ ;;
+ Crestart)
+ term
+ start $2
+ ;;
+ Clist)
+ list
+ ;;
+ Cmonitor)
+ monitor
+ ;;
+ Ccrontab)
+ crontab
+ ;;
+ C*)
+ usage
+ ;;
+esac
+
diff --git a/examples/helloworld/dubbo/go-client/assembly/common/app.properties b/examples/helloworld/dubbo/go-client/assembly/common/app.properties
new file mode 100644
index 0000000000000000000000000000000000000000..6bbd6db850ceeaf5ff873fee01a3578237cbd557
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/common/app.properties
@@ -0,0 +1,17 @@
+# dubbogo application configure script
+# ******************************************************
+# DESC : dubbogo environment variable
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:29
+# FILE : app.properties
+# ******************************************************
+
+export TARGET_EXEC_NAME="user_info_client"
+# BUILD_PACKAGE="dubbogo-examples/user-info/client/app"
+export BUILD_PACKAGE="app"
+
+export TARGET_CONF_FILE="conf/client.yml"
+export TARGET_LOG_CONF_FILE="conf/log.yml"
diff --git a/examples/helloworld/dubbo/go-client/assembly/common/build.sh b/examples/helloworld/dubbo/go-client/assembly/common/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..e72418297ad2f0ac6985476b5a8d5e03b9e7584e
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/common/build.sh
@@ -0,0 +1,77 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:28
+# FILE : build.sh
+# ******************************************************
+
+rm -rf target/
+
+PROJECT_HOME=`pwd`
+TARGET_FOLDER=${PROJECT_HOME}/target/${GOOS}
+
+TARGET_SBIN_NAME=${TARGET_EXEC_NAME}
+version=`cat app/version.go | grep Version | grep -v "Apache" | awk -F '=' '{print $2}' | awk -F '"' '{print $2}'`
+if [[ ${GOOS} == "windows" ]]; then
+ TARGET_SBIN_NAME=${TARGET_SBIN_NAME}.exe
+fi
+TARGET_NAME=${TARGET_FOLDER}/${TARGET_SBIN_NAME}
+if [[ $PROFILE == "dev" || $PROFILE == "test" ]]; then
+ # GFLAGS=-gcflags "-N -l" -race -x -v # -x会把go build的详细过程输出
+ # GFLAGS=-gcflags "-N -l" -race -v
+ # GFLAGS="-gcflags \"-N -l\" -v"
+ cd ${BUILD_PACKAGE} && GOOS=$GOOS GOARCH=$GOARCH go build -gcflags "-N -l" -x -v -i -o ${TARGET_NAME} && cd -
+else
+ # -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果),
+ # -w去掉DWARF调试信息,得到的程序就不能用gdb调试了。-s和-w也可以分开使用,一般来说如果不打算用gdb调试,
+ # -w基本没啥损失。-s的损失就有点大了。
+ cd ${BUILD_PACKAGE} && GOOS=$GOOS GOARCH=$GOARCH go build -ldflags "-w" -x -v -i -o ${TARGET_NAME} && cd -
+fi
+
+TAR_NAME=${TARGET_EXEC_NAME}-${version}-`date "+%Y%m%d-%H%M"`-${PROFILE}
+
+mkdir -p ${TARGET_FOLDER}/${TAR_NAME}
+
+SBIN_DIR=${TARGET_FOLDER}/${TAR_NAME}/sbin
+BIN_DIR=${TARGET_FOLDER}/${TAR_NAME}
+CONF_DIR=${TARGET_FOLDER}/${TAR_NAME}/conf
+
+mkdir -p ${SBIN_DIR}
+mkdir -p ${CONF_DIR}
+
+mv ${TARGET_NAME} ${SBIN_DIR}
+cp -r assembly/bin ${BIN_DIR}
+cd ${BIN_DIR}/bin/ && mv load.sh load_${TARGET_EXEC_NAME}.sh && cd -
+
+platform=$(uname)
+# modify APPLICATION_NAME
+if [ ${platform} == "Darwin" ]; then
+ sed -i "" "s~APPLICATION_NAME~${TARGET_EXEC_NAME}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~APPLICATION_NAME~${TARGET_EXEC_NAME}~g" ${BIN_DIR}/bin/*
+fi
+
+# modify TARGET_CONF_FILE
+if [ ${platform} == "Darwin" ]; then
+ sed -i "" "s~TARGET_CONF_FILE~${TARGET_CONF_FILE}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~TARGET_CONF_FILE~${TARGET_CONF_FILE}~g" ${BIN_DIR}/bin/*
+fi
+
+# modify TARGET_LOG_CONF_FILE
+if [ ${platform} == "Darwin" ]; then
+ sed -i "" "s~TARGET_LOG_CONF_FILE~${TARGET_LOG_CONF_FILE}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~TARGET_LOG_CONF_FILE~${TARGET_LOG_CONF_FILE}~g" ${BIN_DIR}/bin/*
+fi
+
+cp -r profiles/${PROFILE}/* ${CONF_DIR}
+
+cd ${TARGET_FOLDER}
+
+tar czf ${TAR_NAME}.tar.gz ${TAR_NAME}/*
+
diff --git a/examples/helloworld/dubbo/go-client/assembly/linux/dev.sh b/examples/helloworld/dubbo/go-client/assembly/linux/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..3373f01b948b708cd7bc1958c9d56a9042c60a68
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/linux/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-18 13:24
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="dev"
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/linux/release.sh b/examples/helloworld/dubbo/go-client/assembly/linux/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..34867b8b3488778cd76a1dc7802393dcab6b0df0
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/linux/release.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="release"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/linux/test.sh b/examples/helloworld/dubbo/go-client/assembly/linux/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..1bbbefd1e14e08c16deaf859e2841f4d1fe88e9c
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/linux/test.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="test"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/mac/dev.sh b/examples/helloworld/dubbo/go-client/assembly/mac/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..b68ac83b6524a6713cd90c4fc5968fe64b1a9545
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/mac/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-18 13:24
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+export PROFILE="dev"
+
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/mac/release.sh b/examples/helloworld/dubbo/go-client/assembly/mac/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..688288b3b1b989e8af70a3674b34ea8e0668f3b4
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/mac/release.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+export PROFILE="release"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/mac/test.sh b/examples/helloworld/dubbo/go-client/assembly/mac/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..56d6c11ecd6a1dc5984c74b88c10be9239e57428
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/mac/test.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+export PROFILE="test"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/windows/dev.sh b/examples/helloworld/dubbo/go-client/assembly/windows/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..91cf6f23bcbecb26db798469a30529261aabbbb6
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/windows/dev.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-18 13:24
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+export PROFILE="dev"
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/windows/release.sh b/examples/helloworld/dubbo/go-client/assembly/windows/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..f317720bd53d9c9e5f8f484b6eb682c9c736af0c
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/windows/release.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+export PROFILE="release"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-client/assembly/windows/test.sh b/examples/helloworld/dubbo/go-client/assembly/windows/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..7dd2bec5260e647b57a46aaa37acc098babff068
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/assembly/windows/test.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+export PROFILE="test"
+export PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+ . ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+ sh ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/dubbo/go-client/profiles/dev/client.yml b/examples/helloworld/dubbo/go-client/profiles/dev/client.yml
similarity index 77%
rename from examples/dubbo/go-client/profiles/dev/client.yml
rename to examples/helloworld/dubbo/go-client/profiles/dev/client.yml
index 1595f23c34d3a374c47678ecc7350696e1d8b2c9..fed05b09734c41ef7b53ad2d88a953f997d50735 100644
--- a/examples/dubbo/go-client/profiles/dev/client.yml
+++ b/examples/helloworld/dubbo/go-client/profiles/dev/client.yml
@@ -17,30 +17,25 @@ application_config:
environment : "dev"
registries :
- "hangzhouzk":
- # 对应java配置中address属性的zookeeper <dubbo:registry address="zookeeper://127.0.0.1:2181"/>
+ "demoZk":
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"
+ registry: "demoZk"
protocol : "dubbo"
interface : "com.ikurento.user.UserProvider"
cluster: "failover"
methods :
- - name: "GetUser"
- retries: 3
+ - name: "GetUser"
+ retries: 3
+
protocol_conf:
dubbo:
@@ -48,7 +43,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
diff --git a/examples/helloworld/dubbo/go-client/profiles/dev/log.yml b/examples/helloworld/dubbo/go-client/profiles/dev/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..59fa4279ad85272c4c49d532beaf23b74d00f58a
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/profiles/dev/log.yml
@@ -0,0 +1,28 @@
+
+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/examples/dubbo/go-client/profiles/release/client.yml b/examples/helloworld/dubbo/go-client/profiles/release/client.yml
similarity index 87%
rename from examples/dubbo/go-client/profiles/release/client.yml
rename to examples/helloworld/dubbo/go-client/profiles/release/client.yml
index 7a193ea64d783220f016c6b6220d602a5c586129..02bf722754632f12d0e8e7cab3979ce360ffd7c7 100644
--- a/examples/dubbo/go-client/profiles/release/client.yml
+++ b/examples/helloworld/dubbo/go-client/profiles/release/client.yml
@@ -23,20 +23,13 @@ registries :
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 : "dubbo"
-# version: "2.0"
-# group: "as"
interface : "com.ikurento.user.UserProvider"
cluster: "failover"
methods :
@@ -49,7 +42,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
diff --git a/examples/helloworld/dubbo/go-client/profiles/release/log.yml b/examples/helloworld/dubbo/go-client/profiles/release/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e0514be020eedf594d99d112183cdd5ce199e46d
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/profiles/release/log.yml
@@ -0,0 +1,28 @@
+
+level: "warn"
+development: true
+disableCaller: true
+disableStacktrace: true
+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/examples/dubbo/go-client/profiles/test/client.yml b/examples/helloworld/dubbo/go-client/profiles/test/client.yml
similarity index 84%
rename from examples/dubbo/go-client/profiles/test/client.yml
rename to examples/helloworld/dubbo/go-client/profiles/test/client.yml
index 24ede19d7d2365fb9c7d92d31bc312cfc7935388..417a388c6cfb38a6a1563e9c4ab8856e4b2f30f8 100644
--- a/examples/dubbo/go-client/profiles/test/client.yml
+++ b/examples/helloworld/dubbo/go-client/profiles/test/client.yml
@@ -23,25 +23,17 @@ registries :
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 : "dubbo"
-# version: "2.0"
-# group: "as"
interface : "com.ikurento.user.UserProvider"
cluster: "failover"
methods :
- - name: "GetUser"
- retries: 3
+ - name: "GetUser"
+ retries: 3
protocol_conf:
dubbo:
@@ -49,7 +41,6 @@ protocol_conf:
connection_number: 2
heartbeat_period: "5s"
session_timeout: "20s"
- fail_fast_timeout: "5s"
pool_size: 64
pool_ttl: 600
getty_session_param:
diff --git a/examples/helloworld/dubbo/go-client/profiles/test/log.yml b/examples/helloworld/dubbo/go-client/profiles/test/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..baee0b7248484e425f88f35ab128212c931ff85e
--- /dev/null
+++ b/examples/helloworld/dubbo/go-client/profiles/test/log.yml
@@ -0,0 +1,28 @@
+
+level: "info"
+development: false
+disableCaller: false
+disableStacktrace: true
+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/examples/helloworld/dubbo/go-server/app/server.go b/examples/helloworld/dubbo/go-server/app/server.go
new file mode 100644
index 0000000000000000000000000000000000000000..29f2ad57ead58c09614ccf5f7098c77612085449
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/app/server.go
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+ "fmt"
+ "os"
+ "os/signal"
+ "syscall"
+ "time"
+)
+
+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"
+
+ _ "github.com/apache/dubbo-go/common/proxy/proxy_factory"
+ _ "github.com/apache/dubbo-go/filter/impl"
+
+ _ "github.com/apache/dubbo-go/cluster/cluster_impl"
+ _ "github.com/apache/dubbo-go/cluster/loadbalance"
+ _ "github.com/apache/dubbo-go/registry/zookeeper"
+)
+
+var (
+ survivalTimeout = int(3e9)
+)
+
+// they are necessary:
+// export CONF_PROVIDER_FILE_PATH="xxx"
+// export APP_LOG_CONF_FILE="xxx"
+func main() {
+
+ config.Load()
+
+ initSignal()
+}
+
+func initSignal() {
+ signals := make(chan os.Signal, 1)
+ // It is not possible to block SIGKILL or syscall.SIGSTOP
+ signal.Notify(signals, os.Interrupt, os.Kill, syscall.SIGHUP, syscall.SIGQUIT, syscall.SIGTERM, syscall.SIGINT)
+ for {
+ sig := <-signals
+ logger.Infof("get signal %s", sig.String())
+ switch sig {
+ case syscall.SIGHUP:
+ // reload()
+ default:
+ go time.AfterFunc(time.Duration(survivalTimeout), func() {
+ logger.Warnf("app exit now by force...")
+ os.Exit(1)
+ })
+
+ // 要么fastFailTimeout时间内执行完毕下面的逻辑然后程序退出,要么执行上面的超时函数程序强行退出
+ fmt.Println("provider app exit now...")
+ return
+ }
+ }
+}
diff --git a/examples/helloworld/dubbo/go-server/app/user.go b/examples/helloworld/dubbo/go-server/app/user.go
new file mode 100644
index 0000000000000000000000000000000000000000..ee7aa1c7ed33654ae38bdf2d8fd77257a70e3e85
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/app/user.go
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package main
+
+import (
+ "context"
+ "time"
+)
+
+import (
+ "github.com/apache/dubbo-go-hessian2"
+)
+
+import (
+ "github.com/apache/dubbo-go/config"
+)
+
+func init() {
+ config.SetProviderService(new(UserProvider))
+ // ------for hessian2------
+ hessian.RegisterPOJO(&User{})
+}
+
+type User struct {
+ Id string
+ Name string
+ Age int32
+ Time time.Time
+}
+
+type UserProvider struct {
+}
+
+func (u *UserProvider) GetUser(ctx context.Context, req []interface{}) (*User, error) {
+ return &User{"A001", "Alex Stocks", 18, time.Now()}, nil
+}
+
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
+}
+
+func (u User) JavaClassName() string {
+ return "com.ikurento.user.User"
+}
diff --git a/examples/helloworld/dubbo/go-server/assembly/bin/load.sh b/examples/helloworld/dubbo/go-server/assembly/bin/load.sh
new file mode 100644
index 0000000000000000000000000000000000000000..47fc5e38ded155a43c30b8cbf4d2a5ae04b58d0c
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/bin/load.sh
@@ -0,0 +1,144 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : dubbogo app devops script
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-05-13 02:01
+# FILE : load.sh
+# ******************************************************
+
+APP_NAME="APPLICATION_NAME"
+APP_ARGS=""
+
+
+PROJECT_HOME=""
+OS_NAME=`uname`
+if [[ ${OS_NAME} != "Windows" ]]; then
+ PROJECT_HOME=`pwd`
+ PROJECT_HOME=${PROJECT_HOME}"/"
+fi
+
+export CONF_PROVIDER_FILE_PATH=${PROJECT_HOME}"TARGET_CONF_FILE"
+export APP_LOG_CONF_FILE=${PROJECT_HOME}"TARGET_LOG_CONF_FILE"
+
+usage() {
+ echo "Usage: $0 start [conf suffix]"
+ echo " $0 stop"
+ echo " $0 term"
+ echo " $0 restart"
+ echo " $0 list"
+ echo " $0 monitor"
+ echo " $0 crontab"
+ exit
+}
+
+start() {
+ arg=$1
+ if [ "$arg" = "" ];then
+ echo "No registry type! Default server.yml!"
+ else
+ export CONF_PROVIDER_FILE_PATH=${CONF_PROVIDER_FILE_PATH//\.yml/\_$arg\.yml}
+ fi
+ if [ ! -f "${CONF_PROVIDER_FILE_PATH}" ];then
+ echo $CONF_PROVIDER_FILE_PATH" is not existing!"
+ return
+ fi
+ APP_LOG_PATH="${PROJECT_HOME}logs/"
+ mkdir -p ${APP_LOG_PATH}
+ APP_BIN=${PROJECT_HOME}sbin/${APP_NAME}
+ chmod u+x ${APP_BIN}
+ # CMD="nohup ${APP_BIN} ${APP_ARGS} >>${APP_NAME}.nohup.out 2>&1 &"
+ CMD="${APP_BIN}"
+ eval ${CMD}
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ CUR=`date +%FT%T`
+ if [ "${PID}" != "" ]; then
+ for p in ${PID}
+ do
+ echo "start ${APP_NAME} ( pid =" ${p} ") at " ${CUR}
+ done
+ fi
+}
+
+stop() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [ "${PID}" != "" ];
+ then
+ for ps in ${PID}
+ do
+ echo "kill -SIGINT ${APP_NAME} ( pid =" ${ps} ")"
+ kill -2 ${ps}
+ done
+ fi
+}
+
+
+term() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $2}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{print $1}'`
+ fi
+ if [ "${PID}" != "" ];
+ then
+ for ps in ${PID}
+ do
+ echo "kill -9 ${APP_NAME} ( pid =" ${ps} ")"
+ kill -9 ${ps}
+ done
+ fi
+}
+
+list() {
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{printf("%s,%s,%s,%s\n", $1, $2, $9, $10)}'`
+ if [[ ${OS_NAME} != "Linux" && ${OS_NAME} != "Darwin" ]]; then
+ PID=`ps aux | grep -w ${APP_NAME} | grep -v grep | awk '{printf("%s,%s,%s,%s,%s\n", $1, $4, $6, $7, $8)}'`
+ fi
+
+ if [ "${PID}" != "" ]; then
+ echo "list ${APP_NAME}"
+
+ if [[ ${OS_NAME} == "Linux" || ${OS_NAME} == "Darwin" ]]; then
+ echo "index: user, pid, start, duration"
+ else
+ echo "index: PID, WINPID, UID, STIME, COMMAND"
+ fi
+ idx=0
+ for ps in ${PID}
+ do
+ echo "${idx}: ${ps}"
+ ((idx ++))
+ done
+ fi
+}
+
+opt=$1
+case C"$opt" in
+ Cstart)
+ start $2
+ ;;
+ Cstop)
+ stop
+ ;;
+ Cterm)
+ term
+ ;;
+ Crestart)
+ term
+ start $2
+ ;;
+ Clist)
+ list
+ ;;
+ C*)
+ usage
+ ;;
+esac
+
diff --git a/examples/helloworld/dubbo/go-server/assembly/common/app.properties b/examples/helloworld/dubbo/go-server/assembly/common/app.properties
new file mode 100644
index 0000000000000000000000000000000000000000..dffb755b0811dd140d3f04e232f5f80ff60181df
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/common/app.properties
@@ -0,0 +1,17 @@
+# dubbogo application configure script
+# ******************************************************
+# DESC : application environment variable
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:29
+# FILE : app.properties
+# ******************************************************
+
+TARGET_EXEC_NAME="user_info_server"
+# BUILD_PACKAGE="dubbogo-examples/user-info/server/app"
+BUILD_PACKAGE="app"
+
+TARGET_CONF_FILE="conf/server.yml"
+TARGET_LOG_CONF_FILE="conf/log.yml"
diff --git a/examples/helloworld/dubbo/go-server/assembly/common/build.sh b/examples/helloworld/dubbo/go-server/assembly/common/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..15ac904f7c265d942d7018439719af7e7391aa41
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/common/build.sh
@@ -0,0 +1,74 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:28
+# FILE : build.sh
+# ******************************************************
+
+rm -rf target/
+
+PROJECT_HOME=`pwd`
+TARGET_FOLDER=${PROJECT_HOME}/target/${GOOS}
+
+TARGET_SBIN_NAME=${TARGET_EXEC_NAME}
+version=`cat app/version.go | grep Version | grep -v "Apache" | awk -F '=' '{print $2}' | awk -F '"' '{print $2}'`
+if [[ ${GOOS} == "windows" ]]; then
+ TARGET_SBIN_NAME=${TARGET_SBIN_NAME}.exe
+fi
+TARGET_NAME=${TARGET_FOLDER}/${TARGET_SBIN_NAME}
+if [[ $PROFILE = "test" ]]; then
+ # GFLAGS=-gcflags "-N -l" -race -x -v # -x会把go build的详细过程输出
+ # GFLAGS=-gcflags "-N -l" -race -v
+ # GFLAGS="-gcflags \"-N -l\" -v"
+ cd ${BUILD_PACKAGE} && go build -gcflags "-N -l" -x -v -i -o ${TARGET_NAME} && cd -
+else
+ # -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了,这个等价于普通C/C++程序被strip的效果),
+ # -w去掉DWARF调试信息,得到的程序就不能用gdb调试了。-s和-w也可以分开使用,一般来说如果不打算用gdb调试,
+ # -w基本没啥损失。-s的损失就有点大了。
+ cd ${BUILD_PACKAGE} && go build -ldflags "-w" -x -v -i -o ${TARGET_NAME} && cd -
+fi
+
+TAR_NAME=${TARGET_EXEC_NAME}-${version}-`date "+%Y%m%d-%H%M"`-${PROFILE}
+
+mkdir -p ${TARGET_FOLDER}/${TAR_NAME}
+
+SBIN_DIR=${TARGET_FOLDER}/${TAR_NAME}/sbin
+BIN_DIR=${TARGET_FOLDER}/${TAR_NAME}
+CONF_DIR=${TARGET_FOLDER}/${TAR_NAME}/conf
+
+mkdir -p ${SBIN_DIR}
+mkdir -p ${CONF_DIR}
+
+mv ${TARGET_NAME} ${SBIN_DIR}
+cp -r assembly/bin ${BIN_DIR}
+# modify APPLICATION_NAME
+# OS=`uname`
+# if [[ $OS=="Darwin" ]]; then
+if [ "$(uname)" == "Darwin" ]; then
+ sed -i "" "s~APPLICATION_NAME~${TARGET_EXEC_NAME}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~APPLICATION_NAME~${TARGET_EXEC_NAME}~g" ${BIN_DIR}/bin/*
+fi
+# modify TARGET_CONF_FILE
+if [ "$(uname)" == "Darwin" ]; then
+ sed -i "" "s~TARGET_CONF_FILE~${TARGET_CONF_FILE}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~TARGET_CONF_FILE~${TARGET_CONF_FILE}~g" ${BIN_DIR}/bin/*
+fi
+# modify TARGET_LOG_CONF_FILE
+if [ "$(uname)" == "Darwin" ]; then
+ sed -i "" "s~TARGET_LOG_CONF_FILE~${TARGET_LOG_CONF_FILE}~g" ${BIN_DIR}/bin/*
+else
+ sed -i "s~TARGET_LOG_CONF_FILE~${TARGET_LOG_CONF_FILE}~g" ${BIN_DIR}/bin/*
+fi
+
+cp -r profiles/${PROFILE}/* ${CONF_DIR}
+
+cd ${TARGET_FOLDER}
+
+tar czf ${TAR_NAME}.tar.gz ${TAR_NAME}/*
+
diff --git a/examples/helloworld/dubbo/go-server/assembly/linux/dev.sh b/examples/helloworld/dubbo/go-server/assembly/linux/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..55886f09fb4873be84cfa46aae592f5f000120a4
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/linux/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2018-06-24 17:32
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+PROFILE=dev
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/linux/release.sh b/examples/helloworld/dubbo/go-server/assembly/linux/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..9772ad9614583917d62beba2db9fcaefea63e1ed
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/linux/release.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:25
+# FILE : release.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+PROFILE=release
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/linux/test.sh b/examples/helloworld/dubbo/go-server/assembly/linux/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..2fc4a98862bee5ef11a23e1b74058627a899181d
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/linux/test.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=linux
+export GOARCH=amd64
+
+PROFILE=test
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/mac/dev.sh b/examples/helloworld/dubbo/go-server/assembly/mac/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..5dfa78490b895ce556c809ead32b6f517a5f1450
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/mac/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2018-06-24 17:32
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+PROFILE=dev
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/mac/release.sh b/examples/helloworld/dubbo/go-server/assembly/mac/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..1ec21c7b511ccce9eddfac22a2374b57a7a697bf
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/mac/release.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:25
+# FILE : release.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+PROFILE=release
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/mac/test.sh b/examples/helloworld/dubbo/go-server/assembly/mac/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..d34914c7dbed0e442b4accf51a3ecdf7c2984db8
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/mac/test.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:25
+# FILE : release.sh
+# ******************************************************
+
+set -e
+
+export GOOS=darwin
+export GOARCH=amd64
+
+PROFILE=test
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
+
diff --git a/examples/helloworld/dubbo/go-server/assembly/windows/dev.sh b/examples/helloworld/dubbo/go-server/assembly/windows/dev.sh
new file mode 100644
index 0000000000000000000000000000000000000000..97fbb6f698e500ad08d971b13cc1ffd00cd97803
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/windows/dev.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for dev env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2018-06-24 17:34
+# FILE : dev.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+PROFILE=dev
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/windows/release.sh b/examples/helloworld/dubbo/go-server/assembly/windows/release.sh
new file mode 100644
index 0000000000000000000000000000000000000000..782cb10c7828eb277b5905f10f8dd6ad1c2d6bed
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/windows/release.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for release env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:25
+# FILE : release.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+PROFILE=release
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/assembly/windows/test.sh b/examples/helloworld/dubbo/go-server/assembly/windows/test.sh
new file mode 100644
index 0000000000000000000000000000000000000000..2037ddecf2545f1543d5d28be728fb0899722098
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/assembly/windows/test.sh
@@ -0,0 +1,29 @@
+#!/usr/bin/env bash
+# ******************************************************
+# DESC : build script for test env
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2016-07-12 16:34
+# FILE : test.sh
+# ******************************************************
+
+
+set -e
+
+export GOOS=windows
+export GOARCH=amd64
+
+PROFILE=test
+
+PROJECT_HOME=`pwd`
+
+if [ -f "${PROJECT_HOME}/assembly/common/app.properties" ]; then
+. ${PROJECT_HOME}/assembly/common/app.properties
+fi
+
+
+if [ -f "${PROJECT_HOME}/assembly/common/build.sh" ]; then
+. ${PROJECT_HOME}/assembly/common/build.sh
+fi
diff --git a/examples/helloworld/dubbo/go-server/profiles/dev/log.yml b/examples/helloworld/dubbo/go-server/profiles/dev/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..59fa4279ad85272c4c49d532beaf23b74d00f58a
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/profiles/dev/log.yml
@@ -0,0 +1,28 @@
+
+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/examples/helloworld/dubbo/go-server/profiles/dev/server.yml b/examples/helloworld/dubbo/go-server/profiles/dev/server.yml
new file mode 100644
index 0000000000000000000000000000000000000000..be7eedeaa3fd186f4cd2ea264b31429165e55bf1
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/profiles/dev/server.yml
@@ -0,0 +1,57 @@
+# dubbo server yaml configure file
+
+
+# application config
+application_config:
+ organization : "ikurento.com"
+ name : "BDTService"
+ module : "dubbogo user-info server"
+ version : "0.0.1"
+ owner : "ZX"
+ environment : "dev"
+
+registries :
+ "demoZk":
+ protocol: "zookeeper"
+ timeout : "3s"
+ address: "127.0.0.1:2181"
+
+services:
+ "UserProvider":
+ # 可以指定多个registry,使用逗号隔开;不指定默认向所有注册中心注册
+ registry: "demoZk"
+ protocol : "dubbo"
+ # 相当于dubbo.xml中的interface
+ interface : "com.ikurento.user.UserProvider"
+ loadbalance: "random"
+ warmup: "100"
+ cluster: "failover"
+ methods:
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
+
+protocols:
+ "dubbo":
+ name: "dubbo"
+ port: 20000
+
+
+protocol_conf:
+ dubbo:
+ session_number: 700
+ session_timeout: "20s"
+ getty_session_param:
+ compress_encoding: false
+ tcp_no_delay: true
+ tcp_keep_alive: true
+ keep_alive_period: "120s"
+ tcp_r_buf_size: 262144
+ tcp_w_buf_size: 65536
+ pkg_rq_size: 1024
+ pkg_wq_size: 512
+ tcp_read_timeout: "1s"
+ tcp_write_timeout: "5s"
+ wait_timeout: "1s"
+ max_msg_len: 1024
+ session_name: "server"
diff --git a/examples/helloworld/dubbo/go-server/profiles/release/log.yml b/examples/helloworld/dubbo/go-server/profiles/release/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e0514be020eedf594d99d112183cdd5ce199e46d
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/profiles/release/log.yml
@@ -0,0 +1,28 @@
+
+level: "warn"
+development: true
+disableCaller: true
+disableStacktrace: true
+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/examples/dubbo/go-server/profiles/release/server.yml b/examples/helloworld/dubbo/go-server/profiles/release/server.yml
similarity index 89%
rename from examples/dubbo/go-server/profiles/release/server.yml
rename to examples/helloworld/dubbo/go-server/profiles/release/server.yml
index 3db12902f1d349e1703f2f977c682c61b0d35938..4786e83669046babbfc4758829155d8f4ce3a438 100644
--- a/examples/dubbo/go-server/profiles/release/server.yml
+++ b/examples/helloworld/dubbo/go-server/profiles/release/server.yml
@@ -17,12 +17,6 @@ registries :
address: "127.0.0.1:2181"
username: ""
password: ""
- "shanghaizk":
- protocol: "zookeeper"
- timeout : "3s"
- address: "127.0.0.1:2182"
- username: ""
- password: ""
services:
@@ -40,6 +34,7 @@ services:
retries: 1
loadbalance: "random"
+
protocols:
"dubbo1":
name: "dubbo"
@@ -50,7 +45,6 @@ protocols:
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
getty_session_param:
compress_encoding: false
diff --git a/examples/helloworld/dubbo/go-server/profiles/test/log.yml b/examples/helloworld/dubbo/go-server/profiles/test/log.yml
new file mode 100644
index 0000000000000000000000000000000000000000..baee0b7248484e425f88f35ab128212c931ff85e
--- /dev/null
+++ b/examples/helloworld/dubbo/go-server/profiles/test/log.yml
@@ -0,0 +1,28 @@
+
+level: "info"
+development: false
+disableCaller: false
+disableStacktrace: true
+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/examples/dubbo/go-server/profiles/test/server.yml b/examples/helloworld/dubbo/go-server/profiles/test/server.yml
similarity index 80%
rename from examples/dubbo/go-server/profiles/test/server.yml
rename to examples/helloworld/dubbo/go-server/profiles/test/server.yml
index 12f10e004c6b1b5ea1afcf37fe79306bd4d10d82..ba6eb2b8005a4dc2d655f44ec38b93a01072d4f1 100644
--- a/examples/dubbo/go-server/profiles/test/server.yml
+++ b/examples/helloworld/dubbo/go-server/profiles/test/server.yml
@@ -17,12 +17,7 @@ registries :
address: "127.0.0.1:2181"
username: ""
password: ""
- "shanghaizk":
- protocol: "zookeeper"
- timeout : "3s"
- address: "127.0.0.1:2182"
- username: ""
- password: ""
+
services:
@@ -36,21 +31,20 @@ services:
warmup: "100"
cluster: "failover"
methods:
- - name: "GetUser"
- retries: 1
- loadbalance: "random"
+ - name: "GetUser"
+ retries: 1
+ loadbalance: "random"
protocols:
"dubbo1":
- name: "dubbo"
- # ip : "127.0.0.1"
- port: 20000
+ name: "dubbo"
+ # ip : "127.0.0.1"
+ port: 20000
protocol_conf:
dubbo:
session_number: 700
- fail_fast_timeout: "5s"
session_timeout: "20s"
getty_session_param:
compress_encoding: false
diff --git a/examples/helloworld/dubbo/java-server/build.sh b/examples/helloworld/dubbo/java-server/build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..0c197da639c1c1d9375e18c24dd73366c49deefe
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/build.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+# ******************************************************
+# EMAIL : alexstocks@foxmail.com
+# FILE : build.sh
+# ******************************************************
+
+# mvn dependency:sources
+mvn clean package -Dmaven.test.skip
+# mvn -X clean compile package -DskipTests=true
diff --git a/examples/helloworld/dubbo/java-server/pom.xml b/examples/helloworld/dubbo/java-server/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..975157865e59f24693d755dd20b0aac4b179a793
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/pom.xml
@@ -0,0 +1,181 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>com.ikurento</groupId>
+ <artifactId>user-info-server</artifactId>
+ <packaging>jar</packaging>
+ <version>0.2.0</version>
+ <description>The demo provider module of dubbo project</description>
+ <properties>
+ <skip_maven_deploy>false</skip_maven_deploy>
+
+ <dubbo-version>2.6.5</dubbo-version>
+ <dubbo-jsonrpc-version>1.0.1</dubbo-jsonrpc-version>
+ </properties>
+
+ <dependencyManagement>
+ <dependencies>
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>dubbo-dependencies-bom</artifactId>
+ <version>${dubbo-version}</version>
+ <type>pom</type>
+ <scope>import</scope>
+ </dependency>
+ </dependencies>
+ </dependencyManagement>
+
+ <dependencies>
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-api</artifactId>
+ <version>1.7.25</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.alibaba</groupId>
+ <artifactId>dubbo</artifactId>
+ <version>${dubbo-version}</version>
+ <exclusions>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>io.netty</groupId>
+ <artifactId>netty-all</artifactId>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.curator</groupId>
+ <artifactId>curator-framework</artifactId>
+ <version>2.12.0</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.qianmi</groupId>
+ <artifactId>dubbo-rpc-jsonrpc</artifactId>
+ <version>${dubbo-jsonrpc-version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.mortbay.jetty</groupId>
+ <artifactId>jetty</artifactId>
+ <version>6.1.26</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.9.9</version>
+ </dependency>
+
+ <dependency>
+ <groupId>com.github.sgroschupf</groupId>
+ <artifactId>zkclient</artifactId>
+ <version>0.1</version>
+ <exclusions>
+ <exclusion>
+ <artifactId>org.apache.zookeeper</artifactId>
+ <groupId>zookeeper</groupId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+
+ <dependency>
+ <groupId>org.apache.zookeeper</groupId>
+ <artifactId>zookeeper</artifactId>
+ <version>3.4.14</version>
+ </dependency>
+
+ </dependencies>
+
+ <repositories>
+ <repository>
+ <id>nexus-aliyu</id>
+ <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </repository>
+ </repositories>
+ <pluginRepositories>
+ <pluginRepository>
+ <id>nexus-aliyu</id>
+ <url>http://maven.aliyun.com/nexus/content/groups/public</url>
+ <releases>
+ <enabled>true</enabled>
+ </releases>
+ <snapshots>
+ <enabled>false</enabled>
+ </snapshots>
+ </pluginRepository>
+ </pluginRepositories>
+
+
+ <build>
+
+ <plugins>
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>unpack</id>
+ <phase>package</phase>
+ <goals>
+ <goal>unpack</goal>
+ </goals>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>com.alibaba</groupId>
+ <artifactId>dubbo</artifactId>
+ <version>${dubbo-version}</version>
+ <outputDirectory>${project.build.directory}/dubbo</outputDirectory>
+ <includes>META-INF/assembly/**</includes>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+
+ <plugin>
+ <artifactId>maven-assembly-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>make-assembly</id>
+ <phase>package</phase>
+ <goals>
+ <goal>single</goal>
+ </goals>
+ <configuration>
+ <descriptors>
+ <descriptor>src/main/assembly/assembly.xml</descriptor>
+ </descriptors>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+
+
+</project>
+
+
diff --git a/examples/helloworld/dubbo/java-server/script/debug.sh b/examples/helloworld/dubbo/java-server/script/debug.sh
new file mode 100644
index 0000000000000000000000000000000000000000..27c5d800d846018127e762944151aa8e9ad4495d
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/script/debug.sh
@@ -0,0 +1,16 @@
+#!/us1r/bin/env bash
+# ******************************************************
+# DESC :
+# AUTHOR : Alex Stocks
+# VERSION : 1.0
+# LICENCE : Apache License 2.0
+# EMAIL : alexstocks@foxmail.com
+# MOD : 2017-10-09 21:52
+# FILE : to debug user info dubbo server
+# ******************************************************
+
+# 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/examples/helloworld/dubbo/java-server/src/main/assembly/assembly.xml b/examples/helloworld/dubbo/java-server/src/main/assembly/assembly.xml
new file mode 100644
index 0000000000000000000000000000000000000000..2f01fea20f5391112cccb88c87bfe4ae1b59750a
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/assembly/assembly.xml
@@ -0,0 +1,45 @@
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -
+ - Licensed 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.
+-->
+<assembly>
+ <id>assembly</id>
+ <formats>
+ <format>tar.gz</format>
+ </formats>
+ <includeBaseDirectory>true</includeBaseDirectory>
+ <fileSets>
+ <fileSet>
+ <directory>${project.build.directory}/dubbo/META-INF/assembly/bin</directory>
+ <outputDirectory>bin</outputDirectory>
+ <fileMode>0755</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ <fileSet>
+ <directory>src/main/assembly/conf</directory>
+ <includes>
+ <include>dubbo.properties</include>
+ <include>log4j.*</include>
+ </includes>
+ <outputDirectory>conf</outputDirectory>
+ <fileMode>0644</fileMode>
+ <directoryMode>0755</directoryMode>
+ </fileSet>
+ </fileSets>
+ <dependencySets>
+ <dependencySet>
+ <outputDirectory>lib</outputDirectory>
+ </dependencySet>
+ </dependencySets>
+</assembly>
\ No newline at end of file
diff --git a/examples/helloworld/dubbo/java-server/src/main/assembly/conf/dubbo.properties b/examples/helloworld/dubbo/java-server/src/main/assembly/conf/dubbo.properties
new file mode 100644
index 0000000000000000000000000000000000000000..2826f31303717256725b02a79e1698043709d2f3
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/assembly/conf/dubbo.properties
@@ -0,0 +1,14 @@
+### dubbo注册中心配置 ##
+dubbo.container = log4j,spring
+dubbo.application.name = user-info-server
+dubbo.application.environment = product
+dubbo.application.owner = AlexStocks
+dubbo.registry.address = 127.0.0.1:2181
+dubbo.registry.protocol = zookeeper
+dubbo.consumer.timeout = 10000
+dubbo.provider.timeout = 10000
+dubbo.protocol.name = dubbo
+dubbo.protocol.port = 10000
+
+dubbo.log4j.file = logs/dubbo.log
+dubbo.log4j.level = INFO
diff --git a/examples/helloworld/dubbo/java-server/src/main/assembly/conf/log4j.properties b/examples/helloworld/dubbo/java-server/src/main/assembly/conf/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..13c80493329261ea677de77624b363bf99c82652
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/assembly/conf/log4j.properties
@@ -0,0 +1,20 @@
+## Logger configure file for myproject
+log.dir=logs/
+datestamp=yyyy-MM-dd/HH:mm:ss.SSS
+
+log4j.rootLogger=DEBUG, file, console
+
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.threshold=DEBUG
+log4j.appender.file.File=${log.dir}/log4j.log
+log4j.appender.file.DatePattern=-yyyyMMddHH
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.Append=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=DEBUG
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
diff --git a/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java
new file mode 100644
index 0000000000000000000000000000000000000000..0031f5569fd5f16ded0da6e5426f78805fad4a42
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/Provider.java
@@ -0,0 +1,33 @@
+/*
+ * 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 com.ikurento.user;
+
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+
+public class Provider {
+
+ /**
+ * To get ipv6 address to work, add
+ * System.setProperty("java.net.preferIPv6Addresses", "true");
+ * before running your application.
+ */
+ public static void main(String[] args) throws Exception {
+ ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/dubbo.provider.xml"});
+ context.start();
+ System.in.read(); // press any key to exit
+ }
+}
diff --git a/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/User.java b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/User.java
new file mode 100644
index 0000000000000000000000000000000000000000..06f3f18f0a8ae940000fae3155e448c3181a0054
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/User.java
@@ -0,0 +1,70 @@
+package com.ikurento.user;
+// ref: https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+import java.util.Date;
+import java.io.Serializable;
+
+public class User implements Serializable {
+
+ private String id;
+
+ private String name;
+
+ private int age;
+
+ private Date time = new Date();
+
+ public User() {
+ }
+
+ public User(String id, String name, int age) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ }
+
+ public User(String id, String name, int age, Date time) {
+ this.id = id;
+ this.name = name;
+ this.age = age;
+ this.time = time;
+ }
+
+ public String getId() {
+ return id;
+ }
+
+ public void setId(String id) {
+ this.id = id;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public int getAge() {
+ return age;
+ }
+
+ public void setAge(int age) {
+ this.age = age;
+ }
+
+ public Date getTime() {
+ return time;
+ }
+
+ public void setTime(Date time) {
+ this.time = time;
+ }
+
+
+
+ public String toString() {
+ return "User{id:" + id + ", name:" + name + ", age:" + age + ", time:" + time +"}";
+ }
+}
diff --git a/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..f3301cd642ca58a57ac5e2041ec5f958d383b7fb
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/UserProvider.java
@@ -0,0 +1,9 @@
+package com.ikurento.user;
+// https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+
+public interface UserProvider {
+
+ User GetUser(String userId); // the first alpha is Upper case to compatible with golang.
+
+}
diff --git a/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..ddbccab37bbe2cc59b584e59ef317d5bdaeae32d
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/java/com/ikurento/user/UserProviderImpl.java
@@ -0,0 +1,15 @@
+package com.ikurento.user;
+
+// ref: https://github.com/JoeCao/dubbo_jsonrpc_example/tree/master/dubbo_server/src/main/java/com/ofpay/demo/api
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class UserProviderImpl implements UserProvider {
+ private static final Logger LOG = LoggerFactory.getLogger("UserLogger"); // 输出到user-server.log
+
+ public User GetUser(String userId) {
+ return new User(userId, "zhangsan", 18);
+ }
+
+}
diff --git a/examples/helloworld/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml b/examples/helloworld/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fe23e1f3e91d841c30534c82d8d69e6628f6b528
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/resources/META-INF/spring/dubbo.provider.xml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ - Copyright 1999-2011 Alibaba Group.
+ -
+ - Licensed 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
+ xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
+ http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
+
+ <!-- 应用名 -->
+ <dubbo:application name="user-info-server"/>
+ <!-- 连接到哪个本地注册中心 -->
+ <dubbo:registry id="ikurento" address="zookeeper://127.0.0.1:2181" />
+ <!-- 用dubbo协议在20880端口暴露服务 -->
+ <!-- dubbo:protocol host="127.0.0.1" / -->
+ <dubbo:protocol id="dubbo" name="dubbo" host="127.0.0.1" port="20010" />
+ <!-- 声明需要暴露的服务接口 -->
+ <dubbo:service id="aaa" registry="ikurento" timeout="3000" interface="com.ikurento.user.UserProvider" ref="demoService"/>
+
+ <bean id="demoService" class="com.ikurento.user.UserProviderImpl" />
+
+</beans>
diff --git a/examples/helloworld/dubbo/java-server/src/main/resources/log4j.properties b/examples/helloworld/dubbo/java-server/src/main/resources/log4j.properties
new file mode 100644
index 0000000000000000000000000000000000000000..13c80493329261ea677de77624b363bf99c82652
--- /dev/null
+++ b/examples/helloworld/dubbo/java-server/src/main/resources/log4j.properties
@@ -0,0 +1,20 @@
+## Logger configure file for myproject
+log.dir=logs/
+datestamp=yyyy-MM-dd/HH:mm:ss.SSS
+
+log4j.rootLogger=DEBUG, file, console
+
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.threshold=DEBUG
+log4j.appender.file.File=${log.dir}/log4j.log
+log4j.appender.file.DatePattern=-yyyyMMddHH
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.Append=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
+log4j.appender.console=org.apache.log4j.ConsoleAppender
+log4j.appender.console.Threshold=DEBUG
+log4j.appender.console.layout=org.apache.log4j.PatternLayout
+log4j.appender.console.layout.ConversionPattern=%d{${datestamp}} %5p: %l - %m%n
+
diff --git a/examples/jsonrpc/go-client/profiles/test/client.yml b/examples/jsonrpc/go-client/profiles/test/client.yml
deleted file mode 100644
index 1b0529c455a9492d68d040632451bd13198552a4..0000000000000000000000000000000000000000
--- a/examples/jsonrpc/go-client/profiles/test/client.yml
+++ /dev/null
@@ -1,67 +0,0 @@
-# dubbo client yaml configure file
-
-check: true
-# client
-request_timeout : "3s"
-# connect timeout
-connect_timeout : "3s"
-
-# application config
-application_config:
- organization : "ikurento.com"
- name : "BDTService"
- module : "dubbogo user-info client"
- version : "0.0.1"
- owner : "ZX"
- environment : "test"
-
-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"
-# version : "2.0"
-# group: "as"
- interface : "com.ikurento.user.UserProvider"
- cluster: "failover"
- methods :
- - name: "GetUser"
- retries: 3
-
-protocol_conf:
- dubbo:
- reconnect_interval: 0
- connection_number: 2
- heartbeat_period: "5s"
- session_timeout: "20s"
- fail_fast_timeout: "5s"
- pool_size: 64
- pool_ttl: 600
- getty_session_param:
- compress_encoding: false
- tcp_no_delay: true
- tcp_keep_alive: true
- keep_alive_period: "120s"
- tcp_r_buf_size: 262144
- tcp_w_buf_size: 65536
- pkg_rq_size: 1024
- pkg_wq_size: 512
- tcp_read_timeout: "1s"
- tcp_write_timeout: "5s"
- wait_timeout: "1s"
- max_msg_len: 10240
- session_name: "client"
diff --git a/examples/jsonrpc/go-server/app/user.go b/examples/jsonrpc/go-server/app/user.go
deleted file mode 100644
index e86d915417cc54b05faa25ebaa06dae2c5fb6dd1..0000000000000000000000000000000000000000
--- a/examples/jsonrpc/go-server/app/user.go
+++ /dev/null
@@ -1,179 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package main
-
-import (
- "context"
- "fmt"
- "strconv"
- "time"
-)
-
-import (
- perrors "github.com/pkg/errors"
-)
-
-import (
- "github.com/apache/dubbo-go/config"
-)
-
-type Gender int
-
-func init() {
- config.SetProviderService(new(UserProvider))
-}
-
-const (
- MAN = iota
- WOMAN
-)
-
-var genderStrings = [...]string{
- "MAN",
- "WOMAN",
-}
-
-func (g Gender) String() string {
- return genderStrings[g]
-}
-
-type (
- User struct {
- Id string `json:"id"`
- Name string `json:"name"`
- Age int `json:"age"`
- sex Gender
- Birth int `json:"time"`
- Sex string `json:"sex"`
- }
-
- UserProvider struct {
- user map[string]User
- }
-)
-
-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),
- }
-
- userMap = UserProvider{user: make(map[string]User)}
-)
-
-func init() {
- DefaultUser.Sex = DefaultUser.sex.String()
- userMap.user["A000"] = DefaultUser
- userMap.user["A001"] = User{Id: "001", Name: "ZhangSheng", Age: 18, sex: MAN}
- userMap.user["A002"] = User{Id: "002", Name: "Lily", Age: 20, sex: WOMAN}
- userMap.user["A003"] = User{Id: "113", Name: "Moorse", Age: 30, sex: MAN}
- for k, v := range userMap.user {
- v.Birth = int(time.Now().AddDate(-1*v.Age, 0, 0).Unix())
- v.Sex = userMap.user[k].sex.String()
- userMap.user[k] = v
- }
-}
-
-func (u *UserProvider) getUser(userId string) (*User, error) {
- if user, ok := userMap.user[userId]; ok {
- return &user, nil
- }
-
- return nil, fmt.Errorf("invalid user id:%s", userId)
-}
-
-func (u *UserProvider) GetUser(ctx context.Context, req []interface{}, rsp *User) error {
- var (
- err error
- user *User
- )
-
- println("req:%#v", req)
- user, err = u.getUser(req[0].(string))
- if err == nil {
- *rsp = *user
- println("rsp:%#v", rsp)
- }
- return err
-}
-
-func (u *UserProvider) GetUser0(id string, name string) (User, error) {
- var err error
-
- println("id:%s, name:%s", id, name)
- user, err := u.getUser(id)
- if err != nil {
- return User{}, err
- }
- if user.Name != name {
- return User{}, perrors.New("name is not " + user.Name)
- }
- return *user, err
-}
-
-func (u *UserProvider) GetUser2(ctx context.Context, req []interface{}, rsp *User) error {
- var err error
-
- println("req:%#v", req)
- rsp.Id = strconv.FormatFloat(req[0].(float64), 'f', 0, 64)
- rsp.Sex = Gender(MAN).String()
- return err
-}
-
-func (u *UserProvider) GetUser3() error {
- return nil
-}
-
-func (u *UserProvider) GetUsers(req []interface{}) ([]User, error) {
- var err error
-
- println("req:%s", req)
- t := req[0].([]interface{})
- user, err := u.getUser(t[0].(string))
- if err != nil {
- return nil, err
- }
- println("user:%v", user)
- user1, err := u.getUser(t[1].(string))
- if err != nil {
- return nil, err
- }
- println("user1:%v", user1)
-
- return []User{*user, *user1}, err
-}
-
-func (s *UserProvider) MethodMapper() map[string]string {
- return map[string]string{
- "GetUser2": "getUser",
- }
-}
-
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
-}
-
-func println(format string, args ...interface{}) {
- fmt.Printf("\033[32;40m"+format+"\033[0m\n", args...)
-}
diff --git a/examples/jsonrpc/go-server/profiles/dev/server.yml b/examples/jsonrpc/go-server/profiles/dev/server.yml
deleted file mode 100644
index b5384a28a37535bf7493d6ae07166f6da3b4c440..0000000000000000000000000000000000000000
--- a/examples/jsonrpc/go-server/profiles/dev/server.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-# dubbo server yaml configure file
-
-# application config
-application_config:
- 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"
-
-protocols:
- #- name: "dubbo"
- # ip : "127.0.0.1"
- # port : 20000
- "jsonrpc1":
- name: "jsonrpc"
- ip: "127.0.0.1"
- port: 20001
-
diff --git a/examples/jsonrpc/go-server/profiles/release/server.yml b/examples/jsonrpc/go-server/profiles/release/server.yml
deleted file mode 100644
index 213d31d53eb2523e2e132810c7435b3696581a31..0000000000000000000000000000000000000000
--- a/examples/jsonrpc/go-server/profiles/release/server.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-# dubbo server yaml configure file
-
-# application config
-application_config:
- organization : "ikurento.com"
- name : "BDTService"
- module : "dubbogo user-info server"
- version : "0.0.1"
- owner : "ZX"
- environment : "release"
-
-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"
-
-protocols:
- #- name: "dubbo"
- # ip : "127.0.0.1"
- # port : 20000
- "jsonrpc1":
- name: "jsonrpc"
- ip: "127.0.0.1"
- port: 20001
-
diff --git a/examples/jsonrpc/go-server/profiles/test/server.yml b/examples/jsonrpc/go-server/profiles/test/server.yml
deleted file mode 100644
index 9b6dcb0b5c4513cf12ec5a505be64be156593c94..0000000000000000000000000000000000000000
--- a/examples/jsonrpc/go-server/profiles/test/server.yml
+++ /dev/null
@@ -1,50 +0,0 @@
-# dubbo server yaml configure file
-
-# application config
-application_config:
- organization : "ikurento.com"
- name : "BDTService"
- module : "dubbogo user-info server"
- version : "0.0.1"
- owner : "ZX"
- environment : "test"
-
-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"
-
-protocols:
- #- name: "dubbo"
- # ip : "127.0.0.1"
- # port : 20000
- "jsonrpc1":
- name: "jsonrpc"
- ip: "127.0.0.1"
- port: 20001
-
diff --git a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java b/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
deleted file mode 100644
index ddf899aa10979d65f9c88bc0b79ccbb065812417..0000000000000000000000000000000000000000
--- a/examples/jsonrpc/java-client/src/main/java/com/ikurento/user/Consumer.java
+++ /dev/null
@@ -1,97 +0,0 @@
-// *****************************************************
-// DESC : dubbo consumer
-// AUTHOR : writtey by 包增辉(https://github.com/baozh)
-// VERSION : 1.0
-// LICENCE : Apache License 2.0
-// EMAIL : alexstocks@foxmail.com
-// MOD : 2016-10-19 17:03
-// FILE : Consumer.java
-// ******************************************************
-
-package com.ikurento.user;
-
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import com.alibaba.dubbo.rpc.service.EchoService;
-import java.util.List;
-
-public class Consumer {
- //定义一个私有变量 (Spring中要求)
- private UserProvider userProvider;
-
- //Spring注入(Spring中要求)
- public void setUserProvider(UserProvider u) {
- this.userProvider = u;
- }
-
- private void benchmarkSayHello() {
- for (int i = 0; i < Integer.MAX_VALUE; i ++) {
- try {
- // String hello = demoService.sayHello("world" + i);
- // System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " + hello);
- } catch (Exception e) {
- e.printStackTrace();
- }
-
- // Thread.sleep(2000);
- }
- }
-
- private void testGetUser() throws Exception {
- try {
- EchoService echoService = (EchoService)userProvider;
- Object status = echoService.$echo("OK");
- System.out.println("echo: "+status);
- } catch (Exception e) {
- e.printStackTrace();
- }
- try {
- User user1 = userProvider.GetUser("A003");
- System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
- " UserInfo, Id:" + user1.getId() + ", name:" + user1.getName() + ", sex:" + user1.getSex().toString()
- + ", age:" + user1.getAge() + ", time:" + user1.getTime().toString());
- User user2 = userProvider.GetUser0("A003","Moorse");
- 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 user3 = userProvider.getUser(1);
- System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
- " UserInfo, Id:" + user3.getId() + ", name:" + user3.getName() + ", sex:" + user3.getSex().toString()
- + ", age:" + user3.getAge() + ", time:" + user3.getTime().toString());
-
- userProvider.GetUser3();
- System.out.println("GetUser3 succ");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- private void testGetUsers() throws Exception {
- try {
- List<String> userIDList = new ArrayList<String>();
- userIDList.add("A001");
- userIDList.add("A002");
- userIDList.add("A003");
-
- List<User> userList = userProvider.GetUsers(userIDList);
-
- for (int i = 0; i < userList.size(); i++) {
- User user = userList.get(i);
- System.out.println("[" + new SimpleDateFormat("HH:mm:ss").format(new Date()) + "] " +
- " UserInfo, Id:" + user.getId() + ", name:" + user.getName() + ", sex:" + user.getSex().toString()
- + ", age:" + user.getAge() + ", time:" + user.getTime().toString());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- //启动consumer的入口函数(在配置文件中指定)
- public void start() throws Exception {
- testGetUser();
- testGetUsers();
-// Thread.sleep(120000);
-Thread.sleep(2000);
- }
-}
diff --git a/filter/impl/echo_filter_test.go b/filter/impl/echo_filter_test.go
index e2752c85b24b5dbc8175cbd125ed771b412d1818..e2e592974701ad18c5b01e884485c022ee2320b8 100644
--- a/filter/impl/echo_filter_test.go
+++ b/filter/impl/echo_filter_test.go
@@ -34,11 +34,11 @@ import (
func TestEchoFilter_Invoke(t *testing.T) {
filter := GetFilter()
result := filter.Invoke(protocol.NewBaseInvoker(common.URL{}),
- invocation.NewRPCInvocationForProvider("$echo", []interface{}{"OK"}, nil))
+ invocation.NewRPCInvocation("$echo", []interface{}{"OK"}, nil))
assert.Equal(t, "OK", result.Result())
result = filter.Invoke(protocol.NewBaseInvoker(common.URL{}),
- invocation.NewRPCInvocationForProvider("MethodName", []interface{}{"OK"}, nil))
+ invocation.NewRPCInvocation("MethodName", []interface{}{"OK"}, nil))
assert.Nil(t, result.Error())
assert.Nil(t, result.Result())
}
diff --git a/filter/impl/generic_filter.go b/filter/impl/generic_filter.go
new file mode 100644
index 0000000000000000000000000000000000000000..12cb4c7fa59ac4f1f7c1466f385ea9e9b59567b5
--- /dev/null
+++ b/filter/impl/generic_filter.go
@@ -0,0 +1,125 @@
+/*
+ * 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 impl
+
+import (
+ "reflect"
+ "strings"
+)
+import (
+ hessian "github.com/apache/dubbo-go-hessian2"
+)
+import (
+ "github.com/apache/dubbo-go/common/constant"
+ "github.com/apache/dubbo-go/common/extension"
+ "github.com/apache/dubbo-go/filter"
+ "github.com/apache/dubbo-go/protocol"
+ invocation2 "github.com/apache/dubbo-go/protocol/invocation"
+)
+
+const (
+ GENERIC = "generic"
+)
+
+func init() {
+ extension.SetFilter(GENERIC, GetGenericFilter)
+}
+
+// when do a generic invoke, struct need to be map
+
+type GenericFilter struct{}
+
+func (ef *GenericFilter) Invoke(invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+ if invocation.MethodName() == constant.GENERIC && len(invocation.Arguments()) == 3 {
+ oldArguments := invocation.Arguments()
+ var newParams []hessian.Object
+ if oldParams, ok := oldArguments[2].([]interface{}); ok {
+ for i := range oldParams {
+ newParams = append(newParams, hessian.Object(struct2MapAll(oldParams[i])))
+ }
+ } else {
+ return invoker.Invoke(invocation)
+ }
+ newArguments := []interface{}{
+ oldArguments[0],
+ oldArguments[1],
+ newParams,
+ }
+ newInvocation := invocation2.NewRPCInvocation(invocation.MethodName(), newArguments, invocation.Attachments())
+ newInvocation.SetReply(invocation.Reply())
+ return invoker.Invoke(newInvocation)
+ }
+ return invoker.Invoke(invocation)
+}
+
+func (ef *GenericFilter) OnResponse(result protocol.Result, invoker protocol.Invoker, invocation protocol.Invocation) protocol.Result {
+ return result
+}
+
+func GetGenericFilter() filter.Filter {
+ return &GenericFilter{}
+}
+func struct2MapAll(obj interface{}) interface{} {
+ if obj == nil {
+ return obj
+ }
+ t := reflect.TypeOf(obj)
+ v := reflect.ValueOf(obj)
+ if t.Kind() == reflect.Struct {
+ result := make(map[string]interface{}, t.NumField())
+ for i := 0; i < t.NumField(); i++ {
+ if v.Field(i).Kind() == reflect.Struct {
+ if v.Field(i).CanInterface() {
+ setInMap(result, t.Field(i), struct2MapAll(v.Field(i).Interface()))
+ }
+ } else if v.Field(i).Kind() == reflect.Slice {
+ if v.Field(i).CanInterface() {
+ setInMap(result, t.Field(i), struct2MapAll(v.Field(i).Interface()))
+ }
+ } else {
+ if v.Field(i).CanInterface() {
+ setInMap(result, t.Field(i), v.Field(i).Interface())
+ }
+ }
+ }
+ return result
+ } else if t.Kind() == reflect.Slice {
+ value := reflect.ValueOf(obj)
+ var newTemps = make([]interface{}, 0, value.Len())
+ for i := 0; i < value.Len(); i++ {
+ newTemp := struct2MapAll(value.Index(i).Interface())
+ newTemps = append(newTemps, newTemp)
+ }
+ return newTemps
+ } else {
+ return obj
+ }
+}
+func setInMap(m map[string]interface{}, structField reflect.StructField, value interface{}) (result map[string]interface{}) {
+ result = m
+ if tagName := structField.Tag.Get("m"); tagName == "" {
+ result[headerAtoa(structField.Name)] = value
+ } else {
+ result[tagName] = value
+ }
+ return
+}
+func headerAtoa(a string) (b string) {
+ b = strings.ToLower(a[:1]) + a[1:]
+ return
+}
diff --git a/filter/impl/generic_filter_test.go b/filter/impl/generic_filter_test.go
new file mode 100644
index 0000000000000000000000000000000000000000..a71a9db95759a143186fe9a1a4fb0c861c8949e8
--- /dev/null
+++ b/filter/impl/generic_filter_test.go
@@ -0,0 +1,89 @@
+/*
+ * 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 impl
+
+import (
+ "reflect"
+ "testing"
+)
+import (
+ "github.com/stretchr/testify/assert"
+)
+
+func Test_struct2MapAll(t *testing.T) {
+ var testData struct {
+ AaAa string `m:"aaAa"`
+ BaBa string
+ CaCa struct {
+ AaAa string
+ BaBa string `m:"baBa"`
+ XxYy struct {
+ xxXx string `m:"xxXx"`
+ Xx string `m:"xx"`
+ } `m:"xxYy"`
+ } `m:"caCa"`
+ }
+ testData.AaAa = "1"
+ testData.BaBa = "1"
+ testData.CaCa.BaBa = "2"
+ testData.CaCa.AaAa = "2"
+ testData.CaCa.XxYy.xxXx = "3"
+ testData.CaCa.XxYy.Xx = "3"
+ m := struct2MapAll(testData).(map[string]interface{})
+ assert.Equal(t, "1", m["aaAa"].(string))
+ assert.Equal(t, "1", m["baBa"].(string))
+ assert.Equal(t, "2", m["caCa"].(map[string]interface{})["aaAa"].(string))
+ assert.Equal(t, "3", m["caCa"].(map[string]interface{})["xxYy"].(map[string]interface{})["xx"].(string))
+
+ assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"]).Kind())
+ assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"].(map[string]interface{})["xxYy"]).Kind())
+}
+
+type testStruct struct {
+ AaAa string
+ BaBa string `m:"baBa"`
+ XxYy struct {
+ xxXx string `m:"xxXx"`
+ Xx string `m:"xx"`
+ } `m:"xxYy"`
+}
+
+func Test_struct2MapAll_Slice(t *testing.T) {
+ var testData struct {
+ AaAa string `m:"aaAa"`
+ BaBa string
+ CaCa []testStruct `m:"caCa"`
+ }
+ testData.AaAa = "1"
+ testData.BaBa = "1"
+ var tmp testStruct
+ tmp.BaBa = "2"
+ tmp.AaAa = "2"
+ tmp.XxYy.xxXx = "3"
+ tmp.XxYy.Xx = "3"
+ testData.CaCa = append(testData.CaCa, tmp)
+ m := struct2MapAll(testData).(map[string]interface{})
+
+ assert.Equal(t, "1", m["aaAa"].(string))
+ assert.Equal(t, "1", m["baBa"].(string))
+ assert.Equal(t, "2", m["caCa"].([]interface{})[0].(map[string]interface{})["aaAa"].(string))
+ assert.Equal(t, "3", m["caCa"].([]interface{})[0].(map[string]interface{})["xxYy"].(map[string]interface{})["xx"].(string))
+
+ assert.Equal(t, reflect.Slice, reflect.TypeOf(m["caCa"]).Kind())
+ assert.Equal(t, reflect.Map, reflect.TypeOf(m["caCa"].([]interface{})[0].(map[string]interface{})["xxYy"]).Kind())
+}
diff --git a/go.mod b/go.mod
index 94540e4088b529ef4dbbb248950ed312239caff2..c25f0bd2d77506a21a47d16f43ccc0e12f9027f1 100644
--- a/go.mod
+++ b/go.mod
@@ -2,9 +2,9 @@ module github.com/apache/dubbo-go
require (
github.com/Workiva/go-datastructures v1.0.50
- github.com/apache/dubbo-go-hessian2 v1.2.4-0.20190807202824-177b9c667283
+ github.com/apache/dubbo-go-hessian2 v1.2.5-0.20190731020727-1697039810c8
github.com/davecgh/go-spew v1.1.1 // indirect
- github.com/dubbogo/getty v1.2.0
+ github.com/dubbogo/getty v1.2.2
github.com/dubbogo/gost v1.1.1
github.com/golang/mock v1.3.1
github.com/magiconair/properties v1.8.1
diff --git a/go.sum b/go.sum
index 5b81816fc56e636648aaa216e18251fea86e361b..39b2c6ea35d2fac1a98d367b9947ef57d51de407 100644
--- a/go.sum
+++ b/go.sum
@@ -1,14 +1,13 @@
github.com/Workiva/go-datastructures v1.0.50 h1:slDmfW6KCHcC7U+LP3DDBbm4fqTwZGn1beOFPfGaLvo=
github.com/Workiva/go-datastructures v1.0.50/go.mod h1:Z+F2Rca0qCsVYDS8z7bAGm8f3UkzuWYS/oBZz5a7VVA=
-github.com/apache/dubbo-go-hessian2 v1.2.4-0.20190807202824-177b9c667283 h1:4VTXcUeRxyKE1SXsfdHrmCvQftO+PXO9TJCNaekT59E=
-github.com/apache/dubbo-go-hessian2 v1.2.4-0.20190807202824-177b9c667283/go.mod h1:LWnndnrFXZmJLAzoyNAPNHSIJ1KOHVkTSsHgC3YYWlo=
+github.com/apache/dubbo-go-hessian2 v1.2.5-0.20190731020727-1697039810c8 h1:7zJlM+8bpCAUhv03TZnXkT4MLlLWng1s7An8CLuN73E=
+github.com/apache/dubbo-go-hessian2 v1.2.5-0.20190731020727-1697039810c8/go.mod h1:LWnndnrFXZmJLAzoyNAPNHSIJ1KOHVkTSsHgC3YYWlo=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
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/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
-github.com/dubbogo/getty v1.2.0 h1:LmP/R/yCYp5/ubUTm5Xa7QwE3EnFFSjguJH8DJruJ70=
-github.com/dubbogo/getty v1.2.0/go.mod h1:p9Pyk18a+5Aa0GZ546aCzlehEfvEof0jAF0+QQcEPYQ=
-github.com/dubbogo/gost v1.0.1-0.20190706005735-65c3ecbba418/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg=
+github.com/dubbogo/getty v1.2.2 h1:qDC9WXjxcs5NPvWZz2ruVKBKr2r1Jjm6i0Sq//CQwbE=
+github.com/dubbogo/getty v1.2.2/go.mod h1:K4b3MkGLf7T+lMgQNFgpg0dI1Wvv1PTisFs1Psf86kU=
github.com/dubbogo/gost v1.1.1 h1:JCM7vx5edPIjDA5ovJTuzEEXuw2t7xLyrlgi2mi5jHI=
github.com/dubbogo/gost v1.1.1/go.mod h1:R7wZm1DrmrKGr50mBZVcg6C9ekG8aL5hP+sgWcIDwQg=
github.com/golang/mock v1.3.1 h1:qGJ6qTW+x6xX/my+8YUVl4WNpX9B7+/l2tRsHGZ7f2s=
diff --git a/protocol/dubbo/client.go b/protocol/dubbo/client.go
index 06fba5d89836e749b007f40dd3f705ae35531b8c..6ac5e7215429338aa7cabb646b3afd3f1a136b68 100644
--- a/protocol/dubbo/client.go
+++ b/protocol/dubbo/client.go
@@ -26,6 +26,7 @@ import (
import (
"github.com/apache/dubbo-go-hessian2"
"github.com/dubbogo/getty"
+ "github.com/dubbogo/gost/sync"
perrors "github.com/pkg/errors"
"go.uber.org/atomic"
"gopkg.in/yaml.v2"
@@ -45,7 +46,8 @@ var (
errClientClosed = perrors.New("client closed")
errClientReadTimeout = perrors.New("client read timeout")
- clientConf *ClientConfig
+ clientConf *ClientConfig
+ clientGrpool *gxsync.TaskPool
)
func init() {
@@ -78,6 +80,7 @@ func init() {
}
clientConf = conf
+ setClientGrpool()
}
func SetClientConf(c ClientConfig) {
@@ -87,59 +90,29 @@ func SetClientConf(c ClientConfig) {
logger.Warnf("[ClientConfig CheckValidity] error: %v", err)
return
}
+ setClientGrpool()
}
func GetClientConf() ClientConfig {
return *clientConf
}
-type CallOptions struct {
+func setClientGrpool() {
+ if clientConf.GrPoolSize > 1 {
+ clientGrpool = gxsync.NewTaskPool(gxsync.WithTaskPoolTaskPoolSize(clientConf.GrPoolSize), gxsync.WithTaskPoolTaskQueueLength(clientConf.QueueLen),
+ gxsync.WithTaskPoolTaskQueueNumber(clientConf.QueueNumber))
+ }
+}
+
+type Options struct {
+ // connect timeout
+ ConnectTimeout time.Duration
// request timeout
RequestTimeout time.Duration
- // response timeout
- ResponseTimeout time.Duration
- // serial ID
- SerialID SerialID
- Meta map[interface{}]interface{}
}
-type CallOption func(*CallOptions)
-
-//func WithCallRequestTimeout(d time.Duration) CallOption {
-// return func(o *CallOptions) {
-// o.RequestTimeout = d
-// }
-//}
-//
-//func WithCallResponseTimeout(d time.Duration) CallOption {
-// return func(o *CallOptions) {
-// o.ResponseTimeout = d
-// }
-//}
-//
-//func WithCallSerialID(s SerialID) CallOption {
-// return func(o *CallOptions) {
-// o.SerialID = s
-// }
-//}
-//
-//func WithCallMeta_All(callMeta map[interface{}]interface{}) CallOption {
-// return func(o *CallOptions) {
-// o.Meta = callMeta
-// }
-//}
-
-//func WithCallMeta(k, v interface{}) CallOption {
-// return func(o *CallOptions) {
-// if o.Meta == nil {
-// o.Meta = make(map[interface{}]interface{})
-// }
-// o.Meta[k] = v
-// }
-//}
-
type CallResponse struct {
- Opts CallOptions
+ Opts Options
Cause error
Start time.Time // invoke(call) start time == write start time
ReadStart time.Time // read start time, write duration = ReadStart - Start
@@ -149,6 +122,7 @@ type CallResponse struct {
type AsyncCallback func(response CallResponse)
type Client struct {
+ opts Options
conf ClientConfig
pool *gettyRPCClientPool
sequence atomic.Uint64
@@ -156,9 +130,18 @@ type Client struct {
pendingResponses *sync.Map
}
-func NewClient() *Client {
+func NewClient(opt Options) *Client {
+
+ switch {
+ case opt.ConnectTimeout == 0:
+ opt.ConnectTimeout = 3e9
+ fallthrough
+ case opt.RequestTimeout == 0:
+ opt.RequestTimeout = 3e9
+ }
c := &Client{
+ opts: opt,
pendingResponses: new(sync.Map),
conf: *clientConf,
}
@@ -168,64 +151,38 @@ func NewClient() *Client {
}
// call one way
-func (c *Client) CallOneway(addr string, svcUrl common.URL, method string, args interface{}, opts ...CallOption) error {
- var copts CallOptions
-
- for _, o := range opts {
- o(&copts)
- }
+func (c *Client) CallOneway(addr string, svcUrl common.URL, method string, args interface{}) error {
- return perrors.WithStack(c.call(CT_OneWay, addr, svcUrl, method, args, nil, nil, copts))
+ return perrors.WithStack(c.call(CT_OneWay, addr, svcUrl, method, args, nil, nil))
}
// 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{}, opts ...CallOption) error {
- var copts CallOptions
-
- for _, o := range opts {
- o(&copts)
- }
+func (c *Client) Call(addr string, svcUrl common.URL, method string, args, reply interface{}) error {
ct := CT_TwoWay
if reply == nil {
ct = CT_OneWay
}
- return perrors.WithStack(c.call(ct, addr, svcUrl, method, args, reply, nil, copts))
+ return perrors.WithStack(c.call(ct, addr, svcUrl, method, args, reply, nil))
}
func (c *Client) AsyncCall(addr string, svcUrl common.URL, method string, args interface{},
- callback AsyncCallback, reply interface{}, opts ...CallOption) error {
+ callback AsyncCallback, reply interface{}) error {
- var copts CallOptions
- for _, o := range opts {
- o(&copts)
- }
-
- return perrors.WithStack(c.call(CT_TwoWay, addr, svcUrl, method, args, reply, callback, copts))
+ return perrors.WithStack(c.call(CT_TwoWay, addr, svcUrl, method, args, reply, callback))
}
func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string,
- args, reply interface{}, callback AsyncCallback, opts CallOptions) error {
-
- if opts.RequestTimeout == 0 {
- opts.RequestTimeout = c.conf.GettySessionParam.tcpWriteTimeout
- }
- if opts.ResponseTimeout == 0 {
- opts.ResponseTimeout = c.conf.GettySessionParam.tcpReadTimeout
- }
+ args, reply interface{}, callback AsyncCallback) error {
p := &DubboPackage{}
p.Service.Path = strings.TrimPrefix(svcUrl.Path, "/")
p.Service.Interface = svcUrl.GetParam(constant.INTERFACE_KEY, "")
p.Service.Version = svcUrl.GetParam(constant.VERSION_KEY, "")
p.Service.Method = method
- p.Service.Timeout = opts.RequestTimeout
- if opts.SerialID == 0 {
- p.Header.SerialID = byte(S_Dubbo)
- } else {
- p.Header.SerialID = byte(opts.SerialID)
- }
+ p.Service.Timeout = c.opts.RequestTimeout
+ p.Header.SerialID = byte(S_Dubbo)
p.Body = args
var rsp *PendingResponse
@@ -234,7 +191,6 @@ func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string
rsp = NewPendingResponse()
rsp.reply = reply
rsp.callback = callback
- rsp.opts = opts
} else {
p.Header.Type = hessian.PackageRequest
}
@@ -245,13 +201,15 @@ func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string
conn *gettyRPCClient
)
conn, session, err = c.selectSession(addr)
- if err != nil || session == nil {
- logger.Warnf("%s, %v", errSessionNotExist.Error(), err)
+ if err != nil {
+ return perrors.WithStack(err)
+ }
+ if session == nil {
return errSessionNotExist
}
defer c.pool.release(conn, err)
- if err = c.transfer(session, p, rsp, opts); err != nil {
+ if err = c.transfer(session, p, rsp); err != nil {
return perrors.WithStack(err)
}
@@ -260,7 +218,7 @@ func (c *Client) call(ct CallType, addr string, svcUrl common.URL, method string
}
select {
- case <-time.After(opts.ResponseTimeout):
+ case <-getty.GetTimeWheel().After(c.opts.RequestTimeout):
err = errClientReadTimeout
c.removePendingResponse(SequenceType(rsp.seq))
case <-rsp.done:
@@ -286,11 +244,11 @@ func (c *Client) selectSession(addr string) (*gettyRPCClient, getty.Session, err
}
func (c *Client) heartbeat(session getty.Session) error {
- return c.transfer(session, nil, NewPendingResponse(), CallOptions{})
+ return c.transfer(session, nil, NewPendingResponse())
}
func (c *Client) transfer(session getty.Session, pkg *DubboPackage,
- rsp *PendingResponse, opts CallOptions) error {
+ rsp *PendingResponse) error {
var (
sequence uint64
@@ -313,7 +271,7 @@ func (c *Client) transfer(session getty.Session, pkg *DubboPackage,
c.addPendingResponse(rsp)
}
- err = session.WritePkg(pkg, opts.RequestTimeout)
+ err = session.WritePkg(pkg, c.opts.RequestTimeout)
if err != nil {
c.removePendingResponse(SequenceType(rsp.seq))
} else if rsp != nil { // cond2
diff --git a/protocol/dubbo/client_test.go b/protocol/dubbo/client_test.go
index c9e50bd8bf9f7bfeeaad261f6eb451e9f2774070..cd961d382933443e37a08c21b4e4de5edb971860 100644
--- a/protocol/dubbo/client_test.go
+++ b/protocol/dubbo/client_test.go
@@ -26,7 +26,7 @@ import (
)
import (
- "github.com/apache/dubbo-go-hessian2"
+ hessian "github.com/apache/dubbo-go-hessian2"
perrors "github.com/pkg/errors"
"github.com/stretchr/testify/assert"
)
@@ -42,6 +42,10 @@ func TestClient_CallOneway(t *testing.T) {
c := &Client{
pendingResponses: new(sync.Map),
conf: *clientConf,
+ opts: Options{
+ ConnectTimeout: 3e9,
+ RequestTimeout: 6e9,
+ },
}
c.pool = newGettyRPCClientConnPool(c, clientConf.PoolSize, time.Duration(int(time.Second)*clientConf.PoolTTL))
@@ -59,17 +63,21 @@ func TestClient_Call(t *testing.T) {
c := &Client{
pendingResponses: new(sync.Map),
conf: *clientConf,
+ opts: Options{
+ ConnectTimeout: 3e9,
+ RequestTimeout: 10e9,
+ },
}
c.pool = newGettyRPCClientConnPool(c, clientConf.PoolSize, time.Duration(int(time.Second)*clientConf.PoolTTL))
- // user := &User{}
- //err := c.Call("127.0.0.1:20000", url, "GetBigPkg", []interface{}{nil}, user)
- //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, "GetBigPkg", []interface{}{nil}, user)
+ 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)
assert.NoError(t, err)
assert.Equal(t, User{Id: "1", Name: "username"}, *user)
@@ -120,6 +128,10 @@ func TestClient_AsyncCall(t *testing.T) {
c := &Client{
pendingResponses: new(sync.Map),
conf: *clientConf,
+ opts: Options{
+ ConnectTimeout: 3e9,
+ RequestTimeout: 6e9,
+ },
}
c.pool = newGettyRPCClientConnPool(c, clientConf.PoolSize, time.Duration(int(time.Second)*clientConf.PoolTTL))
@@ -152,7 +164,6 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) {
ConnectionNum: 2,
HeartbeatPeriod: "5s",
SessionTimeout: "20s",
- FailFastTimeout: "5s",
PoolTTL: 600,
PoolSize: 64,
GettySessionParam: GettySessionParam{
@@ -162,7 +173,6 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) {
KeepAlivePeriod: "120s",
TcpRBufSize: 262144,
TcpWBufSize: 65536,
- PkgRQSize: 1024,
PkgWQSize: 512,
TcpReadTimeout: "4s",
TcpWriteTimeout: "5s",
@@ -173,9 +183,8 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) {
})
assert.NoError(t, clientConf.CheckValidity())
SetServerConfig(ServerConfig{
- SessionNumber: 700,
- SessionTimeout: "20s",
- FailFastTimeout: "5s",
+ SessionNumber: 700,
+ SessionTimeout: "20s",
GettySessionParam: GettySessionParam{
CompressEncoding: false,
TcpNoDelay: true,
@@ -183,7 +192,6 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) {
KeepAlivePeriod: "120s",
TcpRBufSize: 262144,
TcpWBufSize: 65536,
- PkgRQSize: 1024,
PkgWQSize: 512,
TcpReadTimeout: "1s",
TcpWriteTimeout: "5s",
@@ -195,11 +203,11 @@ func InitTest(t *testing.T) (protocol.Protocol, common.URL) {
// Export
proto := GetProtocol()
- url, err := common.NewURL(context.Background(), "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider?anyhost=true&"+
+ url, err := common.NewURL(context.Background(), "dubbo://127.0.0.1:20000/UserProvider?anyhost=true&"+
"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&"+
"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&"+
"module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&"+
- "side=provider&timeout=3000×tamp=1556509797245")
+ "side=provider&timeout=3000×tamp=1556509797245&bean.name=UserProvider")
assert.NoError(t, err)
proto.Export(protocol.NewBaseInvoker(url))
@@ -274,12 +282,8 @@ func (u *UserProvider) GetUser6(id int64) (*User, error) {
return &User{Id: "1"}, nil
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
}
func (u User) JavaClassName() string {
diff --git a/protocol/dubbo/codec.go b/protocol/dubbo/codec.go
index 2282aec2b208d4cdb0a50c71bca4187565831925..98c29a4e5bc576f7e37f74c0c0abbbab4687717b 100644
--- a/protocol/dubbo/codec.go
+++ b/protocol/dubbo/codec.go
@@ -112,7 +112,6 @@ type PendingResponse struct {
readStart time.Time
callback AsyncCallback
reply interface{}
- opts CallOptions
done chan struct{}
}
@@ -125,7 +124,6 @@ func NewPendingResponse() *PendingResponse {
func (r PendingResponse) GetCallResponse() CallResponse {
return CallResponse{
- Opts: r.opts,
Cause: r.err,
Start: r.start,
ReadStart: r.readStart,
diff --git a/protocol/dubbo/codec_test.go b/protocol/dubbo/codec_test.go
index 59839723bc867e775d9be8ddc995be135c33dc12..52bb1fc130bb2dad866799f01c43d11ffd10a220 100644
--- a/protocol/dubbo/codec_test.go
+++ b/protocol/dubbo/codec_test.go
@@ -20,10 +20,11 @@ package dubbo
import (
"testing"
"time"
+)
- "github.com/stretchr/testify/assert"
-
+import (
hessian "github.com/apache/dubbo-go-hessian2"
+ "github.com/stretchr/testify/assert"
)
func TestDubboPackage_MarshalAndUnmarshal(t *testing.T) {
@@ -49,6 +50,7 @@ func TestDubboPackage_MarshalAndUnmarshal(t *testing.T) {
// request
pkg.Header.Type = hessian.PackageRequest
pkg.Service.Interface = "Service"
+ pkg.Service.Path = "path"
pkg.Service.Version = "2.6"
pkg.Service.Method = "Method"
pkg.Service.Timeout = time.Second
@@ -63,10 +65,10 @@ func TestDubboPackage_MarshalAndUnmarshal(t *testing.T) {
assert.Equal(t, byte(S_Dubbo), pkgres.Header.SerialID)
assert.Equal(t, int64(10086), pkgres.Header.ID)
assert.Equal(t, "2.5.4", pkgres.Body.([]interface{})[0])
- assert.Equal(t, "", pkgres.Body.([]interface{})[1])
+ assert.Equal(t, "path", pkgres.Body.([]interface{})[1])
assert.Equal(t, "2.6", pkgres.Body.([]interface{})[2])
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{}{"interface": "Service", "path": "", "group": "", "timeout": "1000"}, pkgres.Body.([]interface{})[6])
+ assert.Equal(t, map[interface{}]interface{}{"group": "", "interface": "Service", "path": "path", "timeout": "1000"}, pkgres.Body.([]interface{})[6])
}
diff --git a/protocol/dubbo/config.go b/protocol/dubbo/config.go
index 0af1a4a41116fca06d6793fddaf7f69ade2f30c0..1ac3c9ad97ec34319c7728555e56cdfb3d038ba7 100644
--- a/protocol/dubbo/config.go
+++ b/protocol/dubbo/config.go
@@ -34,7 +34,6 @@ type (
keepAlivePeriod time.Duration
TcpRBufSize int `default:"262144" yaml:"tcp_r_buf_size" json:"tcp_r_buf_size,omitempty"`
TcpWBufSize int `default:"65536" yaml:"tcp_w_buf_size" json:"tcp_w_buf_size,omitempty"`
- PkgRQSize int `default:"1024" yaml:"pkg_rq_size" json:"pkg_rq_size,omitempty"`
PkgWQSize int `default:"1024" yaml:"pkg_wq_size" json:"pkg_wq_size,omitempty"`
TcpReadTimeout string `default:"1s" yaml:"tcp_read_timeout" json:"tcp_read_timeout,omitempty"`
tcpReadTimeout time.Duration
@@ -48,20 +47,15 @@ type (
// Config holds supported types by the multiconfig package
ServerConfig struct {
- // local address
- //AppName string `default:"rpc-server" yaml:"app_name" json:"app_name,omitempty"`
- //Host string `default:"127.0.0.1" yaml:"host" json:"host,omitempty"`
- //Ports []string `yaml:"ports" json:"ports,omitempty"` // `default:["10000"]`
- //ProfilePort int `default:"10086" yaml:"profile_port" json:"profile_port,omitempty"`
-
// session
SessionTimeout string `default:"60s" yaml:"session_timeout" json:"session_timeout,omitempty"`
sessionTimeout time.Duration
SessionNumber int `default:"1000" yaml:"session_number" json:"session_number,omitempty"`
- // app
- FailFastTimeout string `default:"5s" yaml:"fail_fast_timeout" json:"fail_fast_timeout,omitempty"`
- failFastTimeout time.Duration
+ // grpool
+ GrPoolSize int `default:"0" yaml:"gr_pool_size" json:"gr_pool_size,omitempty"`
+ QueueLen int `default:"0" yaml:"queue_len" json:"queue_len,omitempty"`
+ QueueNumber int `default:"0" yaml:"queue_number" json:"queue_number,omitempty"`
// session tcp parameters
GettySessionParam GettySessionParam `required:"true" yaml:"getty_session_param" json:"getty_session_param,omitempty"`
@@ -69,11 +63,6 @@ type (
// Config holds supported types by the multiconfig package
ClientConfig struct {
- // local address
- //AppName string `default:"rpc-client" yaml:"app_name" json:"app_name,omitempty"`
- //Host string `default:"127.0.0.1" yaml:"host" json:"host,omitempty"`
- //ProfilePort int `default:"10086" yaml:"profile_port" json:"profile_port,omitempty"`
-
ReconnectInterval int `default:"0" yaml:"reconnect_interval" json:"reconnect_interval,omitempty"`
// session pool
@@ -87,14 +76,15 @@ type (
SessionTimeout string `default:"60s" yaml:"session_timeout" json:"session_timeout,omitempty"`
sessionTimeout time.Duration
- // app
- FailFastTimeout string `default:"5s" yaml:"fail_fast_timeout" json:"fail_fast_timeout,omitempty"`
- failFastTimeout time.Duration
-
// Connection Pool
PoolSize int `default:"2" yaml:"pool_size" json:"pool_size,omitempty"`
PoolTTL int `default:"180" yaml:"pool_ttl" json:"pool_ttl,omitempty"`
+ // grpool
+ GrPoolSize int `default:"0" yaml:"gr_pool_size" json:"gr_pool_size,omitempty"`
+ QueueLen int `default:"0" yaml:"queue_len" json:"queue_len,omitempty"`
+ QueueNumber int `default:"0" yaml:"queue_number" json:"queue_number,omitempty"`
+
// session tcp parameters
GettySessionParam GettySessionParam `required:"true" yaml:"getty_session_param" json:"getty_session_param,omitempty"`
}
@@ -125,6 +115,8 @@ func (c *GettySessionParam) CheckValidity() error {
func (c *ClientConfig) CheckValidity() error {
var err error
+ c.ReconnectInterval = c.ReconnectInterval * 1e6
+
if c.heartbeatPeriod, err = time.ParseDuration(c.HeartbeatPeriod); err != nil {
return perrors.WithMessagef(err, "time.ParseDuration(HeartbeatPeroid{%#v})", c.HeartbeatPeriod)
}
@@ -133,10 +125,6 @@ func (c *ClientConfig) CheckValidity() error {
return perrors.WithMessagef(err, "time.ParseDuration(SessionTimeout{%#v})", c.SessionTimeout)
}
- if c.failFastTimeout, err = time.ParseDuration(c.FailFastTimeout); err != nil {
- return perrors.WithMessagef(err, "time.ParseDuration(FailFastTimeout{%#v})", c.FailFastTimeout)
- }
-
return perrors.WithStack(c.GettySessionParam.CheckValidity())
}
@@ -147,9 +135,5 @@ func (c *ServerConfig) CheckValidity() error {
return perrors.WithMessagef(err, "time.ParseDuration(SessionTimeout{%#v})", c.SessionTimeout)
}
- if c.failFastTimeout, err = time.ParseDuration(c.FailFastTimeout); err != nil {
- return perrors.WithMessagef(err, "time.ParseDuration(FailFastTimeout{%#v})", c.FailFastTimeout)
- }
-
return perrors.WithStack(c.GettySessionParam.CheckValidity())
}
diff --git a/protocol/dubbo/dubbo_exporter.go b/protocol/dubbo/dubbo_exporter.go
index bdec8a349f358f265fe064ed2083433f27d40a3b..cb06b6b69c9d0873342af5ea49fae054f029608c 100644
--- a/protocol/dubbo/dubbo_exporter.go
+++ b/protocol/dubbo/dubbo_exporter.go
@@ -39,9 +39,9 @@ func NewDubboExporter(key string, invoker protocol.Invoker, exporterMap *sync.Ma
}
func (de *DubboExporter) Unexport() {
- service := de.GetInvoker().GetUrl().GetParam(constant.INTERFACE_KEY, "")
+ serviceId := de.GetInvoker().GetUrl().GetParam(constant.BEAN_NAME_KEY, "")
de.BaseExporter.Unexport()
- err := common.ServiceMap.UnRegister(DUBBO, service)
+ err := common.ServiceMap.UnRegister(DUBBO, serviceId)
if err != nil {
logger.Errorf("[DubboExporter.Unexport] error: %v", err)
}
diff --git a/protocol/dubbo/dubbo_invoker_test.go b/protocol/dubbo/dubbo_invoker_test.go
index 182d6d8e0b11cfcb231789cebf9c4cefdecfa258..09a4c128b600e605de616a65027da9b2ce6fcb20 100644
--- a/protocol/dubbo/dubbo_invoker_test.go
+++ b/protocol/dubbo/dubbo_invoker_test.go
@@ -38,13 +38,18 @@ func TestDubboInvoker_Invoke(t *testing.T) {
c := &Client{
pendingResponses: new(sync.Map),
conf: *clientConf,
+ opts: Options{
+ ConnectTimeout: 3e9,
+ RequestTimeout: 6e9,
+ },
}
c.pool = newGettyRPCClientConnPool(c, clientConf.PoolSize, time.Duration(int(time.Second)*clientConf.PoolTTL))
invoker := NewDubboInvoker(url, c)
user := &User{}
- inv := invocation.NewRPCInvocationForConsumer("GetUser", nil, []interface{}{"1", "username"}, user, nil, url, nil)
+ inv := invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUser"), invocation.WithArguments([]interface{}{"1", "username"}),
+ invocation.WithReply(user))
// Call
res := invoker.Invoke(inv)
diff --git a/protocol/dubbo/dubbo_protocol.go b/protocol/dubbo/dubbo_protocol.go
index a2df3d91b2fa6b1ef8907ecba8832368d0613b8e..4438a0b3d0e32127536b818806d190a2d2a5a2ba 100644
--- a/protocol/dubbo/dubbo_protocol.go
+++ b/protocol/dubbo/dubbo_protocol.go
@@ -21,6 +21,7 @@ import (
"github.com/apache/dubbo-go/common"
"github.com/apache/dubbo-go/common/extension"
"github.com/apache/dubbo-go/common/logger"
+ "github.com/apache/dubbo-go/config"
"github.com/apache/dubbo-go/protocol"
"sync"
)
@@ -63,7 +64,10 @@ func (dp *DubboProtocol) Export(invoker protocol.Invoker) protocol.Exporter {
}
func (dp *DubboProtocol) Refer(url common.URL) protocol.Invoker {
- invoker := NewDubboInvoker(url, NewClient())
+ invoker := NewDubboInvoker(url, NewClient(Options{
+ ConnectTimeout: config.GetConsumerConfig().ConnectTimeout,
+ RequestTimeout: config.GetConsumerConfig().RequestTimeout,
+ }))
dp.SetInvokers(invoker)
logger.Infof("Refer service: %s", url.String())
return invoker
diff --git a/protocol/dubbo/listener.go b/protocol/dubbo/listener.go
index c6d3e7268fc738f33de1948c8c99319e672af241..c0d5fe29169606c0655ac60e571ba9f59912ffa0 100644
--- a/protocol/dubbo/listener.go
+++ b/protocol/dubbo/listener.go
@@ -208,12 +208,8 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) {
twoway = false
}
- group := p.Body.(map[string]interface{})["attachments"].(map[interface{}]interface{})[constant.GROUP_KEY]
- if group == nil {
- group = ""
- }
u := common.NewURLWithOptions(common.WithPath(p.Service.Path), common.WithParams(url.Values{}),
- common.WithParamsValue(constant.GROUP_KEY, group.(string)),
+ common.WithParamsValue(constant.GROUP_KEY, p.Service.Group),
common.WithParamsValue(constant.INTERFACE_KEY, p.Service.Interface),
common.WithParamsValue(constant.VERSION_KEY, p.Service.Version))
exporter, _ := dubboProtocol.ExporterMap().Load(u.ServiceKey())
@@ -227,9 +223,9 @@ func (h *RpcServerHandler) OnMessage(session getty.Session, pkg interface{}) {
}
invoker := exporter.(protocol.Exporter).GetInvoker()
if invoker != nil {
- result := invoker.Invoke(invocation.NewRPCInvocationForProvider(p.Service.Method, p.Body.(map[string]interface{})["args"].([]interface{}), map[string]string{
+ 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: group.(string),
+ constant.GROUP_KEY: p.Service.Group,
constant.INTERFACE_KEY: p.Service.Interface,
constant.VERSION_KEY: p.Service.Version,
}))
diff --git a/protocol/dubbo/pool.go b/protocol/dubbo/pool.go
index de205fa75f5fe8e8ef75c7c0f12cc2f78b3c397b..546a5b335aee3e71a6e00e49888710edb20c694a 100644
--- a/protocol/dubbo/pool.go
+++ b/protocol/dubbo/pool.go
@@ -62,16 +62,18 @@ func newGettyRPCClientConn(pool *gettyRPCClientPool, protocol, addr string) (*ge
getty.WithReconnectInterval(pool.rpcClient.conf.ReconnectInterval),
),
}
- c.gettyClient.RunEventLoop(c.newSession)
+ go c.gettyClient.RunEventLoop(c.newSession)
idx := 1
+ times := int(pool.rpcClient.opts.ConnectTimeout / 1e6)
for {
idx++
if c.isAvailable() {
break
}
- if idx > 5000 {
- return nil, perrors.New(fmt.Sprintf("failed to create client connection to %s in 5 seconds", addr))
+ if idx > times {
+ c.gettyClient.Close()
+ return nil, perrors.New(fmt.Sprintf("failed to create client connection to %s in %f seconds", addr, float32(times)/1000))
}
time.Sleep(1e6)
}
@@ -109,7 +111,6 @@ func (c *gettyRPCClient) newSession(session getty.Session) error {
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewRpcClientPackageHandler(c.pool.rpcClient))
session.SetEventListener(NewRpcClientHandler(c))
- session.SetRQLen(conf.GettySessionParam.PkgRQSize)
session.SetWQLen(conf.GettySessionParam.PkgWQSize)
session.SetReadTimeout(conf.GettySessionParam.tcpReadTimeout)
session.SetWriteTimeout(conf.GettySessionParam.tcpWriteTimeout)
@@ -117,6 +118,8 @@ func (c *gettyRPCClient) newSession(session getty.Session) error {
session.SetWaitTime(conf.GettySessionParam.waitTimeout)
logger.Debugf("client new session:%s\n", session.Stat())
+ session.SetTaskPool(clientGrpool)
+
return nil
}
@@ -166,7 +169,9 @@ func (c *gettyRPCClient) removeSession(session getty.Session) {
}
logger.Infof("after remove session{%s}, left session number:%d", session.Stat(), len(c.sessions))
if len(c.sessions) == 0 {
+ c.pool.Lock()
c.close() // -> pool.remove(c)
+ c.pool.Unlock()
}
}
@@ -193,8 +198,8 @@ func (c *gettyRPCClient) getClientRpcSession(session getty.Session) (rpcSession,
err error
rpcSession rpcSession
)
- c.lock.Lock()
- defer c.lock.Unlock()
+ c.lock.RLock()
+ defer c.lock.RUnlock()
if c.sessions == nil {
return rpcSession, errClientClosed
}
@@ -241,11 +246,11 @@ func (c *gettyRPCClient) close() error {
type gettyRPCClientPool struct {
rpcClient *Client
- size int // []*gettyRPCClient数组的size
- ttl int64 // 每个gettyRPCClient的有效期时间. pool对象会在getConn时执行ttl检查
+ size int // size of []*gettyRPCClient
+ ttl int64 // ttl of every gettyRPCClient, it is checked when getConn
sync.Mutex
- conns []*gettyRPCClient // 从[]*gettyRPCClient 可见key是连接地址,而value是对应这个地址的连接数组
+ conns []*gettyRPCClient
}
func newGettyRPCClientConnPool(rpcClient *Client, size int, ttl time.Duration) *gettyRPCClientPool {
@@ -270,7 +275,6 @@ func (p *gettyRPCClientPool) close() {
func (p *gettyRPCClientPool) getGettyRpcClient(protocol, addr string) (*gettyRPCClient, error) {
p.Lock()
- defer p.Unlock()
if p.conns == nil {
return nil, errClientPoolClosed
}
@@ -287,10 +291,11 @@ func (p *gettyRPCClientPool) getGettyRpcClient(protocol, addr string) (*gettyRPC
}
conn.created = now //update created time
+ p.Unlock()
return conn, nil
}
-
// create new conn
+ p.Unlock()
return newGettyRPCClientConn(p, protocol, addr)
}
diff --git a/protocol/dubbo/readwriter.go b/protocol/dubbo/readwriter.go
index aaf27e4e58311e1532ef2e8cd3dfed3e55182b36..8c6c8a5a53af4df9a89eae5db5752eb07f3aa446 100644
--- a/protocol/dubbo/readwriter.go
+++ b/protocol/dubbo/readwriter.go
@@ -27,6 +27,7 @@ import (
"github.com/dubbogo/getty"
perrors "github.com/pkg/errors"
)
+
import (
"github.com/apache/dubbo-go/common"
"github.com/apache/dubbo-go/common/constant"
@@ -140,11 +141,17 @@ func (p *RpcServerPackageHandler) Read(ss getty.Session, data []byte) (interface
attachments = req[6].(map[interface{}]interface{})
}
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)
+ }
+ if attachments[constant.GROUP_KEY] != nil {
+ pkg.Service.Group = attachments[constant.GROUP_KEY].(string)
+ }
pkg.Body = map[string]interface{}{
"dubboVersion": dubboVersion,
"argsTypes": argsTypes,
"args": args,
- "service": common.ServiceMap.GetService(DUBBO, pkg.Service.Interface),
+ "service": common.ServiceMap.GetService(DUBBO, pkg.Service.Path), // path as a key
"attachments": attachments,
}
}
diff --git a/protocol/dubbo/server.go b/protocol/dubbo/server.go
index 25c8f1bf4d7deaf87c3216cbfcd70d499ed2fb24..8daeee05e2ccc115aad590c2ed80a269360482d5 100644
--- a/protocol/dubbo/server.go
+++ b/protocol/dubbo/server.go
@@ -24,6 +24,7 @@ import (
import (
"github.com/dubbogo/getty"
+ "github.com/dubbogo/gost/sync"
"gopkg.in/yaml.v2"
)
@@ -33,7 +34,10 @@ import (
"github.com/apache/dubbo-go/config"
)
-var srvConf *ServerConfig
+var (
+ srvConf *ServerConfig
+ srvGrpool *gxsync.TaskPool
+)
func init() {
@@ -64,6 +68,7 @@ func init() {
}
srvConf = conf
+ SetServerGrpool()
}
func SetServerConfig(s ServerConfig) {
@@ -73,12 +78,20 @@ func SetServerConfig(s ServerConfig) {
logger.Warnf("[ServerConfig CheckValidity] error: %v", err)
return
}
+ SetServerGrpool()
}
func GetServerConfig() ServerConfig {
return *srvConf
}
+func SetServerGrpool() {
+ if srvConf.GrPoolSize > 1 {
+ srvGrpool = gxsync.NewTaskPool(gxsync.WithTaskPoolTaskPoolSize(srvConf.GrPoolSize), gxsync.WithTaskPoolTaskQueueLength(srvConf.QueueLen),
+ gxsync.WithTaskPoolTaskQueueNumber(srvConf.QueueNumber))
+ }
+}
+
type Server struct {
conf ServerConfig
tcpServer getty.Server
@@ -123,7 +136,6 @@ func (s *Server) newSession(session getty.Session) error {
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(rpcServerPkgHandler)
session.SetEventListener(s.rpcHandler)
- session.SetRQLen(conf.GettySessionParam.PkgRQSize)
session.SetWQLen(conf.GettySessionParam.PkgWQSize)
session.SetReadTimeout(conf.GettySessionParam.tcpReadTimeout)
session.SetWriteTimeout(conf.GettySessionParam.tcpWriteTimeout)
@@ -131,6 +143,8 @@ func (s *Server) newSession(session getty.Session) error {
session.SetWaitTime(conf.GettySessionParam.waitTimeout)
logger.Debugf("app accepts new session:%s\n", session.Stat())
+ session.SetTaskPool(srvGrpool)
+
return nil
}
diff --git a/protocol/invocation/rpcinvocation.go b/protocol/invocation/rpcinvocation.go
index d515cc4c8ad4bcdcc88eccd4b1e8ddb545a17315..2124a22f1611b24d7f4370de64b117c58c4f7e7b 100644
--- a/protocol/invocation/rpcinvocation.go
+++ b/protocol/invocation/rpcinvocation.go
@@ -22,8 +22,6 @@ import (
)
import (
- "github.com/apache/dubbo-go/common"
- "github.com/apache/dubbo-go/common/constant"
"github.com/apache/dubbo-go/protocol"
)
@@ -41,27 +39,7 @@ type RPCInvocation struct {
invoker protocol.Invoker
}
-func NewRPCInvocationForConsumer(methodName string, parameterTypes []reflect.Type, arguments []interface{},
- reply interface{}, callBack interface{}, url common.URL, invoker protocol.Invoker) *RPCInvocation {
-
- attachments := map[string]string{}
- attachments[constant.PATH_KEY] = url.Path
- attachments[constant.GROUP_KEY] = url.GetParam(constant.GROUP_KEY, "")
- attachments[constant.INTERFACE_KEY] = url.GetParam(constant.INTERFACE_KEY, "")
- attachments[constant.VERSION_KEY] = url.GetParam(constant.VERSION_KEY, "")
-
- return &RPCInvocation{
- methodName: methodName,
- parameterTypes: parameterTypes,
- arguments: arguments,
- reply: reply,
- callBack: callBack,
- attachments: attachments,
- invoker: invoker,
- }
-}
-
-func NewRPCInvocationForProvider(methodName string, arguments []interface{}, attachments map[string]string) *RPCInvocation {
+func NewRPCInvocation(methodName string, arguments []interface{}, attachments map[string]string) *RPCInvocation {
return &RPCInvocation{
methodName: methodName,
arguments: arguments,
@@ -69,26 +47,6 @@ func NewRPCInvocationForProvider(methodName string, arguments []interface{}, att
}
}
-type option func(invo *RPCInvocation)
-
-func WithMethodName(methodName string) option {
- return func(invo *RPCInvocation) {
- invo.methodName = methodName
- }
-}
-
-func WithParameterTypes(parameterTypes []reflect.Type) option {
- return func(invo *RPCInvocation) {
- invo.parameterTypes = parameterTypes
- }
-}
-
-func WithArguments(arguments []interface{}) option {
- return func(invo *RPCInvocation) {
- invo.arguments = arguments
- }
-}
-
func NewRPCInvocationWithOptions(opts ...option) *RPCInvocation {
invo := &RPCInvocation{}
for _, opt := range opts {
@@ -147,14 +105,58 @@ func (r *RPCInvocation) SetInvoker() protocol.Invoker {
return r.invoker
}
+func (r *RPCInvocation) CallBack() interface{} {
+ return r.callBack
+}
+
func (r *RPCInvocation) SetCallBack(c interface{}) {
r.callBack = c
}
-func (r *RPCInvocation) CallBack() interface{} {
- return r.callBack
+///////////////////////////
+// option
+///////////////////////////
+
+type option func(invo *RPCInvocation)
+
+func WithMethodName(methodName string) option {
+ return func(invo *RPCInvocation) {
+ invo.methodName = methodName
+ }
+}
+
+func WithParameterTypes(parameterTypes []reflect.Type) option {
+ return func(invo *RPCInvocation) {
+ invo.parameterTypes = parameterTypes
+ }
+}
+
+func WithArguments(arguments []interface{}) option {
+ return func(invo *RPCInvocation) {
+ invo.arguments = arguments
+ }
+}
+
+func WithReply(reply interface{}) option {
+ return func(invo *RPCInvocation) {
+ invo.reply = reply
+ }
+}
+
+func WithCallBack(callBack interface{}) option {
+ return func(invo *RPCInvocation) {
+ invo.callBack = callBack
+ }
+}
+
+func WithAttachments(attachments map[string]string) option {
+ return func(invo *RPCInvocation) {
+ invo.attachments = attachments
+ }
}
-func (r *RPCInvocation) SetMethod(method string) {
- r.methodName = method
+func WithInvoker(invoker protocol.Invoker) option {
+ return func(invo *RPCInvocation) {
+ invo.invoker = invoker
+ }
}
diff --git a/protocol/jsonrpc/http_test.go b/protocol/jsonrpc/http_test.go
index f05f47b8c1b571846335852503bb2c3a5a8c5a8d..1f446803fd6c5f174f51e3fe9496c49ae4991691 100644
--- a/protocol/jsonrpc/http_test.go
+++ b/protocol/jsonrpc/http_test.go
@@ -54,11 +54,11 @@ func TestHTTPClient_Call(t *testing.T) {
// Export
proto := GetProtocol()
- url, err := common.NewURL(context.Background(), "jsonrpc://127.0.0.1:20001/com.ikurento.user.UserProvider?anyhost=true&"+
+ url, err := common.NewURL(context.Background(), "jsonrpc://127.0.0.1:20001/UserProvider?anyhost=true&"+
"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&"+
"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&"+
"module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&"+
- "side=provider&timeout=3000×tamp=1556509797245")
+ "side=provider&timeout=3000×tamp=1556509797245&bean.name=UserProvider")
assert.NoError(t, err)
proto.Export(protocol.NewBaseInvoker(url))
time.Sleep(time.Second * 2)
@@ -185,10 +185,6 @@ func (u *UserProvider) GetUser4(id float64) (*User, error) {
return &User{Id: "1"}, nil
}
-func (u *UserProvider) Service() string {
- return "com.ikurento.user.UserProvider"
-}
-
-func (u *UserProvider) Version() string {
- return ""
+func (u *UserProvider) Reference() string {
+ return "UserProvider"
}
diff --git a/protocol/jsonrpc/jsonrpc_exporter.go b/protocol/jsonrpc/jsonrpc_exporter.go
index 21a2465cddde7709bf5a23f6247ecb74016bf129..6720330494a3b833d4a67d8b2408377ce62b1ddf 100644
--- a/protocol/jsonrpc/jsonrpc_exporter.go
+++ b/protocol/jsonrpc/jsonrpc_exporter.go
@@ -39,9 +39,9 @@ func NewJsonrpcExporter(key string, invoker protocol.Invoker, exporterMap *sync.
}
func (je *JsonrpcExporter) Unexport() {
- service := je.GetInvoker().GetUrl().GetParam(constant.INTERFACE_KEY, "")
+ serviceId := je.GetInvoker().GetUrl().GetParam(constant.BEAN_NAME_KEY, "")
je.BaseExporter.Unexport()
- err := common.ServiceMap.UnRegister(JSONRPC, service)
+ err := common.ServiceMap.UnRegister(JSONRPC, serviceId)
if err != nil {
logger.Errorf("[JsonrpcExporter.Unexport] error: %v", err)
}
diff --git a/protocol/jsonrpc/jsonrpc_invoker_test.go b/protocol/jsonrpc/jsonrpc_invoker_test.go
index 0dd427eb69127317d646c599506dc476f2859a3f..bc88759bf522a35a30e8585429f1db614c3a15ce 100644
--- a/protocol/jsonrpc/jsonrpc_invoker_test.go
+++ b/protocol/jsonrpc/jsonrpc_invoker_test.go
@@ -41,11 +41,11 @@ func TestJsonrpcInvoker_Invoke(t *testing.T) {
// Export
proto := GetProtocol()
- url, err := common.NewURL(context.Background(), "jsonrpc://127.0.0.1:20001/com.ikurento.user.UserProvider?anyhost=true&"+
+ url, err := common.NewURL(context.Background(), "jsonrpc://127.0.0.1:20001/UserProvider?anyhost=true&"+
"application=BDTService&category=providers&default.timeout=10000&dubbo=dubbo-provider-golang-1.0.0&"+
"environment=dev&interface=com.ikurento.user.UserProvider&ip=192.168.56.1&methods=GetUser%2C&"+
"module=dubbogo+user-info+server&org=ikurento.com&owner=ZX&pid=1447&revision=0.0.1&"+
- "side=provider&timeout=3000×tamp=1556509797245")
+ "side=provider&timeout=3000×tamp=1556509797245&bean.name=UserProvider")
assert.NoError(t, err)
proto.Export(protocol.NewBaseInvoker(url))
time.Sleep(time.Second * 2)
@@ -57,7 +57,9 @@ func TestJsonrpcInvoker_Invoke(t *testing.T) {
jsonInvoker := NewJsonrpcInvoker(url, client)
user := &User{}
- res := jsonInvoker.Invoke(invocation.NewRPCInvocationForConsumer("GetUser", nil, []interface{}{"1", "username"}, user, nil, url, nil))
+ res := jsonInvoker.Invoke(invocation.NewRPCInvocationWithOptions(invocation.WithMethodName("GetUser"), invocation.WithArguments([]interface{}{"1", "username"}),
+ invocation.WithReply(user)))
+
assert.NoError(t, res.Error())
assert.Equal(t, User{Id: "1", Name: "username"}, *res.Result().(*User))
diff --git a/protocol/jsonrpc/server.go b/protocol/jsonrpc/server.go
index 22dc7cfc49c978a7c042652158210ef6fda48892..6b3a39c68b4fdb417e8d2efaec4a43806acb2219 100644
--- a/protocol/jsonrpc/server.go
+++ b/protocol/jsonrpc/server.go
@@ -325,7 +325,7 @@ func serveRequest(ctx context.Context,
exporter, _ := jsonrpcProtocol.ExporterMap().Load(path)
invoker := exporter.(*JsonrpcExporter).GetInvoker()
if invoker != nil {
- result := invoker.Invoke(invocation.NewRPCInvocationForProvider(methodName, args, map[string]string{
+ result := invoker.Invoke(invocation.NewRPCInvocation(methodName, args, map[string]string{
constant.PATH_KEY: path,
constant.VERSION_KEY: codec.req.Version,
}))
@@ -348,15 +348,14 @@ func serveRequest(ctx context.Context,
}
}
}
- serviceName := invoker.GetUrl().Service()
// get method
- svc := common.ServiceMap.GetService(JSONRPC, serviceName)
+ svc := common.ServiceMap.GetService(JSONRPC, path)
if svc == nil {
- return perrors.New("cannot find svc " + serviceName)
+ return perrors.New("cannot find svc " + path)
}
method := svc.Method()[methodName]
if method == nil {
- return perrors.New("cannot find method " + methodName + " of svc " + serviceName)
+ return perrors.New("cannot find method " + methodName + " of svc " + path)
}
in := []reflect.Value{svc.Rcvr()}
diff --git a/registry/zookeeper/registry_test.go b/registry/zookeeper/registry_test.go
index 22658e1adcd57d6b88bdbf3949cae08f90f1cfb5..2b5e2f8f7caf749be28bf3ff6e5d14980d70f2f4 100644
--- a/registry/zookeeper/registry_test.go
+++ b/registry/zookeeper/registry_test.go
@@ -36,13 +36,13 @@ import (
func Test_Register(t *testing.T) {
regurl, _ := common.NewURL(context.TODO(), "registry://127.0.0.1:1111", common.WithParamsValue(constant.ROLE_KEY, strconv.Itoa(common.PROVIDER)))
- url, _ := common.NewURL(context.TODO(), "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithMethods([]string{"GetUser", "AddUser"}))
+ url, _ := common.NewURL(context.TODO(), "dubbo://127.0.0.1:20000/com.ikurento.user.UserProvider", common.WithParamsValue(constant.CLUSTER_KEY, "mock"), common.WithParamsValue("serviceid", "soa.mock"), common.WithMethods([]string{"GetUser", "AddUser"}))
ts, reg, _ := newMockZkRegistry(®url)
defer ts.Stop()
err := reg.Register(url)
children, _ := reg.client.GetChildren("/dubbo/com.ikurento.user.UserProvider/providers")
- assert.Regexp(t, ".*dubbo%3A%2F%2F127.0.0.1%3A20000%2Fcom.ikurento.user.UserProvider%3Fanyhost%3Dtrue%26category%3Dproviders%26cluster%3Dmock%26dubbo%3Ddubbo-provider-golang-2.6.0%26.*provider", children)
+ assert.Regexp(t, ".*dubbo%3A%2F%2F127.0.0.1%3A20000%2Fcom.ikurento.user.UserProvider%3Fanyhost%3Dtrue%26category%3Dproviders%26cluster%3Dmock%26dubbo%3Ddubbo-provider-golang-2.6.0%26.*.serviceid%3Dsoa.mock%26.*provider", children)
assert.NoError(t, err)
}
diff --git a/remoting/zookeeper/client.go b/remoting/zookeeper/client.go
index b94483835c8bcf913de9e40ec4a6ffba3334c103..008848ea61ba2deb1a70aba5c29da097c3c48da9 100644
--- a/remoting/zookeeper/client.go
+++ b/remoting/zookeeper/client.go
@@ -125,7 +125,8 @@ func ValidateZookeeperClient(container zkClientFacade, opts ...Option) error {
url.GetParam(constant.REGISTRY_TIMEOUT_KEY, constant.DEFAULT_REG_TIMEOUT), err.Error())
return perrors.WithMessagef(err, "newZookeeperClient(address:%+v)", url.Location)
}
- newClient, err := newZookeeperClient(opions.zkName, []string{url.Location}, timeout)
+ zkAddresses := strings.Split(url.Location, ",")
+ newClient, err := newZookeeperClient(opions.zkName, zkAddresses, timeout)
if err != nil {
logger.Warnf("newZookeeperClient(name{%s}, zk addresss{%v}, timeout{%d}) = error{%v}",
opions.zkName, url.Location, timeout.String(), err)
@@ -308,7 +309,7 @@ func (z *ZookeeperClient) UnregisterEvent(zkPath string, event *chan struct{}) {
if e == event {
arr := infoList
infoList = append(arr[:i], arr[i+1:]...)
- logger.Debugf("zkClient{%s} unregister event{path:%s, event:%p}", z.name, zkPath, event)
+ logger.Infof("zkClient{%s} unregister event{path:%s, event:%p}", z.name, zkPath, event)
}
}
logger.Debugf("after zkClient{%s} unregister event{path:%s, event:%p}, array length %d",
diff --git a/remoting/zookeeper/listener.go b/remoting/zookeeper/listener.go
index 44fe7eabadde883db852b880eb997444f3f48050..3df87ed4f603956a653cec692031dee94639de16 100644
--- a/remoting/zookeeper/listener.go
+++ b/remoting/zookeeper/listener.go
@@ -130,14 +130,14 @@ func (l *ZkEventListener) handleZkNodeEvent(zkPath string, children []string, li
continue
}
// listen l service node
- go func(node, childNode string) {
+ go func(node string) {
logger.Infof("delete zkNode{%s}", node)
if l.ListenServiceNodeEvent(node, listener) {
- logger.Infof("delete content{%s}", childNode)
+ logger.Infof("delete content{%s}", node)
listener.DataChange(remoting.Event{Path: zkPath, Action: remoting.EventTypeDel})
}
logger.Warnf("listenSelf(zk path{%s}) goroutine exit now", zkPath)
- }(newNode, n)
+ }(newNode)
}
// old node was deleted
diff --git a/remoting/zookeeper/listener_test.go b/remoting/zookeeper/listener_test.go
index 845c9a122700724d5b1c34a0a3d798db787837fc..8b133336e7242da6505132836748880259bf5e1d 100644
--- a/remoting/zookeeper/listener_test.go
+++ b/remoting/zookeeper/listener_test.go
@@ -18,6 +18,7 @@
package zookeeper
import (
+ "sync"
"testing"
"time"
)
@@ -86,32 +87,36 @@ func TestListener(t *testing.T) {
dubbo.service.com.ikurento.user.UserProvider.warmup=100
dubbo.service.com.ikurento.user.UserProvider.cluster=failover
`
-
+ var wait sync.WaitGroup
ts, client, event := initZkData(t)
defer ts.Stop()
client.Wait.Add(1)
+ wait.Add(1)
go client.HandleZkEvent(event)
listener := NewZkEventListener(client)
- dataListener := &mockDataListener{client: client, changedData: changedData}
+ dataListener := &mockDataListener{client: client, changedData: changedData, wait: &wait}
listener.ListenServiceEvent("/dubbo", dataListener)
_, err := client.Conn.Set("/dubbo/dubbo.properties", []byte(changedData), 1)
assert.NoError(t, err)
- client.Wait.Wait()
+ wait.Wait()
assert.Equal(t, changedData, dataListener.eventList[1].Content)
+ client.Close()
+
}
type mockDataListener struct {
eventList []remoting.Event
client *ZookeeperClient
changedData string
+ wait *sync.WaitGroup
}
func (m *mockDataListener) DataChange(eventType remoting.Event) bool {
logger.Info(eventType)
m.eventList = append(m.eventList, eventType)
if eventType.Content == m.changedData {
- m.client.Close()
+ m.wait.Done()
}
return true
}