No Description
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

main.go 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. package main
  2. import (
  3. "fmt"
  4. "log"
  5. "net/http"
  6. "os"
  7. "os/signal"
  8. "strings"
  9. "syscall"
  10. "time"
  11. "git.x2erp.com/qdy/go-base/config"
  12. "git.x2erp.com/qdy/go-base/types"
  13. "git.x2erp.com/qdy/go-db/factory"
  14. "git.x2erp.com/qdy/go-service-agent/auth"
  15. "git.x2erp.com/qdy/go-service-agent/functions"
  16. "github.com/gin-gonic/gin"
  17. )
  18. func main() {
  19. cfg := config.GetConfig()
  20. log.Printf("Service Port: %d", cfg.GetService().Port)
  21. log.Printf("Service IdleTimeout: %d", cfg.GetService().IdleTimeout)
  22. log.Printf("Service ReadTimeout: %d", cfg.GetService().ReadTimeout)
  23. log.Printf("Service WriteTimeout: %d", cfg.GetService().WriteTimeout)
  24. log.Printf("Service TrustedProxies: %s", cfg.GetService().TrustedProxies)
  25. log.Printf("Using database type: %s", cfg.GetDatabase().Type)
  26. log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port)
  27. log.Printf("Database name: %s", cfg.GetDatabase().Database)
  28. log.Println("Database connection test passed!")
  29. // 3. 启动Gin HTTP服务
  30. startHTTPServer()
  31. }
  32. // 启动HTTP服务器
  33. func startHTTPServer() {
  34. //建立路由
  35. router := gin.Default()
  36. cfg := config.GetConfig()
  37. serviceConfig := cfg.GetService()
  38. dbFactory, err := factory.GetDBFactory()
  39. if err != nil {
  40. log.Fatalf("Failed to create DB factory: %v", err)
  41. }
  42. // 设置优雅关闭
  43. setupGracefulShutdown(dbFactory)
  44. defer func() {
  45. dbFactory.Close()
  46. log.Println("Database connection closed")
  47. }()
  48. // 核心路由
  49. router.GET("/api/health", functions.HealthHandler(dbFactory, cfg.GetDatabase().Type))
  50. router.POST("/api/query", auth.AuthMiddleware(), withQueryRequest(functions.QueryToJSON(dbFactory)))
  51. router.POST("/api/query/csv", auth.AuthMiddleware(), withQueryRequest(functions.QueryToCSV(dbFactory)))
  52. router.POST("/api/query/csv/param", auth.AuthMiddleware(), withQueryRequest(functions.QueryPositionalToCSV(dbFactory)))
  53. router.GET("/api/info", functions.InfoHandler(dbFactory))
  54. // 日志输出配置信息
  55. log.Printf("Service Port: %d", serviceConfig.Port)
  56. log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
  57. log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
  58. log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
  59. log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
  60. // 设置可信代理
  61. setupTrustedProxies(router, serviceConfig.TrustedProxies)
  62. // 创建HTTP服务器配置
  63. server := &http.Server{
  64. Addr: fmt.Sprintf(":%d", serviceConfig.Port),
  65. Handler: router,
  66. IdleTimeout: time.Duration(serviceConfig.IdleTimeout) * time.Second,
  67. ReadTimeout: time.Duration(serviceConfig.ReadTimeout) * time.Second,
  68. WriteTimeout: time.Duration(serviceConfig.WriteTimeout) * time.Second,
  69. }
  70. log.Printf("Starting HTTP server on port %d", serviceConfig.Port)
  71. if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  72. log.Fatalf("Failed to start server: %v", err)
  73. }
  74. }
  75. // 参数绑定包装器
  76. func withQueryRequest(handler func(c *gin.Context, req types.QueryRequest)) gin.HandlerFunc {
  77. return func(c *gin.Context) {
  78. var req types.QueryRequest
  79. if err := c.ShouldBindJSON(&req); err != nil {
  80. c.JSON(400, &types.QueryResult{
  81. Success: false,
  82. Error: "Invalid request: " + err.Error(),
  83. Data: nil,
  84. })
  85. return
  86. }
  87. handler(c, req)
  88. }
  89. }
  90. // 设置可信代理
  91. func setupTrustedProxies(router *gin.Engine, trustedProxiesStr string) {
  92. if trustedProxiesStr == "" {
  93. setupTrustedProxiesRouter(router, nil)
  94. return
  95. }
  96. // 按逗号分割字符串,并去除空格
  97. proxies := strings.Split(trustedProxiesStr, ",")
  98. trimmedProxies := make([]string, 0, len(proxies))
  99. for _, proxy := range proxies {
  100. trimmed := strings.TrimSpace(proxy)
  101. if trimmed != "" {
  102. trimmedProxies = append(trimmedProxies, trimmed)
  103. }
  104. }
  105. if len(trimmedProxies) > 0 {
  106. setupTrustedProxiesRouter(router, trimmedProxies)
  107. } else {
  108. setupTrustedProxiesRouter(router, nil)
  109. }
  110. }
  111. func setupTrustedProxiesRouter(router *gin.Engine, trimmedProxies []string) {
  112. err := router.SetTrustedProxies(trimmedProxies)
  113. if err != nil {
  114. log.Printf("Warning: Failed to set trusted proxies: %v", err)
  115. } else {
  116. log.Printf("Trusted proxies set: %v", trimmedProxies)
  117. }
  118. }
  119. func setupGracefulShutdown(dbFactory *factory.DBFactory) {
  120. signalCh := make(chan os.Signal, 1)
  121. signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
  122. go func() {
  123. <-signalCh
  124. log.Println("\nReceived shutdown signal, closing database connection...")
  125. dbFactory.Close()
  126. log.Println("Database connection closed gracefully")
  127. os.Exit(0)
  128. }()
  129. }