migu_admin_server/cmd/api/server.go

285 lines
7.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package api
import (
"context"
"fmt"
"github.com/go-admin-team/go-admin-core/sdk/runtime"
"log"
"net/http"
"os"
"os/signal"
"time"
"github.com/gin-gonic/gin"
"github.com/go-admin-team/go-admin-core/config/source/file"
"github.com/go-admin-team/go-admin-core/sdk"
"github.com/go-admin-team/go-admin-core/sdk/api"
"github.com/go-admin-team/go-admin-core/sdk/config"
"github.com/go-admin-team/go-admin-core/sdk/pkg"
"github.com/spf13/cobra"
"github.com/jasonlvhit/gocron"
"go-admin/app/admin/models"
"go-admin/app/admin/router"
"go-admin/app/jobs"
"go-admin/common/database"
"go-admin/common/global"
common "go-admin/common/middleware"
"go-admin/common/middleware/handler"
"go-admin/common/storage"
ext "go-admin/config"
)
var (
configYml string
apiCheck bool
StartCmd = &cobra.Command{
Use: "server",
Short: "Start API server",
Example: "go-admin server -c config/settings.yml",
SilenceUsage: true,
PreRun: func(cmd *cobra.Command, args []string) {
setup()
},
RunE: func(cmd *cobra.Command, args []string) error {
return run()
},
}
)
var AppRouters = make([]func(), 0)
func init() {
StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
StartCmd.PersistentFlags().BoolVarP(&apiCheck, "api", "a", false, "Start server with check api data")
//注册路由 fixme 其他应用的路由在本目录新建文件放在init方法
AppRouters = append(AppRouters, router.InitRouter)
}
func setup() {
// 注入配置扩展项
config.ExtendConfig = &ext.ExtConfig
//1. 读取配置
config.Setup(
file.NewSource(file.WithPath(configYml)),
database.Setup,
storage.Setup,
)
//注册监听函数
queue := sdk.Runtime.GetMemoryQueue("")
queue.Register(global.LoginLog, models.SaveLoginLog)
queue.Register(global.OperateLog, models.SaveOperaLog)
queue.Register(global.ApiCheck, models.SaveSysApi)
go queue.Run()
usageStr := `starting api server...`
log.Println(usageStr)
}
func run() error {
if config.ApplicationConfig.Mode == pkg.ModeProd.String() {
gin.SetMode(gin.ReleaseMode)
}
initRouter()
go func() {
defer func() {
if err := recover(); err != nil {
fmt.Println("err:", err)
}
}()
// TODO
s := gocron.NewScheduler()
if config.ApplicationConfig.Name == "migu_music_admin_server" { // 咪咕音乐
// 咪咕音乐订阅数据检测
err := s.Every(1).Day().At("00:30").Do(models.CheckMusicOrderState)
if err != nil {
fmt.Println("err:", err)
}
} else {
// 每小时更新1次历史汇总数据
err := s.Every(1).Hour().Do(models.UpdateHistoricalSummaryCache)
if err != nil {
fmt.Println("err:", err)
}
// 统一每天定时任务
err = s.Every(1).Day().At("01:30").Do(func() {
if time.Now().Day() == 1 {
// 每月1号的逻辑
fmt.Println("****每月1号 检测未退订 任务延迟到03:30执行****")
} else {
// 其他日期的逻辑
fmt.Println("执行普通每日任务:检测 未退订")
models.CheckAllOrderState()
}
})
if err != nil {
fmt.Println("err:", err)
}
err = s.Every(1).Day().At("02:30").Do(func() {
if time.Now().Day() == 1 {
// 每月1号的逻辑
fmt.Println("****每月1号 检测已退订 任务延迟到04:30执行****")
} else {
// 其他日期的逻辑
fmt.Println("执行普通每日任务:检测 已退订")
models.CheckCancelOrderState()
}
})
if err != nil {
fmt.Println("err:", err)
}
err = s.Every(1).Day().At("03:30").Do(func() {
if time.Now().Day() == 1 {
fmt.Println("****执行每月1号 未退订检测****")
models.CheckAllOrderState()
}
})
if err != nil {
fmt.Println("err:", err)
}
err = s.Every(1).Day().At("04:30").Do(func() {
if time.Now().Day() == 1 {
fmt.Println("****执行每月1号 已退订检测 01****")
models.CheckCancelOrderState()
}
})
if err != nil {
fmt.Println("err:", err)
}
err = s.Every(1).Day().At("05:30").Do(func() {
if time.Now().Day() == 1 {
fmt.Println("****执行每月1号 已退订检测 02****")
models.CheckCancelOrderState()
}
})
if err != nil {
fmt.Println("err:", err)
}
}
//err = s.Every(1).Day().At("09:50").Do(models.CheckOneHourCancelOrderState)
//if err != nil {
// fmt.Println("err:", err)
//}
//err := s.Every(1).Day().At("11:47").Do(models.CheckAllOrderStateBatch)
//if err != nil {
// fmt.Println("err:", err)
//}
<-s.Start()
}()
for _, f := range AppRouters {
f()
}
srv := &http.Server{
Addr: fmt.Sprintf("%s:%d", config.ApplicationConfig.Host, config.ApplicationConfig.Port),
Handler: sdk.Runtime.GetEngine(),
}
go func() {
jobs.InitJob()
jobs.Setup(sdk.Runtime.GetDb())
}()
if apiCheck {
var routers = sdk.Runtime.GetRouter()
q := sdk.Runtime.GetMemoryQueue("")
mp := make(map[string]interface{}, 0)
mp["List"] = routers
message, err := sdk.Runtime.GetStreamMessage("", global.ApiCheck, mp)
if err != nil {
log.Printf("GetStreamMessage error, %s \n", err.Error())
//日志报错错误,不中断请求
} else {
err = q.Append(message)
if err != nil {
log.Printf("Append message error, %s \n", err.Error())
}
}
}
go func() {
// 服务连接
if config.SslConfig.Enable {
if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
log.Fatal("listen: ", err)
}
} else {
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal("listen: ", err)
}
}
}()
fmt.Println(pkg.Red(string(global.LogoContent)))
tip()
fmt.Println(pkg.Green("Server run at:"))
fmt.Printf("- Local: %s://localhost:%d/ \r\n", "http", config.ApplicationConfig.Port)
//fmt.Printf("- Network: %s://%s:%d/ \r\n", pkg.GetLocaHonst(), "http", config.ApplicationConfig.Port)
fmt.Printf("- Network: %s://%s:%d/ \r\n", "http", pkg.GetLocaHonst(), config.ApplicationConfig.Port)
fmt.Println(pkg.Green("Swagger run at:"))
fmt.Printf("- Local: http://localhost:%d/swagger/admin/index.html \r\n", config.ApplicationConfig.Port)
fmt.Printf("- Network: %s://%s:%d/swagger/admin/index.html \r\n", "http", pkg.GetLocaHonst(), config.ApplicationConfig.Port)
fmt.Printf("%s Enter Control + C Shutdown Server \r\n", pkg.GetCurrentTimeStr())
// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
quit := make(chan os.Signal, 1)
signal.Notify(quit, os.Interrupt)
<-quit
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
fmt.Printf("%s Shutdown Server ... \r\n", pkg.GetCurrentTimeStr())
if err := srv.Shutdown(ctx); err != nil {
log.Fatal("Server Shutdown:", err)
}
log.Println("Server exiting")
return nil
}
var Router runtime.Router
func tip() {
usageStr := `欢迎使用 ` + pkg.Green(`go-admin `+global.Version) + ` 可以使用 ` + pkg.Red(`-h`) + ` 查看命令`
fmt.Printf("%s \n\n", usageStr)
}
func initRouter() {
var r *gin.Engine
h := sdk.Runtime.GetEngine()
if h == nil {
h = gin.New()
sdk.Runtime.SetEngine(h)
}
switch h.(type) {
case *gin.Engine:
r = h.(*gin.Engine)
default:
log.Fatal("not support other engine")
//os.Exit(-1)
}
if config.SslConfig.Enable {
r.Use(handler.TlsHandler())
}
//r.Use(middleware.Metrics())
r.Use(common.Sentinel()).
Use(common.RequestId(pkg.TrafficKey)).
Use(api.SetRequestLogger)
common.InitMiddleware(r)
}