main.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. package main
  2. import (
  3. "github.com/juju/ratelimit"
  4. "io/ioutil"
  5. "net/http"
  6. _ "net/http"
  7. "os"
  8. "rocommon/service"
  9. _ "rocommon/socket"
  10. _ "rocommon/socket/http"
  11. _ "rocommon/socket/tcp"
  12. "rocommon/util"
  13. "roweb/serverlist/model"
  14. "runtime"
  15. "strconv"
  16. "syscall"
  17. "time"
  18. "github.com/gin-gonic/gin"
  19. )
  20. // /https://github.com/gin-gonic/gin
  21. func main() {
  22. //记录gate pid用来做关闭操作
  23. sysType := runtime.GOOS
  24. if sysType != "windows" {
  25. if pid := syscall.Getpid(); pid != 1 {
  26. fileName := "serverlist.pid" + string(strconv.Itoa(pid))
  27. ioutil.WriteFile(fileName, []byte(strconv.Itoa(pid)), 0777)
  28. defer os.Remove(fileName)
  29. }
  30. }
  31. service.Init("roweb")
  32. //todo...
  33. // 1,做动态热加载
  34. // 2,在获取文件内容时判断md5码然后进行加载,不加锁
  35. // 3, 是否需要放在mysql中
  36. // 4,是否需要支持通过后台web页面操作的方式来添加服务器组
  37. // 目前先做简单版本,放到配置文件中,修改后自动热加载,后期可以直接放到数据库中
  38. serverListFile := *(service.FlagServerList) //./serverlist.yaml
  39. model.InitConfig(serverListFile)
  40. sConfig := service.GetServiceConfig()
  41. //sdk http
  42. model.SetHttpNodeParam(&model.ServiceParam{
  43. ServiceType: "httpConnector",
  44. ServiceName: "game",
  45. //LisAddr: "serverlist.wtgame.cn:8088",
  46. //LisAddr: sConfig.Node.ServerList,
  47. })
  48. httpLogHandleFunc := func(c *gin.Context) {
  49. // 请求方式
  50. reqMethod := c.Request.Method
  51. // 请求路由
  52. reqUri := c.Request.RequestURI
  53. // 状态码
  54. statusCode := c.Writer.Status()
  55. // 请求IP
  56. clientIP := c.ClientIP()
  57. util.DebugF("requst=| statusCode=%3d | clientIP=%s | reqMethod=%s | reqUri=%s |",
  58. statusCode,
  59. clientIP,
  60. reqMethod,
  61. reqUri)
  62. c.Header("Access-Control-Allow-Origin", "*") // 可将将 * 替换为指定的域名
  63. c.Header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
  64. c.Header("Access-Control-Allow-Headers", "Accept, X-Access-Token, X-Application-Name, X-Request-Sent-Time")
  65. c.Header("Access-Control-Allow-Credentials", "true")
  66. }
  67. //对外开放端口
  68. go func() {
  69. router := gin.Default()
  70. router.Use(httpLogHandleFunc)
  71. // 使用限流中间件,每秒最多处理 10 个请求
  72. router.Use(RateLimitMiddleware(time.Second, 10))
  73. r1 := router.Group("/serverlist")
  74. //获取服务器列表
  75. r1.HEAD("", model.GetHeadInfo)
  76. r1.GET("", model.GetServerListNew)
  77. //r1.GET("", model.GetServerList)
  78. r1.GET("/download", model.GetServerDownLoad)
  79. //sdk 登录校验
  80. rSdkCheck := router.Group("/sdkcheck")
  81. //rSdkCheck.POST("", model.SDKCheck)
  82. rSdkCheck.GET("", model.SDKCheck)
  83. rSdkCheck.GET("/webtoken", model.UniSdkWebToken)
  84. //服务器维护操作
  85. r1.GET("/maintain", model.ServerMaintain)
  86. //玩家服务器角色信息注册
  87. r1.POST("/add", model.AddOpenIDServer)
  88. //修改服务器信息(gmt负责修改)
  89. r1.GET("/server", model.SetServerInfo)
  90. r2 := router.Group("/pay")
  91. //获取服务器列表
  92. r2.POST("/myCard", model.GetServerState) // mycard结果回调
  93. r2.POST("/myCardRe", model.GetServerState) // mycard补储值
  94. r2.POST("/myCardVerify", model.GetServerState) // mycard交易差异对比
  95. r2.POST("/myCardCode", model.GetServerState) // mycard授权码申请
  96. r2.POST("/myCardUser", model.GetServerState) // mycard账号验证回调
  97. r2.POST("/myCardOrder", model.GetServerState) // 订单申请
  98. // //测试用公告
  99. // router.GET("/notice")
  100. // //测试用chanel
  101. // //测试用vipService
  102. router.Run(sConfig.Node.Addr)
  103. }()
  104. //对内开放端口
  105. go func() {
  106. router := gin.Default()
  107. router.Use(httpLogHandleFunc)
  108. r1 := router.Group("/serverlist")
  109. //服务器维护操作
  110. r1.GET("/maintain", model.ServerMaintain)
  111. //玩家服务器角色信息注册
  112. r1.POST("/add", model.AddOpenIDServer)
  113. //修改服务器信息(gmt负责修改)
  114. r1.GET("/server", model.SetServerInfo)
  115. router.Run(sConfig.Node.HttpAddr)
  116. }()
  117. service.WaitExitSignal()
  118. }
  119. // RateLimitMiddleware 创建一个限流中间件
  120. func RateLimitMiddleware(fillInterval time.Duration, cap int64) gin.HandlerFunc {
  121. bucket := ratelimit.NewBucket(fillInterval, cap)
  122. return func(c *gin.Context) {
  123. if bucket.TakeAvailable(1) < 1 {
  124. c.JSON(http.StatusTooManyRequests, gin.H{
  125. "message": "请求过多,请稍后再试",
  126. })
  127. c.Abort()
  128. return
  129. }
  130. c.Next()
  131. }
  132. }