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  }