This is an automated email from the ASF dual-hosted git repository.
alexstocks pushed a commit to branch 3.0
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git
The following commit(s) were added to refs/heads/3.0 by this push:
new 267036aeb [Ftr] Enhance ServiceDefinition in MetadataService (#1963)
267036aeb is described below
commit 267036aeb18ea880f2dd17d42364e796035eb5e1
Author: Leo Shen <[email protected]>
AuthorDate: Wed Aug 10 10:51:14 2022 +0800
[Ftr] Enhance ServiceDefinition in MetadataService (#1963)
* Add FullServiceDefinition struct
* mark the place waiting to be changed in PublishServiceDefinition
* add test about FullServiceDefinition
* modify format
* modify comment
* format the code
* split one long line
---
metadata/definition/definition.go | 53 ++++++++++++++++++++++++++++++++-
metadata/definition/definition_test.go | 2 ++
metadata/service/local/service.go | 2 +-
metadata/service/local/service_test.go | 9 +++++-
metadata/service/remote/service.go | 2 +-
metadata/service/remote/service_test.go | 10 ++++++-
6 files changed, 73 insertions(+), 5 deletions(-)
diff --git a/metadata/definition/definition.go
b/metadata/definition/definition.go
index f1241d12b..2cb11e398 100644
--- a/metadata/definition/definition.go
+++ b/metadata/definition/definition.go
@@ -21,6 +21,7 @@ import (
"bytes"
"encoding/json"
"fmt"
+ "sort"
"strings"
)
@@ -70,8 +71,8 @@ func (def *ServiceDefinition) String() string {
// FullServiceDefinition is the describer of service definition with parameters
type FullServiceDefinition struct {
+ Parameters map[string]string
ServiceDefinition
- Params map[string]string
}
// MethodDefinition is the describer of method definition
@@ -121,6 +122,56 @@ func BuildServiceDefinition(service common.Service, url
*common.URL) *ServiceDef
return sd
}
+// BuildFullDefinition can build service definition with full url parameters
+func BuildFullDefinition(service common.Service, url *common.URL)
*FullServiceDefinition {
+ fsd := &FullServiceDefinition{}
+ sd := BuildServiceDefinition(service, url)
+ fsd.ServiceDefinition = *sd
+ fsd.Parameters = make(map[string]string)
+ for k, v := range url.GetParams() {
+ fsd.Parameters[k] = strings.Join(v, ",")
+ }
+ return fsd
+}
+
+// ToBytes convert ServiceDefinition to json string
+func (def *FullServiceDefinition) ToBytes() ([]byte, error) {
+ return json.Marshal(def)
+}
+
+// String will iterate all methods and parameters and convert them to json
string
+func (def *FullServiceDefinition) String() string {
+ var methodStr strings.Builder
+ for _, m := range def.Methods {
+ var paramType strings.Builder
+ for _, p := range m.ParameterTypes {
+ paramType.WriteString(fmt.Sprintf("{type:%v}", p))
+ }
+ var param strings.Builder
+ for _, d := range m.Parameters {
+
param.WriteString(fmt.Sprintf("{id:%v,type:%v,builderName:%v}", d.ID, d.Type,
d.TypeBuilderName))
+ }
+
methodStr.WriteString(fmt.Sprintf("{name:%v,parameterTypes:[%v],returnType:%v,params:[%v]
}", m.Name, paramType.String(), m.ReturnType, param.String()))
+ }
+ var types strings.Builder
+ for _, d := range def.Types {
+ types.WriteString(fmt.Sprintf("{id:%v,type:%v,builderName:%v}",
d.ID, d.Type, d.TypeBuilderName))
+ }
+
+ sortSlice := make([]string, 0)
+ var parameters strings.Builder
+ for k := range def.Parameters {
+ sortSlice = append(sortSlice, k)
+ }
+ sort.Slice(sortSlice, func(i, j int) bool { return sortSlice[i] <
sortSlice[j] })
+ for _, k := range sortSlice {
+ parameters.WriteString(fmt.Sprintf("%v:%v,", k,
def.Parameters[k]))
+ }
+
+ return fmt.Sprintf("{parameters:{%v}, canonicalName:%v, codeSource:%v,
methods:[%v], types:[%v]}",
+ strings.TrimRight(parameters.String(), ","), def.CanonicalName,
def.CodeSource, methodStr.String(), types.String())
+}
+
// ServiceDescriperBuild builds the service key, format is
`group/serviceName:version` which be same as URL's service key
func ServiceDescriperBuild(serviceName string, group string, version string)
string {
buf := &bytes.Buffer{}
diff --git a/metadata/definition/definition_test.go
b/metadata/definition/definition_test.go
index 6989fb77a..7515b09cf 100644
--- a/metadata/definition/definition_test.go
+++ b/metadata/definition/definition_test.go
@@ -48,4 +48,6 @@ func TestBuildServiceDefinition(t *testing.T) {
service := common.ServiceMap.GetServiceByServiceKey(url.Protocol,
url.ServiceKey())
sd := BuildServiceDefinition(*service, url)
assert.Equal(t, "{canonicalName:com.ikurento.user.UserProvider,
codeSource:,
methods:[{name:GetUser,parameterTypes:[{type:slice}],returnType:ptr,params:[]
}], types:[]}", sd.String())
+ fsd := BuildFullDefinition(*service, url)
+ assert.Equal(t,
"{parameters:{anyhost:true,application:BDTService,bean.name:UserProvider,category:providers,default.timeout:10000,dubbo:dubbo-provider-golang-1.0.0,environment:dev,group:group1,interface:com.ikurento.user.UserProvider,ip:192.168.56.1,methods:GetUser,module:dubbogo
user-info
server,org:ikurento.com,owner:ZX,pid:1447,revision:0.0.1,side:provider,timeout:3000,timestamp:1556509797245,version:0.0.1},
canonicalName:com.ikurento.user.UserProvider, codeSource:, methods:[{name:Ge
[...]
}
diff --git a/metadata/service/local/service.go
b/metadata/service/local/service.go
index 2b2e6ac88..aeac070fa 100644
--- a/metadata/service/local/service.go
+++ b/metadata/service/local/service.go
@@ -202,7 +202,7 @@ func (mts *MetadataService) PublishServiceDefinition(url
*common.URL) error {
isGeneric := url.GetParamBool(constant.GenericKey, false)
if len(interfaceName) > 0 && !isGeneric {
tmpService :=
common.ServiceMap.GetServiceByServiceKey(url.Protocol, url.ServiceKey())
- sd := definition.BuildServiceDefinition(*tmpService, url)
+ sd := definition.BuildFullDefinition(*tmpService, url)
data, err := sd.ToBytes()
if err != nil {
logger.Errorf("publishProvider getServiceDescriptor
error. providerUrl:%v , error:%v ", url, err)
diff --git a/metadata/service/local/service_test.go
b/metadata/service/local/service_test.go
index c3bcc500c..031c8a56b 100644
--- a/metadata/service/local/service_test.go
+++ b/metadata/service/local/service_test.go
@@ -99,7 +99,14 @@ func TestMetadataService(t *testing.T) {
assert.NoError(t, err)
err = mts.PublishServiceDefinition(u)
assert.NoError(t, err)
- expected :=
"{\"CanonicalName\":\"com.ikurento.user.UserProvider\",\"CodeSource\":\"\"," +
+ expected :=
"{\"Parameters\":{\"anyhost\":\"true\",\"application\":\"BDTService\"," +
+
"\"bean.name\":\"UserProvider\",\"category\":\"providers\",\"default.timeout\":\"10000\","
+
+
"\"dubbo\":\"dubbo-provider-golang-1.0.0\",\"environment\":\"dev\",\"group\":\"group1\","
+
+
"\"interface\":\"com.ikurento.user.UserProvider\",\"ip\":\"192.168.56.1\"," +
+ "\"methods\":\"GetUser\",\"module\":\"dubbogo user-info
server\",\"org\":\"ikurento.com\"," +
+
"\"owner\":\"ZX\",\"pid\":\"1447\",\"revision\":\"0.0.1\",\"side\":\"provider\","
+
+
"\"timeout\":\"3000\",\"timestamp\":\"1556509797245\",\"version\":\"0.0.1\"}," +
+
"\"CanonicalName\":\"com.ikurento.user.UserProvider\",\"CodeSource\":\"\"," +
"\"Methods\":[{\"Name\":\"GetUser\",\"ParameterTypes\":[\"slice\"],\"ReturnType\":\"ptr\","
+
"\"Parameters\":null}],\"Types\":null}"
def1, err := mts.GetServiceDefinition(serviceName, group, version)
diff --git a/metadata/service/remote/service.go
b/metadata/service/remote/service.go
index aaf6aae62..9b2ba3909 100644
--- a/metadata/service/remote/service.go
+++ b/metadata/service/remote/service.go
@@ -109,7 +109,7 @@ func (s *MetadataService) PublishServiceDefinition(url
*common.URL) error {
if common.RoleType(common.PROVIDER).Role() ==
url.GetParam(constant.SideKey, "") {
if len(interfaceName) > 0 && !isGeneric {
sv :=
common.ServiceMap.GetServiceByServiceKey(url.Protocol, url.ServiceKey())
- sd := definition.BuildServiceDefinition(*sv, url)
+ sd := definition.BuildFullDefinition(*sv, url)
id := &identifier.MetadataIdentifier{
BaseMetadataIdentifier:
identifier.BaseMetadataIdentifier{
ServiceInterface: interfaceName,
diff --git a/metadata/service/remote/service_test.go
b/metadata/service/remote/service_test.go
index ae1eeea3e..fa4a17e98 100644
--- a/metadata/service/remote/service_test.go
+++ b/metadata/service/remote/service_test.go
@@ -146,9 +146,17 @@ func TestMockInmemoryProc(t *testing.T) {
err = mts.PublishServiceDefinition(u)
assert.NoError(t, err)
- expected :=
"{\"CanonicalName\":\"com.ikurento.user.UserProvider\",\"CodeSource\":\"\"," +
+ expected :=
"{\"Parameters\":{\"anyhost\":\"true\",\"application\":\"BDTService\"," +
+
"\"bean.name\":\"UserProvider\",\"category\":\"providers\",\"default.timeout\":\"10000\","
+
+
"\"dubbo\":\"dubbo-provider-golang-1.0.0\",\"environment\":\"dev\",\"group\":\"group1\","
+
+
"\"interface\":\"com.ikurento.user.UserProvider\",\"ip\":\"192.168.56.1\"," +
+ "\"methods\":\"GetUser\",\"module\":\"dubbogo user-info
server\",\"org\":\"ikurento.com\"," +
+
"\"owner\":\"ZX\",\"pid\":\"1447\",\"revision\":\"0.0.1\",\"side\":\"provider\","
+
+
"\"timeout\":\"3000\",\"timestamp\":\"1556509797245\",\"version\":\"0.0.1\"}," +
+
"\"CanonicalName\":\"com.ikurento.user.UserProvider\",\"CodeSource\":\"\"," +
"\"Methods\":[{\"Name\":\"GetUser\",\"ParameterTypes\":[\"slice\"],\"ReturnType\":\"ptr\","
+
"\"Parameters\":null}],\"Types\":null}"
+
def1, _ := mts.GetServiceDefinition(serviceName, group, version)
assert.Equal(t, expected, def1)
serviceKey := definition.ServiceDescriperBuild(serviceName, group,
version)