Aucune description
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

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