Sin descripción
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.4KB

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