This is an automated email from the ASF dual-hosted git repository.

wuxinfan pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/dubbo-go.git


The following commit(s) were added to refs/heads/develop by this push:
     new 2bb56d28e feat: support new triple non-IDL mode (#2858)
2bb56d28e is described below

commit 2bb56d28e05555c427cda2d4d6cc926bb9779ef5
Author: marsevilspirit <[email protected]>
AuthorDate: Thu May 22 18:08:22 2025 +0800

    feat: support new triple non-IDL mode (#2858)
    
    * support triple non-idl mode server side
    
    * support new triple non-idl mode client side
    
    * fix multi-protocols bug
    
    * remove unused debug log and comment
    
    * refactor IDL mode in url and rich log output
    
    * add some todo
    
    * support dubbo.load
    
    * Ensure that isIDL does not have any other invalid inputs.
    
    * fix comment
    
    * fix comment
    
    * fix golanglint-ci error
---
 client/action.go                    | 16 +++++++++++
 client/client.go                    | 54 +++++++++++++++++++++++++++++++++----
 client/options.go                   |  8 ++++++
 common/constant/key.go              | 10 +++++++
 common/rpc_service.go               | 32 +++++++++++-----------
 config/service_config.go            | 18 ++++++-------
 dubbo.go                            | 47 ++++++++++++++++++++++++++++----
 global/reference_config.go          |  5 ++++
 protocol/triple/client.go           | 37 ++++++++++++++++++++-----
 protocol/triple/server.go           | 26 +++++++++++++-----
 protocol/triple/triple.go           |  5 +++-
 proxy/proxy_factory/default.go      |  2 +-
 proxy/proxy_factory/pass_through.go |  2 +-
 registry/exposed_tmp/exposed.go     |  4 +--
 server/action.go                    | 44 ++++++++++++++++++++----------
 server/options.go                   | 13 +++++++++
 server/server.go                    | 25 ++++++++++++++---
 17 files changed, 277 insertions(+), 71 deletions(-)

diff --git a/client/action.go b/client/action.go
index c8c7efd6a..a96badb88 100644
--- a/client/action.go
+++ b/client/action.go
@@ -89,6 +89,10 @@ func (refOpts *ReferenceOptions) ReferWithService(srv 
common.RPCService) {
        refOpts.refer(srv, nil)
 }
 
+func (refOpts *ReferenceOptions) Refer() {
+       refOpts.refer(nil, nil)
+}
+
 func (refOpts *ReferenceOptions) ReferWithInfo(info *ClientInfo) {
        refOpts.refer(nil, info)
 }
@@ -130,11 +134,23 @@ func (refOpts *ReferenceOptions) refer(srv 
common.RPCService, info *ClientInfo)
                common.WithParamsValue(constant.TimeoutKey, 
refOpts.Consumer.RequestTimeout),
                common.WithParamsValue(constant.KeepAliveInterval, 
ref.KeepAliveInterval),
                common.WithParamsValue(constant.KeepAliveTimeout, 
ref.KeepAliveTimeout),
+               // for new triple non-IDL mode
+               // TODO: remove ISIDL after old triple removed
+               common.WithParamsValue(constant.IDLMode, ref.IDLMode),
        )
+
+       // for new triple IDL mode
        if info != nil {
                cfgURL.SetAttribute(constant.ClientInfoKey, info)
        }
 
+       // for new triple non-IDL mode
+       // It assists in passing the service,
+       // which is then parsed internally by new triple.
+       if srv != nil {
+               cfgURL.SetAttribute(constant.RpcServiceKey, srv)
+       }
+
        if ref.ForceTag {
                cfgURL.AddParam(constant.ForceUseTag, "true")
        }
diff --git a/client/client.go b/client/client.go
index 69ad59cd0..da3daec97 100644
--- a/client/client.go
+++ b/client/client.go
@@ -20,6 +20,7 @@ package client
 
 import (
        "context"
+       "errors"
 )
 
 import (
@@ -45,9 +46,24 @@ type ClientInfo struct {
 type ClientDefinition struct {
        Svc  any
        Info *ClientInfo
+       Conn *Connection
+}
+
+func (d *ClientDefinition) SetConnection(conn *Connection) {
+       d.Conn = conn
+}
+
+func (d *ClientDefinition) GetConnection() (*Connection, error) {
+       if d.Conn == nil {
+               return nil, errors.New("you need dubbo.load() first")
+       }
+       return d.Conn, nil
 }
 
 // InterfaceName/group/version /ReferenceConfig
+// TODO: In the Connection structure, we are only using the invoker in the 
refOpts.
+// Considering simplifying the Connection.
+// Make the structure of Connection more in line with human logic.
 type Connection struct {
        refOpts *ReferenceOptions
 }
@@ -96,12 +112,33 @@ func (conn *Connection) CallBidiStream(ctx 
context.Context, methodName string, o
        return res.Result(), res.Error()
 }
 
+func (cli *Client) NewService(service any, opts ...ReferenceOption) 
(*Connection, error) {
+       if service == nil {
+               return nil, errors.New("service must not be nil")
+       }
+
+       interfaceName := common.GetReference(service)
+
+       finalOpts := []ReferenceOption{
+               WithIDL(constant.NONIDL),
+               // default msgpack serialization
+               WithSerialization(constant.MsgpackSerialization),
+       }
+       finalOpts = append(finalOpts, opts...)
+
+       return cli.DialWithService(interfaceName, service, finalOpts...)
+}
+
 func (cli *Client) Dial(interfaceName string, opts ...ReferenceOption) 
(*Connection, error) {
-       return cli.dial(interfaceName, nil, opts...)
+       return cli.dial(interfaceName, nil, nil, opts...)
+}
+
+func (cli *Client) DialWithService(interfaceName string, service any, opts 
...ReferenceOption) (*Connection, error) {
+       return cli.dial(interfaceName, nil, service, opts...)
 }
 
 func (cli *Client) DialWithInfo(interfaceName string, info *ClientInfo, opts 
...ReferenceOption) (*Connection, error) {
-       return cli.dial(interfaceName, info, opts...)
+       return cli.dial(interfaceName, info, nil, opts...)
 }
 
 func (cli *Client) DialWithDefinition(interfaceName string, definition 
*ClientDefinition, opts ...ReferenceOption) (*Connection, error) {
@@ -115,10 +152,10 @@ func (cli *Client) DialWithDefinition(interfaceName 
string, definition *ClientDe
                opts = append(opts, setReference(ref))
        }
 
-       return cli.dial(interfaceName, definition.Info, opts...)
+       return cli.dial(interfaceName, definition.Info, nil, opts...)
 }
 
-func (cli *Client) dial(interfaceName string, info *ClientInfo, opts 
...ReferenceOption) (*Connection, error) {
+func (cli *Client) dial(interfaceName string, info *ClientInfo, srv any, opts 
...ReferenceOption) (*Connection, error) {
        if err := metadata.InitRegistryMetadataReport(cli.cliOpts.Registries); 
err != nil {
                return nil, err
        }
@@ -137,7 +174,14 @@ func (cli *Client) dial(interfaceName string, info 
*ClientInfo, opts ...Referenc
        if err := newRefOpts.init(finalOpts...); err != nil {
                return nil, err
        }
-       newRefOpts.ReferWithInfo(info)
+
+       if info != nil {
+               newRefOpts.ReferWithInfo(info)
+       } else if srv != nil {
+               newRefOpts.ReferWithService(srv)
+       } else {
+               newRefOpts.Refer()
+       }
 
        return &Connection{refOpts: newRefOpts}, nil
 }
diff --git a/client/options.go b/client/options.go
index e2ffba8f3..c753e4888 100644
--- a/client/options.go
+++ b/client/options.go
@@ -98,6 +98,7 @@ func (refOpts *ReferenceOptions) init(opts 
...ReferenceOption) error {
        }
 
        // init cluster
+       // TODO: use constant replace failover
        if ref.Cluster == "" {
                ref.Cluster = "failover"
        }
@@ -332,6 +333,13 @@ func WithSticky() ReferenceOption {
        }
 }
 
+// TODO: remove this function after old triple removed
+func WithIDL(IDLMode string) ReferenceOption {
+       return func(opts *ReferenceOptions) {
+               opts.Reference.IDLMode = IDLMode
+       }
+}
+
 // ========== Protocol to consume ==========
 
 func WithProtocolDubbo() ReferenceOption {
diff --git a/common/constant/key.go b/common/constant/key.go
index 8a357d426..b95b20196 100644
--- a/common/constant/key.go
+++ b/common/constant/key.go
@@ -64,6 +64,16 @@ const (
        MaxServerRecvMsgSize   = "max-server-recv-msg-size"
        KeepAliveInterval      = "keep-alive-interval"
        KeepAliveTimeout       = "keep-alive-timeout"
+
+       // TODO: remove IDLMode after old triple removed
+       IDLMode = "IDL-mode"
+)
+
+// TODO: remove this after old triple removed
+// IDLMode
+const (
+       IDL    = "IDL"
+       NONIDL = "non-IDL"
 )
 
 // tls constant
diff --git a/common/rpc_service.go b/common/rpc_service.go
index 5992c7b77..6b27de6b5 100644
--- a/common/rpc_service.go
+++ b/common/rpc_service.go
@@ -142,10 +142,10 @@ func (m *MethodType) SuiteContext(ctx context.Context) 
reflect.Value {
 
 // Service is description of service
 type Service struct {
-       name     string
-       rcvr     reflect.Value
-       rcvrType reflect.Type
-       methods  map[string]*MethodType
+       name    string
+       svc     reflect.Value
+       svcType reflect.Type
+       methods map[string]*MethodType
 }
 
 // Method gets @s.methods.
@@ -158,14 +158,14 @@ func (s *Service) Name() string {
        return s.name
 }
 
-// RcvrType gets @s.rcvrType.
-func (s *Service) RcvrType() reflect.Type {
-       return s.rcvrType
+// ServiceType gets @s.SvcType.
+func (s *Service) ServiceType() reflect.Type {
+       return s.svcType
 }
 
-// Rcvr gets @s.rcvr.
-func (s *Service) Rcvr() reflect.Value {
-       return s.rcvr
+// Service gets @s.Svc.
+func (s *Service) Service() reflect.Value {
+       return s.svc
 }
 
 type serviceMap struct {
@@ -204,7 +204,7 @@ func (sm *serviceMap) GetInterface(interfaceName string) 
[]*Service {
 }
 
 // Register registers a service by @interfaceName and @protocol
-func (sm *serviceMap) Register(interfaceName, protocol, group, version string, 
rcvr RPCService) (string, error) {
+func (sm *serviceMap) Register(interfaceName, protocol, group, version string, 
svc RPCService) (string, error) {
        if sm.serviceMap[protocol] == nil {
                sm.serviceMap[protocol] = make(map[string]*Service)
        }
@@ -213,11 +213,11 @@ func (sm *serviceMap) Register(interfaceName, protocol, 
group, version string, r
        }
 
        s := new(Service)
-       s.rcvrType = reflect.TypeOf(rcvr)
-       s.rcvr = reflect.ValueOf(rcvr)
-       sname := reflect.Indirect(s.rcvr).Type().Name()
+       s.svcType = reflect.TypeOf(svc)
+       s.svc = reflect.ValueOf(svc)
+       sname := reflect.Indirect(s.svc).Type().Name()
        if sname == "" {
-               s := "no service name for type " + s.rcvrType.String()
+               s := "no service name for type " + s.svcType.String()
                logger.Errorf(s)
                return "", perrors.New(s)
        }
@@ -236,7 +236,7 @@ func (sm *serviceMap) Register(interfaceName, protocol, 
group, version string, r
 
        // Install the methods
        methods := ""
-       methods, s.methods = suitableMethods(s.rcvrType)
+       methods, s.methods = suitableMethods(s.svcType)
 
        if len(s.methods) == 0 {
                s := "type " + sname + " has no exported methods of suitable 
type"
diff --git a/config/service_config.go b/config/service_config.go
index cb9ab4631..6cfbfd09d 100644
--- a/config/service_config.go
+++ b/config/service_config.go
@@ -257,25 +257,25 @@ func (s *ServiceConfig) Export() error {
        ports := getRandomPort(protocolConfigs)
        nextPort := ports.Front()
 
-       for _, proto := range protocolConfigs {
+       for _, protocolConf := range protocolConfigs {
                // registry the service reflect
-               methods, err := common.ServiceMap.Register(s.Interface, 
proto.Name, s.Group, s.Version, s.rpcService)
+               methods, err := common.ServiceMap.Register(s.Interface, 
protocolConf.Name, s.Group, s.Version, s.rpcService)
                if err != nil {
                        formatErr := perrors.Errorf("The service %v export the 
protocol %v error! Error message is %v.",
-                               s.Interface, proto.Name, err.Error())
+                               s.Interface, protocolConf.Name, err.Error())
                        logger.Errorf(formatErr.Error())
                        return formatErr
                }
 
-               port := proto.Port
-               if num, err := strconv.Atoi(proto.Port); err != nil || num <= 0 
{
+               port := protocolConf.Port
+               if num, err := strconv.Atoi(protocolConf.Port); err != nil || 
num <= 0 {
                        port = nextPort.Value.(string)
                        nextPort = nextPort.Next()
                }
                ivkURL := common.NewURLWithOptions(
                        common.WithPath(s.Interface),
-                       common.WithProtocol(proto.Name),
-                       common.WithIp(proto.Ip),
+                       common.WithProtocol(protocolConf.Name),
+                       common.WithIp(protocolConf.Ip),
                        common.WithPort(port),
                        common.WithParams(urlMap),
                        common.WithParamsValue(constant.BeanNameKey, s.id),
@@ -285,8 +285,8 @@ func (s *ServiceConfig) Export() error {
                        common.WithToken(s.Token),
                        common.WithParamsValue(constant.MetadataTypeKey, 
s.metadataType),
                        // fix https://github.com/apache/dubbo-go/issues/2176
-                       common.WithParamsValue(constant.MaxServerSendMsgSize, 
proto.MaxServerSendMsgSize),
-                       common.WithParamsValue(constant.MaxServerRecvMsgSize, 
proto.MaxServerRecvMsgSize),
+                       common.WithParamsValue(constant.MaxServerSendMsgSize, 
protocolConf.MaxServerSendMsgSize),
+                       common.WithParamsValue(constant.MaxServerRecvMsgSize, 
protocolConf.MaxServerRecvMsgSize),
                )
                info := GetProviderServiceInfo(s.id)
                if info != nil {
diff --git a/dubbo.go b/dubbo.go
index 6546ea3bd..d4d3c5358 100644
--- a/dubbo.go
+++ b/dubbo.go
@@ -18,13 +18,12 @@
 package dubbo
 
 import (
+       "errors"
        "sync"
 )
 
 import (
        "github.com/dubbogo/gost/log/logger"
-
-       "github.com/pkg/errors"
 )
 
 import (
@@ -186,7 +185,9 @@ func (ins *Instance) start() (err error) {
 
 // loadProvider loads the service provider.
 func (ins *Instance) loadProvider() error {
+       var err error
        var srvOpts []server.ServerOption
+
        if ins.insOpts.Provider != nil {
                srvOpts = append(srvOpts, 
server.SetServerProvider(ins.insOpts.Provider))
        }
@@ -198,7 +199,13 @@ func (ins *Instance) loadProvider() error {
        proLock.RLock()
        defer proLock.RUnlock()
        for _, definition := range providerServices {
-               if err = srv.Register(definition.Handler, definition.Info, 
definition.Opts...); err != nil {
+               if definition.Info != nil {
+                       err = srv.Register(definition.Handler, definition.Info, 
definition.Opts...)
+               } else {
+                       // if Info in nil, it means non-idl mode
+                       err = srv.RegisterService(definition.Handler, 
definition.Opts...)
+               }
+               if err != nil {
                        return err
                }
        }
@@ -220,11 +227,21 @@ func (ins *Instance) loadConsumer() error {
        conLock.RLock()
        defer conLock.RUnlock()
        for intfName, definition := range consumerServices {
-               conn, dialErr := cli.DialWithDefinition(intfName, definition)
+               var (
+                       conn    *client.Connection
+                       dialErr error
+               )
+               if definition.Info != nil {
+                       conn, dialErr = cli.DialWithDefinition(intfName, 
definition)
+                       definition.Info.ConnectionInjectFunc(definition.Svc, 
conn)
+               } else {
+                       // default use msgpack
+                       conn, dialErr = cli.NewService(definition.Svc)
+                       
consumerServices[common.GetReference(definition.Svc)].SetConnection(conn)
+               }
                if dialErr != nil {
                        return dialErr
                }
-               definition.Info.ConnectionInjectFunc(definition.Svc, conn)
        }
        return nil
 }
@@ -248,3 +265,23 @@ func SetProviderServiceWithInfo(svc common.RPCService, 
info *common.ServiceInfo)
                Info:    info,
        }
 }
+
+func SetConsumerService(svc common.RPCService) {
+       conLock.Lock()
+       defer conLock.Unlock()
+       consumerServices[common.GetReference(svc)] = &client.ClientDefinition{
+               Svc: svc,
+       }
+}
+
+func SetProviderService(svc common.RPCService) {
+       conLock.Lock()
+       defer conLock.Unlock()
+       providerServices[common.GetReference(svc)] = &server.ServiceDefinition{
+               Handler: svc,
+       }
+}
+
+func GetConsumerService(interfaceName string) (*client.Connection, error) {
+       return consumerServices[interfaceName].GetConnection()
+}
diff --git a/global/reference_config.go b/global/reference_config.go
index ff035d6e6..4519df285 100644
--- a/global/reference_config.go
+++ b/global/reference_config.go
@@ -47,6 +47,10 @@ type ReferenceConfig struct {
        MeshProviderPort  int               `yaml:"mesh-provider-port" 
json:"mesh-provider-port,omitempty" propertiy:"mesh-provider-port"`
        KeepAliveInterval string            `yaml:"keep-alive-interval" 
json:"keep-alive-interval,omitempty" property:"keep-alive-interval"`
        KeepAliveTimeout  string            `yaml:"keep-alive-timeout" 
json:"keep-alive-timeout,omitempty" property:"keep-alive-timeout"`
+
+       // just for new triple non-IDL mode
+       // TODO: remove IDLMode when config package is removed
+       IDLMode string
 }
 
 func DefaultReferenceConfig() *ReferenceConfig {
@@ -185,6 +189,7 @@ func (c *ReferenceConfig) Clone() *ReferenceConfig {
                MeshProviderPort:  c.MeshProviderPort,
                KeepAliveInterval: c.KeepAliveInterval,
                KeepAliveTimeout:  c.KeepAliveTimeout,
+               IDLMode:           c.IDLMode,
        }
 }
 
diff --git a/protocol/triple/client.go b/protocol/triple/client.go
index 1cc34d44f..29d3c97f1 100644
--- a/protocol/triple/client.go
+++ b/protocol/triple/client.go
@@ -23,6 +23,7 @@ import (
        "fmt"
        "net"
        "net/http"
+       "reflect"
        "strings"
 )
 
@@ -74,7 +75,7 @@ func (cm *clientManager) callUnary(ctx context.Context, 
method string, req, resp
                return err
        }
 
-       serverAttachments, ok := 
ctx.Value(constant.AttachmentServerKey).(map[string]interface{})
+       serverAttachments, ok := 
ctx.Value(constant.AttachmentServerKey).(map[string]any)
        if !ok {
                return nil
        }
@@ -244,13 +245,35 @@ func newClientManager(url *common.URL) (*clientManager, 
error) {
                baseTriURL = httpPrefix + baseTriURL
        }
        triClients := make(map[string]*tri.Client)
-       for _, method := range url.Methods {
-               triURL, err := joinPath(baseTriURL, url.Interface(), method)
-               if err != nil {
-                       return nil, fmt.Errorf("JoinPath failed for base %s, 
interface %s, method %s", baseTriURL, url.Interface(), method)
+
+       if len(url.Methods) != 0 {
+               for _, method := range url.Methods {
+                       triURL, err := joinPath(baseTriURL, url.Interface(), 
method)
+                       if err != nil {
+                               return nil, fmt.Errorf("JoinPath failed for 
base %s, interface %s, method %s", baseTriURL, url.Interface(), method)
+                       }
+                       triClient := tri.NewClient(httpClient, triURL, 
cliOpts...)
+                       triClients[method] = triClient
+               }
+       } else {
+               // This branch is for the non-IDL mode, where we pass in the 
service solely
+               // for the purpose of using reflection to obtain all methods of 
the service.
+               // There might be potential for optimization in this area later 
on.
+               service, ok := url.GetAttribute(constant.RpcServiceKey)
+               if !ok {
+                       return nil, fmt.Errorf("triple clientmanager can't get 
methods")
+               }
+
+               serviceType := reflect.TypeOf(service)
+               for i := range serviceType.NumMethod() {
+                       methodName := serviceType.Method(i).Name
+                       triURL, err := joinPath(baseTriURL, url.Interface(), 
methodName)
+                       if err != nil {
+                               return nil, fmt.Errorf("JoinPath failed for 
base %s, interface %s, method %s", baseTriURL, url.Interface(), methodName)
+                       }
+                       triClient := tri.NewClient(httpClient, triURL, 
cliOpts...)
+                       triClients[methodName] = triClient
                }
-               triClient := tri.NewClient(httpClient, triURL, cliOpts...)
-               triClients[method] = triClient
        }
 
        return &clientManager{
diff --git a/protocol/triple/server.go b/protocol/triple/server.go
index 2e5bcd7ec..f2aa62915 100644
--- a/protocol/triple/server.go
+++ b/protocol/triple/server.go
@@ -108,7 +108,15 @@ func (s *Server) Start(invoker protocol.Invoker, info 
*common.ServiceInfo) {
                logger.Infof("TRIPLE Server initialized the TLSConfig 
configuration")
        }
 
-       // todo:// move tls config to handleService
+       // IDLMode means that this will only be set when
+       // the new triple is started in non-IDL mode.
+       // TODO: remove IDLMode when config package is removed
+       IDLMode := URL.GetParam(constant.IDLMode, "")
+
+       var service common.RPCService
+       if IDLMode == constant.NONIDL {
+               service, _ = URL.GetAttribute(constant.RpcServiceKey)
+       }
 
        hanOpts := getHanOpts(URL)
        //Set expected codec name from serviceinfo
@@ -118,8 +126,13 @@ func (s *Server) Start(invoker protocol.Invoker, info 
*common.ServiceInfo) {
                // new triple idl mode
                s.handleServiceWithInfo(intfName, invoker, info, hanOpts...)
                s.saveServiceInfo(intfName, info)
+       } else if IDLMode == constant.NONIDL {
+               // new triple non-idl mode
+               reflectInfo := createServiceInfoWithReflection(service)
+               s.handleServiceWithInfo(intfName, invoker, reflectInfo, 
hanOpts...)
+               s.saveServiceInfo(intfName, reflectInfo)
        } else {
-               // old triple idl mode and non-idl mode
+               // old triple idl mode and old triple non-idl mode
                s.compatHandleService(intfName, URL.Group(), URL.Version(), 
hanOpts...)
        }
        internal.ReflectionRegister(s)
@@ -433,15 +446,14 @@ func (s *Server) GracefulStop() {
 // As a result, Server could use this ServiceInfo to register.
 func createServiceInfoWithReflection(svc common.RPCService) 
*common.ServiceInfo {
        var info common.ServiceInfo
-       val := reflect.ValueOf(svc)
-       typ := reflect.TypeOf(svc)
-       methodNum := val.NumMethod()
+       svcType := reflect.TypeOf(svc)
+       methodNum := svcType.NumMethod()
 
        // +1 for generic call method
        methodInfos := make([]common.MethodInfo, 0, methodNum+1)
 
-       for i := 0; i < methodNum; i++ {
-               methodType := typ.Method(i)
+       for i := range methodNum {
+               methodType := svcType.Method(i)
                if methodType.Name == "Reference" {
                        continue
                }
diff --git a/protocol/triple/triple.go b/protocol/triple/triple.go
index 7a94497c7..a7e426e1a 100644
--- a/protocol/triple/triple.go
+++ b/protocol/triple/triple.go
@@ -93,9 +93,12 @@ func (tp *TripleProtocol) openServer(invoker 
protocol.Invoker, info *common.Serv
 func (tp *TripleProtocol) Refer(url *common.URL) protocol.Invoker {
        var invoker protocol.Invoker
        var err error
+
+       IDLMode := url.GetParam(constant.IDLMode, "")
        // for now, we do not need to use this info
        _, ok := url.GetAttribute(constant.ClientInfoKey)
-       if ok {
+       // isIDL is NONIDL means new triple non-IDL mode
+       if ok || IDLMode == constant.NONIDL {
                // stub code generated by new protoc-gen-go-triple
                invoker, err = NewTripleInvoker(url)
        } else {
diff --git a/proxy/proxy_factory/default.go b/proxy/proxy_factory/default.go
index 4c6276faa..388eacd9b 100644
--- a/proxy/proxy_factory/default.go
+++ b/proxy/proxy_factory/default.go
@@ -122,7 +122,7 @@ func (pi *ProxyInvoker) Invoke(ctx context.Context, 
invocation protocol.Invocati
                return result
        }
 
-       in := []reflect.Value{svc.Rcvr()}
+       in := []reflect.Value{svc.Service()}
        if method.CtxType() != nil {
                ctx = context.WithValue(ctx, constant.AttachmentKey, 
invocation.Attachments())
                in = append(in, method.SuiteContext(ctx))
diff --git a/proxy/proxy_factory/pass_through.go 
b/proxy/proxy_factory/pass_through.go
index 0a5e6dffc..736889d29 100644
--- a/proxy/proxy_factory/pass_through.go
+++ b/proxy/proxy_factory/pass_through.go
@@ -102,7 +102,7 @@ func (pi *PassThroughProxyInvoker) Invoke(ctx 
context.Context, invocation protoc
        method := srv.Method()["Service"]
 
        in := make([]reflect.Value, 0, 5)
-       in = append(in, srv.Rcvr())
+       in = append(in, srv.Service())
        in = append(in, reflect.ValueOf(invocation.MethodName()))
        in = append(in, 
reflect.ValueOf(invocation.GetAttachmentInterface(constant.ParamsTypeKey)))
        in = append(in, reflect.ValueOf(args))
diff --git a/registry/exposed_tmp/exposed.go b/registry/exposed_tmp/exposed.go
index d4a1b77c4..3f4a26fb1 100644
--- a/registry/exposed_tmp/exposed.go
+++ b/registry/exposed_tmp/exposed.go
@@ -30,8 +30,8 @@ import (
 // RegisterServiceInstance register service instance
 func RegisterServiceInstance() error {
        defer func() {
-               // TODO remove this recover func,this just to avoid some unit 
test failed,this will not happen in user side mostly
-               // config test -> metadata exporter -> dubbo protocol/remoting 
-> config,cycle import will occur
+               // TODO: remove this recover func, this just to avoid some unit 
test failed, this will not happen in user side mostly
+               // config test -> metadata exporter -> dubbo protocol/remoting 
-> config, cycle import will occur
                // some day we fix the cycle import then can remove this recover
                if err := recover(); err != nil {
                        logger.Errorf("register service instance failed,please 
check if registry protocol is imported, error: %v", err)
diff --git a/server/action.go b/server/action.go
index e741ed0ea..72e64c947 100644
--- a/server/action.go
+++ b/server/action.go
@@ -139,9 +139,11 @@ func (svcOpts *ServiceOptions) export(info 
*common.ServiceInfo) error {
                if svc.Interface == "" {
                        svc.Interface = info.InterfaceName
                }
-               svcOpts.Id = common.GetReference(svcOpts.rpcService)
                svcOpts.info = info
        }
+
+       svcOpts.Id = common.GetReference(svcOpts.rpcService)
+
        // TODO: delay needExport
        if svcOpts.unexported != nil && svcOpts.unexported.Load() {
                err := perrors.Errorf("The service %v has already unexported!", 
svc.Interface)
@@ -168,43 +170,55 @@ func (svcOpts *ServiceOptions) export(info 
*common.ServiceInfo) error {
        var invoker protocol.Invoker
        ports := getRandomPort(protocolConfigs)
        nextPort := ports.Front()
-       for _, proto := range protocolConfigs {
+       for _, protocolConf := range protocolConfigs {
                // *important* Register should have been replaced by processing 
of ServiceInfo.
                // but many modules like metadata need to make use of 
information from ServiceMap.
                // todo(DMwangnimg): finish replacing procedure
 
                // registry the service reflect
-               methods, err := common.ServiceMap.Register(svc.Interface, 
proto.Name, svc.Group, svc.Version, svcOpts.rpcService)
+               methods, err := common.ServiceMap.Register(svc.Interface, 
protocolConf.Name, svc.Group, svc.Version, svcOpts.rpcService)
                if err != nil {
                        formatErr := perrors.Errorf("The service %v needExport 
the protocol %v error! Error message is %v.",
-                               svc.Interface, proto.Name, err.Error())
+                               svc.Interface, protocolConf.Name, err.Error())
                        logger.Errorf(formatErr.Error())
                        return formatErr
                }
 
-               port := proto.Port
-               if len(proto.Port) == 0 {
+               port := protocolConf.Port
+               if len(protocolConf.Port) == 0 {
                        port = nextPort.Value.(string)
                        nextPort = nextPort.Next()
                }
+
+               // Ensure that isIDL does not have any other invalid inputs.
+               isIDL := constant.IDL
+               if svcOpts.IDLMode == constant.NONIDL {
+                       isIDL = svcOpts.IDLMode
+               }
+
                ivkURL := common.NewURLWithOptions(
                        common.WithPath(svc.Interface),
-                       common.WithProtocol(proto.Name),
-                       common.WithIp(proto.Ip),
+                       common.WithProtocol(protocolConf.Name),
+                       common.WithIp(protocolConf.Ip),
                        common.WithPort(port),
                        common.WithParams(urlMap),
                        common.WithParamsValue(constant.BeanNameKey, 
svcOpts.Id),
                        common.WithParamsValue(constant.ApplicationTagKey, 
svcOpts.Application.Tag),
                        //common.WithParamsValue(constant.SslEnabledKey, 
strconv.FormatBool(config.GetSslEnabled())),
                        common.WithMethods(strings.Split(methods, ",")),
-                       // todo(DMwangnima): remove this
-                       common.WithAttribute(constant.ServiceInfoKey, info),
+                       common.WithAttribute(constant.RpcServiceKey, 
svcOpts.rpcService),
                        common.WithToken(svc.Token),
                        common.WithParamsValue(constant.MetadataTypeKey, 
svcOpts.metadataType),
                        // fix https://github.com/apache/dubbo-go/issues/2176
-                       common.WithParamsValue(constant.MaxServerSendMsgSize, 
proto.MaxServerSendMsgSize),
-                       common.WithParamsValue(constant.MaxServerRecvMsgSize, 
proto.MaxServerRecvMsgSize),
+                       common.WithParamsValue(constant.MaxServerSendMsgSize, 
protocolConf.MaxServerSendMsgSize),
+                       common.WithParamsValue(constant.MaxServerRecvMsgSize, 
protocolConf.MaxServerRecvMsgSize),
+                       common.WithParamsValue(constant.IDLMode, isIDL),
                )
+
+               if info != nil {
+                       ivkURL.SetAttribute(constant.ServiceInfoKey, info)
+               }
+
                if len(svc.Tag) > 0 {
                        ivkURL.AddParam(constant.Tagkey, svc.Tag)
                }
@@ -243,7 +257,7 @@ func (svcOpts *ServiceOptions) export(info 
*common.ServiceInfo) error {
                }
                // this protocol would be destroyed in graceful_shutdown
                // please refer to 
(https://github.com/apache/dubbo-go/issues/2429)
-               graceful_shutdown.RegisterProtocol(proto.Name)
+               graceful_shutdown.RegisterProtocol(protocolConf.Name)
        }
        svcOpts.exported.Store(true)
        return nil
@@ -253,8 +267,10 @@ func (svcOpts *ServiceOptions) generatorInvoker(url 
*common.URL, info *common.Se
        proxyFactory := extension.GetProxyFactory(svcOpts.ProxyFactoryKey)
        if info != nil {
                url.SetAttribute(constant.ServiceInfoKey, info)
-               url.SetAttribute(constant.RpcServiceKey, svcOpts.rpcService)
        }
+
+       url.SetAttribute(constant.RpcServiceKey, svcOpts.rpcService)
+
        return proxyFactory.GetInvoker(url)
 }
 
diff --git a/server/options.go b/server/options.go
index 0f6ef9ad1..bd7e8bd55 100644
--- a/server/options.go
+++ b/server/options.go
@@ -469,6 +469,12 @@ type ServiceOptions struct {
        exporters       []protocol.Exporter
        adaptiveService bool
 
+       // for triple non-IDL mode
+       // consider put here or global.ServiceConfig
+       // string for url
+       // TODO: remove this when config package is remove
+       IDLMode string
+
        methodsCompat     []*config.MethodConfig
        applicationCompat *config.ApplicationConfig
        registriesCompat  map[string]*config.RegistryConfig
@@ -871,6 +877,13 @@ func WithParam(k, v string) ServiceOption {
        }
 }
 
+// TODO: remove when config package is removed
+func WithIDLMode(IDLMode string) ServiceOption {
+       return func(opts *ServiceOptions) {
+               opts.IDLMode = IDLMode
+       }
+}
+
 // ----------For framework----------
 // These functions should not be invoked by users
 
diff --git a/server/server.go b/server/server.go
index ea2d5b9e5..30991e93b 100644
--- a/server/server.go
+++ b/server/server.go
@@ -66,7 +66,9 @@ type ServiceDefinition struct {
 
 // Register assemble invoker chains like ProviderConfig.Load, init a service 
per call
 func (s *Server) Register(handler any, info *common.ServiceInfo, opts 
...ServiceOption) error {
-       newSvcOpts, err := s.genSvcOpts(handler, opts...)
+       baseOpts := []ServiceOption{WithIDLMode(constant.IDL)}
+       baseOpts = append(baseOpts, opts...)
+       newSvcOpts, err := s.genSvcOpts(handler, baseOpts...)
        if err != nil {
                return err
        }
@@ -74,6 +76,21 @@ func (s *Server) Register(handler any, info 
*common.ServiceInfo, opts ...Service
        return nil
 }
 
+// RegisterService is for new Triple non-idl mode implement.
+func (s *Server) RegisterService(handler any, opts ...ServiceOption) error {
+       baseOpts := []ServiceOption{
+               WithIDLMode(constant.NONIDL),
+               WithInterface(common.GetReference(handler)),
+       }
+       baseOpts = append(baseOpts, opts...)
+       newSvcOpts, err := s.genSvcOpts(handler, baseOpts...)
+       if err != nil {
+               return err
+       }
+       s.svcOptsMap.Store(newSvcOpts, nil)
+       return nil
+}
+
 func (s *Server) genSvcOpts(handler any, opts ...ServiceOption) 
(*ServiceOptions, error) {
        if s.cfg == nil {
                return nil, errors.New("Server has not been initialized, please 
use NewServer() to create Server")
@@ -121,8 +138,10 @@ func (s *Server) exportServices() (err error) {
                        err = svcOpts.ExportWithoutInfo()
                } else {
                        info := infoRaw.(*common.ServiceInfo)
-                       //Add a method with a name of a differtent first-letter 
case
-                       //to achieve interoperability with java
+                       // Add a method with a name of a differtent 
first-letter case
+                       // to achieve interoperability with java
+                       // TODO: The method name case sensitivity in Dubbo-java 
should be addressed.
+                       // We ought to make changes to handle this issue.
                        var additionalMethods []common.MethodInfo
                        for _, method := range info.Methods {
                                newMethod := method

Reply via email to