DMwangnima commented on code in PR #2523: URL: https://github.com/apache/dubbo-go/pull/2523#discussion_r1408967862
########## dubbo.go: ########## @@ -17,15 +17,26 @@ package dubbo +import ( + "sync" +) + import ( "github.com/pkg/errors" ) import ( "dubbo.apache.org/dubbo-go/v3/client" + "dubbo.apache.org/dubbo-go/v3/common" "dubbo.apache.org/dubbo-go/v3/server" ) +var ( Review Comment: Add locks there to protect ```consumerServices``` and ```providerServices``` separately since ```dubbo.SetConsumerService``` and ```dubbo.SetProviderService``` could be invoked concurrently. ########## server/server.go: ########## @@ -182,6 +183,15 @@ func (s *Server) Serve() error { select {} } +func (s *Server) ServeWithNoBlocking() error { Review Comment: Do we have to export this method? By the way, ```NonBlocking``` is the better name. ########## dubbo.go: ########## @@ -156,3 +167,66 @@ func (ins *Instance) NewServer(opts ...server.ServerOption) (*server.Server, err } return srv, nil } + +func (ins *Instance) start() (err error) { + startOnce.Do(func() { + if err = ins.loadConsumer(); err != nil { + return + } + if err = ins.loadProvider(); err != nil { + return + } + }) + return err +} + +// loadProvider loads the service provider. +func (ins *Instance) loadProvider() error { + var srvOpts []server.ServerOption + if ins.insOpts.Provider != nil { + srvOpts = append(srvOpts, server.SetServerProvider(ins.insOpts.Provider)) + } + srv, err := ins.NewServer(srvOpts...) + if err != nil { + return err + } + // register services + for _, definition := range providerServices { + if err = srv.Register(definition.Handler, definition.Info, definition.Opts...); err != nil { + return err + } + } + return srv.ServeWithNoBlocking() +} + +// loadConsumer loads the service consumer. +func (ins *Instance) loadConsumer() error { + cli, err := ins.NewClient() + if err != nil { + return err + } + // refer services + for _, definition := range consumerServices { + if _, _, err = cli.Init(definition.Info); err != nil { + return err + } + definition.Info.ClientInjectFunc(definition.Svc, cli) + } + return err +} + +// SetConsumerServiceWithInfo sets the consumer service with the client information. +func SetConsumerServiceWithInfo(svc common.RPCService, info *client.ClientInfo) { + consumerServices[info.InterfaceName] = &client.ClientDefinition{ Review Comment: Add lock operation. ########## dubbo.go: ########## @@ -156,3 +167,66 @@ func (ins *Instance) NewServer(opts ...server.ServerOption) (*server.Server, err } return srv, nil } + +func (ins *Instance) start() (err error) { + startOnce.Do(func() { + if err = ins.loadConsumer(); err != nil { + return + } + if err = ins.loadProvider(); err != nil { + return + } + }) + return err +} + +// loadProvider loads the service provider. +func (ins *Instance) loadProvider() error { + var srvOpts []server.ServerOption + if ins.insOpts.Provider != nil { + srvOpts = append(srvOpts, server.SetServerProvider(ins.insOpts.Provider)) + } + srv, err := ins.NewServer(srvOpts...) + if err != nil { + return err + } + // register services + for _, definition := range providerServices { + if err = srv.Register(definition.Handler, definition.Info, definition.Opts...); err != nil { + return err + } + } + return srv.ServeWithNoBlocking() Review Comment: Maybe we can make use of goroutine and do not need to export ```ServeWithNoBlocking```? ########## dubbo.go: ########## @@ -156,3 +167,66 @@ func (ins *Instance) NewServer(opts ...server.ServerOption) (*server.Server, err } return srv, nil } + +func (ins *Instance) start() (err error) { + startOnce.Do(func() { + if err = ins.loadConsumer(); err != nil { + return + } + if err = ins.loadProvider(); err != nil { + return + } + }) + return err +} + +// loadProvider loads the service provider. +func (ins *Instance) loadProvider() error { + var srvOpts []server.ServerOption + if ins.insOpts.Provider != nil { + srvOpts = append(srvOpts, server.SetServerProvider(ins.insOpts.Provider)) + } + srv, err := ins.NewServer(srvOpts...) + if err != nil { + return err + } + // register services + for _, definition := range providerServices { + if err = srv.Register(definition.Handler, definition.Info, definition.Opts...); err != nil { + return err + } + } + return srv.ServeWithNoBlocking() +} + +// loadConsumer loads the service consumer. +func (ins *Instance) loadConsumer() error { + cli, err := ins.NewClient() + if err != nil { + return err + } + // refer services + for _, definition := range consumerServices { + if _, _, err = cli.Init(definition.Info); err != nil { + return err + } + definition.Info.ClientInjectFunc(definition.Svc, cli) + } + return err +} + +// SetConsumerServiceWithInfo sets the consumer service with the client information. +func SetConsumerServiceWithInfo(svc common.RPCService, info *client.ClientInfo) { + consumerServices[info.InterfaceName] = &client.ClientDefinition{ + Svc: svc, + Info: info, + } +} + +// SetProviderServiceWithInfo sets the provider service with the server information. +func SetProviderServiceWithInfo(svc common.RPCService, info *server.ServiceInfo) { + providerServices[info.InterfaceName] = &server.ServiceDefinition{ Review Comment: Add lock Operation. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: notifications-unsubscr...@dubbo.apache.org For additional commands, e-mail: notifications-h...@dubbo.apache.org