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)

Reply via email to