| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142 |
- package api
- import (
- "context"
- "device-manage/app/admin/models/busmodels"
- "device-manage/app/admin/router"
- "fmt"
- "io/ioutil"
- "net/http"
- "os"
- "os/signal"
- "time"
- "github.com/gin-gonic/gin"
- "github.com/spf13/cobra"
- "github.com/spf13/viper"
- "device-manage/app/jobs"
- "device-manage/common/database"
- "device-manage/common/global"
- "device-manage/common/mqttcli"
- mycasbin "device-manage/pkg/casbin"
- "device-manage/pkg/logger"
- "device-manage/tools"
- "device-manage/tools/config"
- )
- var (
- configYml string
- port string
- mode string
- StartCmd = &cobra.Command{
- Use: "server",
- Short: "Start API server",
- Example: "device-manage server -c config/settings.yml",
- SilenceUsage: true,
- PreRun: func(cmd *cobra.Command, args []string) {
- setup()
- },
- RunE: func(cmd *cobra.Command, args []string) error {
- return run()
- },
- }
- )
- var AppRouters = make([]func(), 0)
- func init() {
- StartCmd.PersistentFlags().StringVarP(&configYml, "config", "c", "config/settings.yml", "Start server with provided configuration file")
- StartCmd.PersistentFlags().StringVarP(&port, "port", "p", "8000", "Tcp port server listening on")
- StartCmd.PersistentFlags().StringVarP(&mode, "mode", "m", "dev", "server mode ; eg:dev,test,prod")
- //注册路由 fixme 其他应用的路由,在本目录新建文件放在init方法
- AppRouters = append(AppRouters, router.InitRouter)
- }
- func setup() {
- //1. 读取配置
- config.Setup(configYml)
- //2. 设置日志
- logger.Setup()
- //3. 初始化数据库链接
- database.Setup(config.DatabaseConfig.Driver)
- //4. 接口访问控制加载
- mycasbin.Setup()
- //5. 使用cache 缓存
- busmodels.MediaCacheSetup()
- busmodels.DeviceTimerSetup()
- //6. mqtt server
- mqttcli.MqttSetup()
- usageStr := `starting api server`
- global.Logger.Info(usageStr)
- }
- func run() error {
- if viper.GetString("settings.application.mode") == string(tools.ModeProd) {
- gin.SetMode(gin.ReleaseMode)
- }
- engine := global.Cfg.GetEngine()
- if engine == nil {
- engine = gin.New()
- }
- for _, f := range AppRouters {
- f()
- }
- srv := &http.Server{
- Addr: config.ApplicationConfig.Host + ":" + config.ApplicationConfig.Port,
- Handler: global.Cfg.GetEngine(),
- }
- go func() {
- jobs.InitJob()
- jobs.Setup()
- }()
- go func() {
- // 服务连接
- if config.SslConfig.Enable {
- if err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && err != http.ErrServerClosed {
- global.Logger.Fatal("listen: ", err)
- }
- } else {
- if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
- global.Logger.Fatal("listen: ", err)
- }
- }
- }()
- content, _ := ioutil.ReadFile("./static/device-manage.txt")
- fmt.Println(tools.Red(string(content)))
- tip()
- fmt.Println(tools.Green("Server run at:"))
- fmt.Printf("- Local: http://localhost:%s/ \r\n", config.ApplicationConfig.Port)
- fmt.Printf("- Network: http://%s:%s/ \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
- fmt.Println(tools.Green("Swagger run at:"))
- fmt.Printf("- Local: http://localhost:%s/swagger/index.html \r\n", config.ApplicationConfig.Port)
- fmt.Printf("- Network: http://%s:%s/swagger/index.html \r\n", tools.GetLocaHonst(), config.ApplicationConfig.Port)
- fmt.Printf("%s Enter Control + C Shutdown Server \r\n", tools.GetCurrentTimeStr())
- // 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
- quit := make(chan os.Signal)
- signal.Notify(quit, os.Interrupt)
- <-quit
- fmt.Printf("%s Shutdown Server ... \r\n", tools.GetCurrentTimeStr())
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
- defer cancel()
- if err := srv.Shutdown(ctx); err != nil {
- global.Logger.Fatal("Server Shutdown:", err)
- }
- global.Logger.Println("Server exiting")
- return nil
- }
- func tip() {
- usageStr := `欢迎使用 ` + tools.Green(`device-manage `+global.Version) + ` 可以使用 ` + tools.Red(`-h`) + ` 查看命令`
- fmt.Printf("%s \n\n", usageStr)
- }
|