Initial commit

This commit is contained in:
2026-05-20 16:13:58 +08:00
commit ceffbe382e
500 changed files with 157469 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
package server
// import (
// "context"
// "fmt"
// "stat/common/kafka"
// "stat/service/consumer"
// "stat/statg"
// "github.com/Shopify/sarama"
// )
// var topicList = []string{
// "user_access",
// "user_register",
// "user_recharge",
// "user_withdraw",
// }
// type consumerGroupHandler struct{}
// func (consumerGroupHandler) Setup(_ sarama.ConsumerGroupSession) error { return nil }
// func (consumerGroupHandler) Cleanup(_ sarama.ConsumerGroupSession) error { return nil }
// func (h consumerGroupHandler) ConsumeClaim(sess sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {
// for msg := range claim.Messages() {
// // 消息处理
// switch msg.Topic {
// case "user_access":
// consumer.UserAccessHandler(msg)
// case "user_register":
// consumer.UserRegisterHandler(msg)
// case "user_recharge":
// consumer.UserReChargeHandler(msg)
// case "user_withdraw":
// consumer.UserWithdrawOrder(msg)
// }
// // 标记该消息已处理
// sess.MarkMessage(msg, "")
// }
// return nil
// }
// func runConsumer() {
// group := kafka.InitKafkaConsumerGroup([]string{statg.Conf.Kafka.Url}, statg.Conf.Kafka.Group)
// defer func() { _ = group.Close() }()
// // Track errors
// go func() {
// for err := range group.Errors() {
// fmt.Println("ERROR", err)
// }
// }()
// // Iterate over consumer sessions.
// ctx := context.Background()
// for {
// handler := consumerGroupHandler{}
// // `Consume` should be called inside an infinite loop, when a
// // server-side rebalance happens, the consumer session will need to be
// // recreated to get the new claims
// err := group.Consume(ctx, topicList, handler)
// if err != nil {
// panic(err)
// }
// }
// }
+151
View File
@@ -0,0 +1,151 @@
package server
import (
"fmt"
"net/http"
"os"
"os/signal"
"stat/common/enum/consts"
"stat/common/genId"
"stat/common/log"
"stat/common/mongos"
"stat/common/redis"
"stat/models"
"stat/router"
"stat/service/botser"
"stat/service/cacheSer"
"stat/service/consumer"
"stat/service/domainser"
"stat/service/versionSer"
"stat/skd"
"stat/statg"
"syscall"
"time"
"github.com/dchest/captcha"
)
func init() {
time.Local, _ = time.LoadLocation("Asia/Shanghai")
}
func Run(args []string) {
// 初始化配置文件
if err := initConfig(); err != nil {
os.Exit(1)
return
}
// 初始化数据库
if err := initMongoDB(); err != nil {
os.Exit(1)
return
}
// 初始化redis
if err := initRedis(); err != nil {
os.Exit(1)
return
}
// 图片验证器
statg.VerifyIMGStore = captcha.NewMemoryStore(captcha.CollectNum, captcha.Expiration)
// 自增id
genId.Start()
// 初始化缓存
cacheSer.Init()
// 测试模式不启用定时任务及同步
if statg.Conf.RunMod == consts.RunModRelease || statg.Conf.RunMod == consts.RunModeDev {
// 机器人初始化
statg.InitBot()
// 启动机器人
botser.StartBot()
}
if statg.Conf.RunMod == consts.RunModRelease {
// LandPage
versionSer.Init()
// Domain Check
domainser.Start()
// 定时任务
skd.Start()
// APP同步数据
go consumer.SyncInit()
}
// web服务器
initHttpServer()
// 资源释放
waitQuit()
}
func initConfig() error {
return statg.LoadConfig("conf/server.json")
}
func initMongoDB() error {
mgoDB := mongos.NewManager(statg.Conf.Mongo.Url)
if err := mgoDB.Connect(); err != nil {
log.Error("mgoDB connect err", log.E(err))
return err
}
mongos.MgoManager = mgoDB
// 初始化数据库索引
models.InitIndex()
return nil
}
func initRedis() error {
rds, err := redis.NewManagerWithUrl(statg.Conf.Redis.Url, nil)
if err != nil {
log.Error("rds init err", log.E(err))
return err
}
redis.StatRds = rds
return nil
}
func initHttpServer() {
addr := fmt.Sprintf(":%d", statg.Conf.Port)
srv := &http.Server{
Addr: addr,
ReadTimeout: 30 * time.Second,
WriteTimeout: 90 * time.Second,
IdleTimeout: 120 * time.Second,
Handler: router.SetupGin(),
}
go func() {
log.Info("服务已启动", log.Any("地址", addr), log.Any("模式", statg.Conf.RunMod))
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatal("listen:", log.E(err))
}
}()
}
func waitQuit() {
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Warn("Shutdown... server")
botser.SaveServerNormalCloseFlag()
done := make(chan int)
go Shutdown(done)
select {
case <-time.After(5 * time.Second):
log.Warn("shutdown timeout....")
case <-done:
log.Info("graceful shutdown")
}
}
func Shutdown(done chan int) {
cacheSer.SyncWriters()
if mongos.MgoManager != nil {
mongos.MgoManager.DisConnect()
}
if redis.StatRds != nil {
redis.StatRds.Close()
}
close(done)
}