|
|
|
|
package web
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"math/rand"
|
|
|
|
|
"net/http"
|
|
|
|
|
"server/call"
|
|
|
|
|
"server/config"
|
|
|
|
|
"server/db"
|
|
|
|
|
edb "server/db/es"
|
|
|
|
|
mdb "server/db/mysql"
|
|
|
|
|
rdb "server/db/redis"
|
|
|
|
|
"server/modules/web/providers/jili2"
|
|
|
|
|
"server/modules/web/routers"
|
|
|
|
|
"server/util"
|
|
|
|
|
"time"
|
|
|
|
|
|
|
|
|
|
"github.com/liangdas/mqant/conf"
|
|
|
|
|
"github.com/liangdas/mqant/log"
|
|
|
|
|
"github.com/liangdas/mqant/module"
|
|
|
|
|
basemodule "github.com/liangdas/mqant/module/base"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var Module = func() module.Module {
|
|
|
|
|
this := new(Web)
|
|
|
|
|
return this
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Web struct {
|
|
|
|
|
basemodule.BaseModule
|
|
|
|
|
// addr string
|
|
|
|
|
|
|
|
|
|
httpSvr *http.Server
|
|
|
|
|
// httpSvr2 *http.Server
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w *Web) GetType() string {
|
|
|
|
|
// 很关键,需要与配置文件中的Module配置对应
|
|
|
|
|
return "web"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w *Web) Version() string {
|
|
|
|
|
// 可以在监控时了解代码版本
|
|
|
|
|
return "1.0.0"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w *Web) OnInit(app module.App, settings *conf.ModuleSettings) {
|
|
|
|
|
w.BaseModule.OnInit(w, app, settings)
|
|
|
|
|
|
|
|
|
|
db.InitDB(&rdb.RedisClient{}, &edb.EsClient{}, &mdb.MysqlClient{})
|
|
|
|
|
log.Info("[%v]module init finish, config:%+v", w.GetType(), config.GetConfig().Web)
|
|
|
|
|
log.Info("[%v]module init finish, base:%+v", w.GetType(), config.GetBase())
|
|
|
|
|
// 自动初始化数据库
|
|
|
|
|
// MigrateDB()
|
|
|
|
|
call.NewCaller(w)
|
|
|
|
|
jili2.GetGameList()
|
|
|
|
|
call.NewSnowflake(int64(config.GetConfig().WorkID))
|
|
|
|
|
|
|
|
|
|
// 创建一个随机数生成器
|
|
|
|
|
rand.Seed(time.Now().UnixNano())
|
|
|
|
|
|
|
|
|
|
// 后台改配置
|
|
|
|
|
if err := loadConfig(); err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
call.InitReload(w.App.Transport())
|
|
|
|
|
if err := call.LoadIpDB(); err != nil {
|
|
|
|
|
log.Error("err:%v", err)
|
|
|
|
|
panic(err)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 拉取缓存数据
|
|
|
|
|
util.Go(func() {
|
|
|
|
|
// FetchDatas()
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (wb *Web) startHttpServer() {
|
|
|
|
|
webcfg := config.GetConfig().Web
|
|
|
|
|
router := routers.SetUpRouter()
|
|
|
|
|
srv := &http.Server{
|
|
|
|
|
Addr: webcfg.Addr,
|
|
|
|
|
Handler: router,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
go func() {
|
|
|
|
|
if config.GetConfig().Web.TLS {
|
|
|
|
|
if err := srv.ListenAndServeTLS(webcfg.CertFile, webcfg.KeyFile); err != nil {
|
|
|
|
|
log.Error("web ListenAndServeTLS fail error:%v", err)
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
if err := srv.ListenAndServe(); err != nil {
|
|
|
|
|
log.Error("web ListenAndServe fail error:%v", err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}()
|
|
|
|
|
// srv2 := &http.Server{
|
|
|
|
|
// Addr: ":80",
|
|
|
|
|
// Handler: router,
|
|
|
|
|
// }
|
|
|
|
|
// go func() {
|
|
|
|
|
// if err := srv2.ListenAndServe(); err != nil {
|
|
|
|
|
// log.Error("web ListenAndServe fail error:%v", err)
|
|
|
|
|
// }
|
|
|
|
|
// }()
|
|
|
|
|
// returning reference so caller can call Shutdown()
|
|
|
|
|
wb.httpSvr = srv
|
|
|
|
|
// wb.httpSvr2 = srv2
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w *Web) Run(closeSig chan bool) {
|
|
|
|
|
log.Info("web: starting HTTP server :%s", config.GetConfig().Web.Addr)
|
|
|
|
|
w.startHttpServer()
|
|
|
|
|
<-closeSig
|
|
|
|
|
log.Info("web: stopping HTTP server")
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (w *Web) OnDestroy() {
|
|
|
|
|
// The context is used to inform the server it has 5 seconds to finish
|
|
|
|
|
// the request it is currently handling
|
|
|
|
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
|
|
// now close the server gracefully ("shutdown")
|
|
|
|
|
// timeout could be given instead of nil as a https://golang.org/pkg/context/
|
|
|
|
|
if err := w.httpSvr.Shutdown(ctx); err != nil {
|
|
|
|
|
log.Error("OnDestroy web Shutdown error:%v", err)
|
|
|
|
|
}
|
|
|
|
|
// if err := w.httpSvr2.Shutdown(ctx); err != nil {
|
|
|
|
|
// log.Error("OnDestroy web Shutdown error:%v", err)
|
|
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
log.Info("web: done. exiting")
|
|
|
|
|
|
|
|
|
|
// 一定别忘了继承
|
|
|
|
|
w.BaseModule.OnDestroy()
|
|
|
|
|
|
|
|
|
|
log.Info("web 模块已销毁")
|
|
|
|
|
}
|