Initial commit
This commit is contained in:
@@ -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)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user