2025-02-19 14:23:58 +08:00
|
|
|
package server
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"log/slog"
|
|
|
|
|
"os"
|
2025-02-25 14:48:50 +08:00
|
|
|
"proxy-server/server/fwd"
|
|
|
|
|
"proxy-server/server/pkg/env"
|
|
|
|
|
"proxy-server/server/pkg/orm"
|
2025-02-19 14:23:58 +08:00
|
|
|
"proxy-server/server/web"
|
2025-02-25 14:48:50 +08:00
|
|
|
|
|
|
|
|
"github.com/joho/godotenv"
|
|
|
|
|
"github.com/lmittmann/tint"
|
|
|
|
|
"github.com/mattn/go-colorable"
|
2025-02-19 14:23:58 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Start() {
|
2025-02-25 14:48:50 +08:00
|
|
|
|
|
|
|
|
// 初始化
|
|
|
|
|
initLog()
|
|
|
|
|
env.Init()
|
|
|
|
|
orm.Init()
|
|
|
|
|
|
|
|
|
|
// 启动代理服务
|
|
|
|
|
fwd.New(nil).Run(context.Background(), make(chan error))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func initLog() {
|
|
|
|
|
slog.SetLogLoggerLevel(slog.LevelDebug)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func Start2() {
|
2025-02-19 14:23:58 +08:00
|
|
|
defer func() {
|
|
|
|
|
err := recover()
|
|
|
|
|
if err != nil {
|
|
|
|
|
slog.Error("服务由于意外的 panic 导致退出", err)
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
ctx := context.Background()
|
|
|
|
|
|
|
|
|
|
// 初始化环境变量
|
|
|
|
|
err := godotenv.Load()
|
|
|
|
|
if err != nil {
|
|
|
|
|
slog.Debug("没有本地环境变量文件")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 配置日志
|
|
|
|
|
writer := colorable.NewColorable(os.Stdout)
|
|
|
|
|
logger := slog.New(tint.NewHandler(writer, &tint.Options{
|
|
|
|
|
Level: slog.LevelDebug,
|
|
|
|
|
ReplaceAttr: func(_ []string, attr slog.Attr) slog.Attr {
|
|
|
|
|
err, ok := attr.Value.Any().(error)
|
|
|
|
|
if !ok {
|
|
|
|
|
return attr
|
|
|
|
|
}
|
|
|
|
|
return tint.Err(err)
|
|
|
|
|
},
|
|
|
|
|
}))
|
|
|
|
|
slog.SetDefault(logger)
|
|
|
|
|
|
|
|
|
|
// 初始化公共组件
|
|
|
|
|
orm.Init()
|
|
|
|
|
|
|
|
|
|
// 启动子服务
|
|
|
|
|
goCount := 1
|
|
|
|
|
errChan := make(chan error, goCount)
|
|
|
|
|
ctxC, cancel := context.WithCancel(ctx)
|
|
|
|
|
defer cancel()
|
|
|
|
|
|
|
|
|
|
go web.Start(ctxC, errChan)
|
2025-02-25 14:48:50 +08:00
|
|
|
// go monitor.Start2(ctxC, errChan)
|
2025-02-19 14:23:58 +08:00
|
|
|
slog.Info("服务启动成功")
|
|
|
|
|
|
|
|
|
|
// 监听异常
|
|
|
|
|
well := true
|
|
|
|
|
for i := 0; i < goCount; i++ {
|
|
|
|
|
err := <-errChan
|
|
|
|
|
if err != nil {
|
|
|
|
|
slog.Error("服务异常退出", err)
|
|
|
|
|
if well { // 第一次出错时取消其他服务
|
|
|
|
|
well = false
|
|
|
|
|
cancel()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
close(errChan)
|
|
|
|
|
slog.Info("服务已全部退出")
|
|
|
|
|
}
|