package app import ( "fmt" "git.hlsq.asia/mmorpg/service-common/discover/common" "git.hlsq.asia/mmorpg/service-common/log" "git.hlsq.asia/mmorpg/service-common/module" "git.hlsq.asia/mmorpg/service-user/config" "git.hlsq.asia/mmorpg/service-user/internal/grpc_server" "github.com/judwhite/go-svc" "sync" ) type Program struct { moduleList []module.Module // 模块列表 } func (p *Program) Init(_ svc.Environment) error { if err := config.LoadConfig(); err != nil { return err } p.moduleList = append(p.moduleList, &module.Base{Log: config.Get().Log}) p.moduleList = append(p.moduleList, &module.DB{Cfg: config.Get().DB, AppName: config.Get().App.Name}) p.moduleList = append(p.moduleList, &module.Grpc{Server: grpc_server.NewServer(config.Get().Serve.Grpc)}) p.moduleList = append(p.moduleList, &module.Prometheus{MetricCfg: config.Get().Metric}) p.moduleList = append(p.moduleList, &module.Tracer{MetricCfg: config.Get().Metric, ServiceName: common.KeyDiscoverServiceNameUser}) p.moduleList = append(p.moduleList, &module.Discover{}) for _, m := range p.moduleList { if err := m.Init(); err != nil { return err } } log.Infof(fmt.Sprintf("%v Init successful...", config.Get().App.Name)) return nil } func (p *Program) Start() error { ready := &sync.WaitGroup{} ready.Add(len(p.moduleList)) for _, m := range p.moduleList { if err := m.Start(ready); err != nil { return err } } ready.Wait() for _, m := range p.moduleList { if err := m.AfterStart(); err != nil { return err } } log.Infof(fmt.Sprintf("%v Start successful...", config.Get().App.Name)) return nil } func (p *Program) Stop() error { for i := len(p.moduleList) - 1; i >= 0; i-- { m := p.moduleList[i] if err := m.Stop(); err != nil { log.Errorf("module stop error: %v", err) } } log.Infof(fmt.Sprintf("%v Stop successful...", config.Get().App.Name)) return nil }