From 97c7009a33eb6029cfac2213d67217cf0ee451db Mon Sep 17 00:00:00 2001 From: papa-hexuan <60082213+papa-hexuan@users.noreply.github.com> Date: Mon, 10 Oct 2022 13:41:23 +0800 Subject: [PATCH] feat: unregister before stop (#462) Co-authored-by: papa-hexuan --- pkg/application/application.go | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/pkg/application/application.go b/pkg/application/application.go index 58a4c3730e..a816764249 100644 --- a/pkg/application/application.go +++ b/pkg/application/application.go @@ -265,6 +265,13 @@ func (app *Application) Stop() (err error) { for _, s := range app.servers { func(s server.Server) { app.smu.RLock() + // unregister before stop + e := registry.DefaultRegisterer.UnregisterService(context.Background(), s.Info()) + if e != nil { + app.logger.Error("exit server", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("stop"), xlog.FieldName(s.Info().Name), xlog.FieldAddr(s.Info().Label()), xlog.FieldErr(err)) + } + app.logger.Info("exit server", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("stop"), xlog.FieldName(s.Info().Name), xlog.FieldAddr(s.Info().Label())) + app.cycle.Run(s.Stop) app.smu.RUnlock() }(s) @@ -296,6 +303,13 @@ func (app *Application) GracefulStop(ctx context.Context) (err error) { app.cycle.Run(func() error { app.smu.RLock() defer app.smu.RUnlock() + // unregister before graceful stop + e := registry.DefaultRegisterer.UnregisterService(ctx, s.Info()) + if e != nil { + app.logger.Error("exit server", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("graceful stop"), xlog.FieldName(s.Info().Name), xlog.FieldAddr(s.Info().Label()), xlog.FieldErr(err)) + } + app.logger.Info("exit server", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("graceful stop"), xlog.FieldName(s.Info().Name), xlog.FieldAddr(s.Info().Label())) + return s.GracefulStop(ctx) }) }(s) @@ -320,9 +334,10 @@ func (app *Application) GracefulStop(ctx context.Context) (err error) { func (app *Application) waitSignals() { app.logger.Info("init listen signal", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("init")) signals.Shutdown(func(grace bool) { //when get shutdown signal - //todo: support timeout if grace { - _ = app.GracefulStop(context.TODO()) + ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) + defer cancel() + _ = app.GracefulStop(ctx) } else { _ = app.Stop() } @@ -354,13 +369,6 @@ func (app *Application) startServers() error { for _, s := range app.servers { s := s eg.Go(func() (err error) { - defer func() { - ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second) - defer cancel() - _ = registry.DefaultRegisterer.UnregisterService(ctx, s.Info()) - app.logger.Info("exit server", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("exit"), xlog.FieldName(s.Info().Name), xlog.FieldErr(err), xlog.FieldAddr(s.Info().Label())) - }() - time.AfterFunc(time.Second, func() { _ = registry.DefaultRegisterer.RegisterService(ctx, s.Info()) app.logger.Info("start server", xlog.FieldMod(ecode.ModApp), xlog.FieldEvent("init"), xlog.FieldName(s.Info().Name), xlog.FieldAddr(s.Info().Label()), xlog.Any("scheme", s.Info().Scheme))