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-qgdzs/config" "git.hlsq.asia/mmorpg/service-qgdzs/internal/grpc_server" "github.com/judwhite/go-svc" "sync" ) type Program struct { moduleList []module.Module // 模块列表 } func (p *Program) Init(_ svc.Environment) error { base := &ModuleBase{} if err := base.Init(); err != nil { return err } p.moduleList = append(p.moduleList, base) p.moduleList = append(p.moduleList, (&module.DB{}).Bind(config.Get().DB)) p.moduleList = append(p.moduleList, (&module.Grpc{}).Bind(grpc_server.NewServer(config.Get().Serve.Grpc))) p.moduleList = append(p.moduleList, &ModuleTimer{}) p.moduleList = append(p.moduleList, (&module.Prometheus{}).Bind(config.Get().Metric)) p.moduleList = append(p.moduleList, (&module.Tracer{}).Bind(config.Get().Metric, common.KeyDiscoverServiceNameQgdzs)) p.moduleList = append(p.moduleList, &module.Discover{}) for i, m := range p.moduleList { if i == 0 { continue } 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 }