diff --git a/plugins/server/grpc/grpc.go b/plugins/server/grpc/grpc.go index ae2609ad..3a040b5c 100644 --- a/plugins/server/grpc/grpc.go +++ b/plugins/server/grpc/grpc.go @@ -889,10 +889,17 @@ func (g *grpcServer) Start() error { } } - // announce self to the world - if err := g.Register(); err != nil { + // use RegisterCheck func before register + if err = g.opts.RegisterCheck(g.opts.Context); err != nil { if logger.V(logger.ErrorLevel, logger.DefaultLogger) { - logger.Errorf("Server register error: %v", err) + logger.Errorf("Server %s-%s register check error: %s", config.Name, config.Id, err) + } + } else { + // announce self to the world + if err := g.Register(); err != nil { + if logger.V(logger.ErrorLevel, logger.DefaultLogger) { + logger.Errorf("Server register error: %v", err) + } } } @@ -925,6 +932,26 @@ func (g *grpcServer) Start() error { select { // register self on interval case <-t.C: + g.RLock() + registered := g.registered + g.RUnlock() + rerr := g.opts.RegisterCheck(g.opts.Context) + if rerr != nil && registered { + if logger.V(logger.ErrorLevel, logger.DefaultLogger) { + logger.Errorf("Server %s-%s register check error: %s, deregister it", config.Name, config.Id, err) + } + // deregister self in case of error + if err := g.Deregister(); err != nil { + if logger.V(logger.ErrorLevel, logger.DefaultLogger) { + logger.Errorf("Server %s-%s deregister error: %s", config.Name, config.Id, err) + } + } + } else if rerr != nil && !registered { + if logger.V(logger.ErrorLevel, logger.DefaultLogger) { + logger.Errorf("Server %s-%s register check error: %s", config.Name, config.Id, err) + } + continue + } if err := g.Register(); err != nil { if logger.V(logger.ErrorLevel, logger.DefaultLogger) { logger.Error("Server register error: ", err) diff --git a/plugins/server/grpc/options.go b/plugins/server/grpc/options.go index ceb76702..544dbcdc 100644 --- a/plugins/server/grpc/options.go +++ b/plugins/server/grpc/options.go @@ -66,15 +66,16 @@ func MaxMsgSize(s int) server.Option { func newOptions(opt ...server.Option) server.Options { opts := server.Options{ - Codecs: make(map[string]codec.NewCodec), - Metadata: map[string]string{}, - Broker: broker.DefaultBroker, - Registry: registry.DefaultRegistry, - Transport: transport.DefaultTransport, - Address: server.DefaultAddress, - Name: server.DefaultName, - Id: server.DefaultId, - Version: server.DefaultVersion, + Codecs: make(map[string]codec.NewCodec), + Metadata: map[string]string{}, + Broker: broker.DefaultBroker, + Registry: registry.DefaultRegistry, + RegisterCheck: server.DefaultRegisterCheck, + Transport: transport.DefaultTransport, + Address: server.DefaultAddress, + Name: server.DefaultName, + Id: server.DefaultId, + Version: server.DefaultVersion, } for _, o := range opt {