router.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package router
  2. import (
  3. "context"
  4. "fmt"
  5. "log"
  6. "net/http"
  7. "os"
  8. "os/signal"
  9. "syscall"
  10. "time"
  11. "bet24.com/servers/micros/audioroom/callback"
  12. "bet24.com/servers/micros/audioroom/config"
  13. "bet24.com/servers/micros/audioroom/middleware"
  14. "github.com/gin-gonic/gin"
  15. "github.com/mattn/go-colorable"
  16. )
  17. func Run() {
  18. // 强制日志颜色化
  19. gin.ForceConsoleColor()
  20. // 设置颜色输出,识别 console 色值
  21. gin.DefaultWriter = colorable.NewColorableStdout()
  22. // 设置日志模式
  23. gin.SetMode(gin.DebugMode)
  24. // 创建一个默认的路由
  25. r := gin.Default()
  26. r.Use(middleware.CheckValid(), middleware.Cors())
  27. // 创建一个默认的路由(HTTPS)
  28. rTls := gin.Default()
  29. rTls.Use(middleware.TlsHandler(), middleware.CheckValid(), middleware.Cors()) // 处理SSL的中间件
  30. // 回调处理
  31. callbackTls := rTls.Group("/callback")
  32. {
  33. // 房间创建
  34. callbackTls.POST("/createRoom", callback.CreateRoom)
  35. // 房间创建
  36. callbackTls.GET("/createRoom", callback.CreateRoom)
  37. // 登录房间
  38. callbackTls.POST("/loginRoom", callback.LoginRoom)
  39. // 登录房间
  40. callbackTls.GET("/loginRoom", callback.LoginRoom)
  41. // 退出房间
  42. callbackTls.POST("/logoutRoom", callback.LogoutRoom)
  43. // 退出房间
  44. callbackTls.GET("/logoutRoom", callback.LogoutRoom)
  45. // 流创建回调(上麦)
  46. callbackTls.POST("/streamCreate", callback.StreamCreate)
  47. // 流创建回调(上麦)
  48. callbackTls.GET("/streamCreate", callback.StreamCreate)
  49. // 流关闭回调(下麦)
  50. callbackTls.POST("/streamClose", callback.StreamClose)
  51. // 流关闭回调(下麦)
  52. callbackTls.GET("/streamClose", callback.StreamClose)
  53. }
  54. // ------------------------------404错误------------------------------
  55. // 404错误
  56. r.NoRoute(callback.NotFoundRoute)
  57. r.NoMethod(callback.NotFoundMethod)
  58. // 启动HTTPS服务(gin默认启动服务)
  59. go rTls.RunTLS(fmt.Sprintf(":%d", config.Server.TlsPort), config.Server.TlsCert, config.Server.TlsKey)
  60. // 启动HTTP服务(gin默认启动服务)
  61. r.Run(fmt.Sprintf(":%d", config.Server.WebPort))
  62. // ------------------------------优雅关机------------------------------
  63. // 实现优雅的关机
  64. srv := &http.Server{
  65. Addr: fmt.Sprintf("%d", config.Server.WebPort),
  66. Handler: r,
  67. }
  68. go func() {
  69. fmt.Printf("Listening and serving HTTP on %v\n", srv.Addr)
  70. // 启动HTTP服务
  71. if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  72. log.Fatalf("listen: %s\n", err)
  73. }
  74. }()
  75. // 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个超时时长
  76. quit := make(chan os.Signal, 1) // 创建一个接收信号的通道
  77. // kill 默认会发送 syscall.SIGTERM 信号
  78. // kill -2 发送 syscall.SIGINT 信号,我们常用的 Ctrl+C 就是触发系统SIGINT信号
  79. // kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它
  80. // signal.notify 把收到的 syscall.SIGINT 或 syscall.SIGTERM 信号转发给 quit
  81. signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞
  82. <-quit // 阻塞在此,当接收到上述两种信号时才会往下执行
  83. fmt.Println("Shutdown Server!")
  84. // 创建一个30秒超时的context
  85. ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
  86. defer cancel()
  87. // 优雅关闭服务(将未处理完的请求处理完再关闭服务),超时就退出
  88. if err := srv.Shutdown(ctx); err != nil {
  89. log.Fatal("Server Shutdown:", err)
  90. }
  91. fmt.Println("audioroom server closed ...")
  92. }