github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/internal/server/core/web/index.go (about) 1 package web 2 3 import ( 4 stdContext "context" 5 "fmt" 6 "strconv" 7 "sync" 8 "time" 9 10 consts "github.com/easysoft/zendata/internal/pkg/const" 11 "github.com/easysoft/zendata/internal/server" 12 "github.com/easysoft/zendata/internal/server/core/module" 13 i118Utils "github.com/easysoft/zendata/pkg/utils/i118" 14 logUtils "github.com/easysoft/zendata/pkg/utils/log" 15 "github.com/easysoft/zendata/pkg/utils/vari" 16 "github.com/facebookgo/inject" 17 "github.com/fatih/color" 18 19 "github.com/kataras/iris/v12/context" 20 21 "github.com/kataras/iris/v12" 22 "github.com/kataras/iris/v12/mvc" 23 ) 24 25 type WebServer struct { 26 app *iris.Application 27 modules []module.WebModule 28 idleConnsClosed chan struct{} 29 addr string 30 timeFormat string 31 globalMiddlewares []context.Handler 32 wg sync.WaitGroup 33 } 34 35 // Init 初始化web服务 36 func Init() *WebServer { 37 app := iris.New() 38 39 level := "info" 40 if vari.Verbose { 41 level = "debug" 42 } 43 app.Logger().SetLevel(level) 44 45 idleConnClosed := make(chan struct{}) 46 iris.RegisterOnInterrupt(func() { //优雅退出 47 timeout := 10 * time.Second 48 ctx, cancel := stdContext.WithTimeout(stdContext.Background(), timeout) 49 defer cancel() 50 app.Shutdown(ctx) // close all hosts 51 close(idleConnClosed) 52 }) 53 54 mvc.New(app) 55 56 addr := fmt.Sprintf(":%d", vari.Port) 57 58 webServer := &WebServer{ 59 app: app, 60 addr: addr, 61 timeFormat: "2006-01-02 15:04:05", 62 idleConnsClosed: idleConnClosed, 63 globalMiddlewares: []context.Handler{}, 64 } 65 66 injectModule(webServer) 67 68 return webServer 69 } 70 71 func injectModule(ws *WebServer) { 72 var g inject.Graph 73 74 indexModule := server.NewIndexModule() 75 76 // inject objects 77 if err := g.Provide( 78 &inject.Object{Value: vari.DB}, 79 &inject.Object{Value: indexModule}, 80 ); err != nil { 81 panic(fmt.Sprintf("provide usecase objects to the Graph: %v", err)) 82 } 83 err := g.Populate() 84 if err != nil { 85 panic(fmt.Sprintf("populate the incomplete Objects: %v", err)) 86 } 87 88 ws.AddModule(indexModule.Party()) 89 ws.AddModule(indexModule.PartyData()) 90 ws.AddModule(indexModule.PartyMock()) 91 92 logUtils.PrintTo("start server") 93 } 94 95 // GetAddr 获取web服务地址 96 func (webServer *WebServer) GetAddr() string { 97 return webServer.addr 98 } 99 100 // AddModule 添加模块 101 func (webServer *WebServer) AddModule(module ...module.WebModule) { 102 webServer.modules = append(webServer.modules, module...) 103 } 104 105 // GetModules 获取模块 106 func (webServer *WebServer) GetModules() []module.WebModule { 107 return webServer.modules 108 } 109 110 // Run 启动web服务 111 func (webServer *WebServer) Run() { 112 webServer.app.UseGlobal(webServer.globalMiddlewares...) 113 err := webServer.InitRouter() 114 if err != nil { 115 panic(fmt.Sprintf("初始化路由错误: %v", err)) 116 } 117 118 port := strconv.Itoa(vari.Port) 119 logUtils.PrintToWithColor(i118Utils.I118Prt.Sprintf("start_server", 120 consts.Localhost, port, consts.Localhost, port), color.FgCyan) 121 122 webServer.app.Listen( 123 webServer.addr, 124 iris.WithoutInterruptHandler, 125 iris.WithoutServerError(iris.ErrServerClosed), 126 iris.WithOptimizations, 127 iris.WithTimeFormat(webServer.timeFormat), 128 ) 129 130 <-webServer.idleConnsClosed 131 }