gitee.com/h79/goutils@v1.22.10/discovery/local/service.go (about) 1 package local 2 3 import ( 4 "gitee.com/h79/goutils/common/logger" 5 "gitee.com/h79/goutils/common/result" 6 "gitee.com/h79/goutils/common/system" 7 "gitee.com/h79/goutils/discovery/config" 8 "gitee.com/h79/goutils/discovery/registry" 9 "gitee.com/h79/goutils/discovery/service" 10 "time" 11 ) 12 13 var _ service.Service = (*defaultService)(nil) 14 15 type defaultService struct { 16 conf config.Config 17 endPoints config.EndPoints 18 registry registry.Registry 19 stop chan bool 20 } 21 22 // NewService 23 // 注册一个服务 24 func NewService(conf config.Config, points config.EndPoints, reg registry.Registry) (service.Service, error) { 25 26 logger.Info("def.service: register service") 27 28 return &defaultService{ 29 conf: conf, 30 endPoints: points, 31 registry: reg, 32 stop: make(chan bool), 33 }, nil 34 } 35 36 func (s *defaultService) Start() error { 37 if s.conf.Check.Ttl { 38 system.ChildRunning(s.keepAlive) 39 } 40 return s.register() 41 } 42 43 func (s *defaultService) Stop() { 44 if s.conf.Check.Ttl { 45 system.Stop(time.Second, s.stop) 46 } 47 _ = s.revoke() 48 } 49 50 func (s *defaultService) Set(data service.Data) error { 51 return result.RErrNotSupport 52 } 53 54 func (s *defaultService) Get(key service.Key) ([]*service.Data, error) { 55 return nil, result.RErrNotSupport 56 } 57 58 func (s *defaultService) keepAlive() { 59 ticker := time.NewTicker(time.Second * s.conf.Check.Interval) 60 defer ticker.Stop() 61 for { 62 select { 63 case <-ticker.C: 64 _ = s.register() 65 66 case <-s.stop: 67 _ = s.revoke() 68 s.stop <- true 69 return 70 71 case <-system.Closed(): 72 logger.Warn("def.service: server stop because system close") 73 _ = s.revoke() 74 return 75 } 76 } 77 } 78 79 func (s *defaultService) register() error { 80 if s.registry == nil { 81 return nil 82 } 83 err := s.registry.Register(&s.conf.Service, s.endPoints) 84 if err != nil { 85 logger.Error("def.service: register err= %v", err) 86 } 87 return err 88 } 89 90 // 撤销 91 func (s *defaultService) revoke() error { 92 if s.registry == nil { 93 return nil 94 } 95 err := s.registry.Deregister(&s.conf.Service, s.endPoints) 96 if err != nil { 97 logger.Error("def.service: deregister err= %v", err) 98 } 99 return err 100 }