feat app 模块化启动

This commit is contained in:
2025-12-13 18:22:35 +08:00
parent 71d4e593c7
commit bc656247c9
41 changed files with 730 additions and 253 deletions

View File

@@ -1,81 +1,60 @@
package app
import (
"common/db/etcd"
"common/discover"
"common/log"
"common/net/grpc/service"
"common/net/socket/websocket"
"fmt"
"gateway/config"
"gateway/grpc_server/server"
"github.com/gin-gonic/gin"
"github.com/judwhite/go-svc"
"runtime/debug"
"sync"
)
type Program struct {
wg *sync.WaitGroup
server service.IService // grpc服务
webServer *gin.Engine // web服务
wsServer *websocket.WSServer // websocket服务
stop chan bool
moduleList []Module // 模块列表
}
type Module interface {
Init() error
Start() error
Stop() error
}
func (p *Program) Init(_ svc.Environment) error {
if err := p.initBase(); err != nil {
return err
}
cfg := config.Get()
log.Infof(fmt.Sprintf("%v starting...", cfg.App.Name))
if err := p.initDB(cfg); err != nil {
return err
}
if err := p.initWebServer(cfg); err != nil {
return err
}
if err := p.initWsServer(cfg); err != nil {
return err
p.moduleList = append(p.moduleList, &ModuleBase{})
p.moduleList = append(p.moduleList, &ModuleDB{})
p.moduleList = append(p.moduleList, &ModuleWebServer{})
p.moduleList = append(p.moduleList, &ModuleWebsocketServer{})
p.moduleList = append(p.moduleList, &ModuleGrpcServer{})
for _, module := range p.moduleList {
if err := module.Init(); err != nil {
return err
}
}
log.Infof(fmt.Sprintf("%v Init successful...", config.Get().App.Name))
return nil
}
func (p *Program) Start() error {
defer func() {
if err := recover(); err != nil {
fmt.Printf("Start err: %v", err)
debug.PrintStack()
_ = p.Stop()
for _, module := range p.moduleList {
if err := module.Start(); err != nil {
return err
}
}()
}
discover.Listen()
p.server = server.NewServer(config.Get().Serve.Grpc.TTL)
p.server.Init(config.Get().Serve.Grpc.Address, config.Get().Serve.Grpc.Port)
go func() {
cfg := config.Get()
_ = p.wsServer.Run(
log.GetLogger().Named("gnet"),
fmt.Sprintf("tcp4://0.0.0.0:%v", cfg.Serve.Socket.Web.Port),
true, true, false, false, true, 8,
)
}()
log.Infof(fmt.Sprintf("%v Start successful...", config.Get().App.Name))
return nil
}
func (p *Program) Stop() error {
defer func() {
if err := recover(); err != nil {
fmt.Printf("Stop err: %v", err)
debug.PrintStack()
}
}()
discover.Close()
p.server.Close()
_ = etcd.Close()
for i := len(p.moduleList) - 1; i >= 0; i-- {
module := p.moduleList[i]
if err := module.Stop(); err != nil {
log.Errorf("module stop error: %v", err)
}
}
log.Infof(fmt.Sprintf("%v Stop successful...", config.Get().App.Name))
return nil
}

View File

@@ -7,7 +7,11 @@ import (
"math/rand"
)
func (p *Program) initBase() error {
// ModuleBase 基础模块,或者一些零散的模块
type ModuleBase struct {
}
func (p *ModuleBase) Init() error {
// 配置
if err := config.LoadConfig(); err != nil {
return err
@@ -17,6 +21,13 @@ func (p *Program) initBase() error {
log.Init(cfg.Log.Debug, cfg.Log.MaxSize, cfg.Log.MaxBackups, cfg.Log.MaxAge, cfg.Log.Level)
// 雪花
utils.InitSnowflake(int64(rand.Intn(1000)))
return nil
}
func (p *ModuleBase) Start() error {
return nil
}
func (p *ModuleBase) Stop() error {
return nil
}

View File

@@ -2,10 +2,16 @@ package app
import (
"common/db/etcd"
"common/log"
"gateway/config"
)
func (p *Program) initDB(cfg *config.Config) error {
// ModuleDB 数据库模块
type ModuleDB struct {
}
func (p *ModuleDB) Init() error {
cfg := config.Get()
// ETCD
if err := etcd.Init(cfg.DB.Etcd.Address); err != nil {
return err
@@ -13,8 +19,13 @@ func (p *Program) initDB(cfg *config.Config) error {
return nil
}
func (p *Program) stopDB() error {
_ = etcd.Close()
func (p *ModuleDB) Start() error {
return nil
}
func (p *ModuleDB) Stop() error {
if err := etcd.Close(); err != nil {
log.Errorf("close etcd failed: %v", err)
}
return nil
}

View File

@@ -0,0 +1,27 @@
package app
import (
"common/net/grpc/service"
"gateway/config"
"gateway/grpc_server/server"
)
// ModuleGrpcServer Grpc服务模块
type ModuleGrpcServer struct {
server service.IService
}
func (m *ModuleGrpcServer) Init() error {
return nil
}
func (m *ModuleGrpcServer) Start() error {
m.server = server.NewServer(config.Get().Serve.Grpc.TTL)
m.server.Init(config.Get().Serve.Grpc.Address, config.Get().Serve.Grpc.Port)
return nil
}
func (m *ModuleGrpcServer) Stop() error {
m.server.Close()
return nil
}

View File

@@ -1,16 +1,49 @@
package app
import (
"common/log"
"errors"
"fmt"
"gateway/config"
"gateway/net/http_gateway"
"github.com/gin-gonic/gin"
"net/http"
"sync"
)
func (p *Program) initWebServer(cfg *config.Config) error {
p.webServer = http_gateway.InitRouter(cfg)
// ModuleWebServer Web服务模块
type ModuleWebServer struct {
wg *sync.WaitGroup
server *http.Server
router *gin.Engine
}
func (m *ModuleWebServer) Init() error {
m.wg = &sync.WaitGroup{}
m.router = http_gateway.InitRouter(config.Get())
return nil
}
func (p *Program) stopWebServer() error {
func (m *ModuleWebServer) Start() error {
m.wg.Add(1)
go func() {
defer m.wg.Done()
m.server = &http.Server{
Addr: fmt.Sprintf("%v:%v", config.Get().Serve.Http.Address, config.Get().Serve.Http.Port),
Handler: m.router,
}
if err := m.server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Errorf("http server failed: %v", err.Error())
}
log.Infof("http server stop.")
}()
return nil
}
func (m *ModuleWebServer) Stop() error {
if err := m.server.Close(); err != nil {
log.Errorf("stop http server failed: %v", err)
}
m.wg.Wait()
return nil
}

View File

@@ -3,37 +3,51 @@ package app
import (
"common/log"
"common/net/socket/websocket"
"fmt"
"gateway/config"
"gateway/net/ws_gateway"
"sync"
"time"
)
func (p *Program) initWsServer(cfg *config.Config) error {
//p.wsServer = websocket.NewWSServer(
// &ws_gateway.GatewayWsServer{
// Decoder: &ws_gateway.Decoder{},
// },
// log.GetLogger(),
// fmt.Sprintf("tcp4://%v:%d", cfg.SocketServer.Host, cfg.SocketServer.Port),
// true,
// true,
// false,
// false,
// true,
// 8,
// 5*time.Second,
//)
p.wsServer = websocket.NewWSServer(
// ModuleWebsocketServer Websocket服务模块
type ModuleWebsocketServer struct {
wg *sync.WaitGroup
server *websocket.WSServer
}
func (m *ModuleWebsocketServer) Init() error {
m.wg = &sync.WaitGroup{}
m.server = websocket.NewWSServer(
&ws_gateway.GatewayWsServer{},
log.GetLogger().Named("ws_server"),
5*time.Second,
)
return nil
}
func (p *Program) stopWsServer() error {
_ = p.wsServer.Stop()
func (m *ModuleWebsocketServer) Start() error {
m.wg.Add(1)
go func() {
defer m.wg.Done()
_ = m.server.Run(
log.GetLogger().Named("GNET"),
fmt.Sprintf("tcp4://0.0.0.0:%v", config.Get().Serve.Socket.Web.Port),
true,
true,
false,
false,
true,
8,
)
}()
return nil
}
func (m *ModuleWebsocketServer) Stop() error {
if err := m.server.Stop(); err != nil {
log.Errorf("stop websocket server failed: %v", err)
}
m.wg.Wait()
return nil
}