Files
gb28181/cmd/server/main.go
T
2025-01-20 19:26:50 +08:00

117 lines
3.1 KiB
Go

package main
import (
"expvar"
"flag"
"fmt"
"log/slog"
"os"
"os/signal"
"path/filepath"
"strconv"
"syscall"
"time"
"github.com/gowvp/gb28181/internal/conf"
"github.com/ixugo/goweb/pkg/logger"
"github.com/ixugo/goweb/pkg/server"
"github.com/ixugo/goweb/pkg/system"
)
var (
buildVersion = "0.0.1" // 构建版本号
gitBranch = "dev" // git 分支
gitHash = "debug" // git 提交点哈希值
release string // 发布模式 true/false
buildTime string // 构建时间戳
)
// 自定义配置目录
var configDir = flag.String("conf", "./configs", "config directory, eg: -conf /configs/")
func getBuildRelease() bool {
v, _ := strconv.ParseBool(release)
return v
}
func main() {
flag.Parse()
// 以可执行文件所在目录为工作目录,防止以服务方式运行时,工作目录切换到其它位置
bin, _ := os.Executable()
if err := os.Chdir(filepath.Dir(bin)); err != nil {
slog.Error("change dir error")
}
// 初始化配置
var bc conf.Bootstrap
// 获取配置目录绝对路径
filedir, _ := abs(*configDir)
filePath := filepath.Join(filedir, "config.toml")
if err := conf.SetupConfig(&bc, filePath); err != nil {
panic(err)
}
bc.Debug = !getBuildRelease()
bc.BuildVersion = buildVersion
// 初始化日志
logDir := filepath.Join(system.Getwd(), bc.Log.Dir)
log, clean := logger.SetupSlog(logger.Config{
Dir: logDir, // 日志地址
Debug: bc.Debug, // 服务级别Debug/Release
MaxAge: bc.Log.MaxAge.Duration(), // 日志存储时间
RotationTime: bc.Log.RotationTime.Duration(), // 循环时间
RotationSize: bc.Log.RotationSize * 1024 * 1024, // 循环大小
Level: bc.Log.Level, // 日志级别
})
{
expvar.NewString("version").Set(buildVersion)
expvar.NewString("git_branch").Set(gitBranch)
expvar.NewString("git_hash").Set(gitHash)
expvar.NewString("build_time").Set(buildTime)
expvar.Publish("timestamp", expvar.Func(func() any {
return time.Now().Format(time.DateTime)
}))
}
handler, cleanUp, err := wireApp(&bc, log)
if err != nil {
slog.Error("程序构建失败", "err", err)
panic(err)
}
defer cleanUp()
svc := server.New(handler,
server.Port(strconv.Itoa(bc.Server.HTTP.Port)),
server.ReadTimeout(bc.Server.HTTP.Timeout.Duration()),
server.WriteTimeout(bc.Server.HTTP.Timeout.Duration()),
)
go svc.Start()
interrupt := make(chan os.Signal, 1)
signal.Notify(interrupt, syscall.SIGINT, syscall.SIGTERM)
fmt.Println("服务启动成功 port:", bc.Server.HTTP.Port)
select {
case s := <-interrupt:
slog.Info(`<-interrupt`, "signal", s.String())
case err := <-svc.Notify():
system.ErrPrintf("err: %s\n", err.Error())
slog.Error(`<-server.Notify()`, "err", err)
}
if err := svc.Shutdown(); err != nil {
slog.Error(`server.Shutdown()`, "err", err)
}
defer clean()
}
func abs(path string) (string, error) {
if filepath.IsAbs(path) {
return filepath.Clean(path), nil
}
bin, err := os.Executable()
if err != nil {
return "", err
}
return filepath.Join(filepath.Dir(bin), path), nil
}