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  }