http.go 2.03 KB
package main

import (
	"fmt"
	"math/rand"
	"os"
	"os/signal"
	"pro2d/common"
	"pro2d/common/components"
	"pro2d/common/db/mongoproxy"
	"pro2d/common/db/redisproxy"
	"pro2d/common/etcd"
	"pro2d/common/logger"
	"pro2d/models"
	"syscall"
	"time"
)

type AccountServer struct {
	components.IHttp
	Sconf *common.SConf
}

func NewAccountServer(version string, port ...string) *AccountServer {
	return &AccountServer{IHttp: components.NewHttpServer(version, port...)}
}

func (s *AccountServer) Init(sconf *common.SConf) error {
	s.Sconf = sconf

	//mgo init
	err := mongoproxy.ConnectMongo(sconf.MongoConf, sconf.ID)

	//redis init
	if err = redisproxy.ConnectRedis(sconf.RedisConf.DB, sconf.RedisConf.Auth, sconf.RedisConf.Address); err != nil {
		return err
	}

	//Etcd 初始化
	err = etcd.NewEtcdClient(common.GlobalConf.Etcd)
	if err != nil {
		return err
	}
	etcd.PutWithLeasePrefix(sconf.Name, fmt.Sprintf("%d", sconf.ID), fmt.Sprintf("%s:%d", sconf.IP, sconf.Port), 5)

	models.NewDBSeed(sconf.ID).InitServerDatabase(models.AccountModels())
	models.DBSeedS().InitAutoIncreUidTable(models.AccountModels())
	return nil
}

func (s *AccountServer) TimeOut() {
	models.DBSeedS().SaveAutoincrementTimer(models.AccountModels())

	components.TimeOut(1*time.Second, s.TimeOut)
}

func (s *AccountServer) Start() error {
	if err := s.Init(common.GlobalConf.AccountConf); err != nil {
		return err
	}
	//设置随机种子
	rand.Seed(time.Now().Unix())
	//开始定时器
	s.TimeOut()

	return s.IHttp.Start()
}

func (s *AccountServer) Stop() {
	s.IHttp.Stop()
	etcd.CloseEtcd()
}

func main() {
	err := make(chan error)
	stopChan := make(chan os.Signal)
	signal.Notify(stopChan, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)

	common.GlobalSconf = common.GlobalConf.AccountConf

	web := NewAccountServer("v1", fmt.Sprintf(":%d", common.GlobalSconf.Port))
	web.BindHandler(&AccountAction{HttpServer: web})
	go func() {
		err <- web.Start()
	}()

	select {
	case e := <-err:
		logger.Error("http server error: %v", e)
	case <-stopChan:
		logger.Debug("http stop")
		web.Stop()
	}
}