Nessuna descrizione
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 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package main
  2. import (
  3. "log"
  4. "net/http"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "git.x2erp.com/qdy/go-base/config"
  9. "git.x2erp.com/qdy/go-base/middleware"
  10. "git.x2erp.com/qdy/go-base/myservice"
  11. "git.x2erp.com/qdy/go-db/factory/database"
  12. "git.x2erp.com/qdy/go-db/myhandle"
  13. "git.x2erp.com/qdy/go-svc-agent/functions"
  14. "go-micro.dev/v4/web"
  15. )
  16. func main() {
  17. cfg, err := config.GetConfig()
  18. if err != nil {
  19. log.Printf("failed to load config: %v", err)
  20. return
  21. }
  22. serviceConfig := cfg.GetService()
  23. log.Printf("Service Port: %d", serviceConfig.Port)
  24. log.Printf("Service IdleTimeout: %d", serviceConfig.IdleTimeout)
  25. log.Printf("Service ReadTimeout: %d", serviceConfig.ReadTimeout)
  26. log.Printf("Service WriteTimeout: %d", serviceConfig.WriteTimeout)
  27. log.Printf("Service TrustedProxies: %s", serviceConfig.TrustedProxies)
  28. log.Printf("Using database type: %s", cfg.GetDatabase().Type)
  29. log.Printf("Database host: %s:%d", cfg.GetDatabase().Host, cfg.GetDatabase().Port)
  30. log.Printf("Database name: %s", cfg.GetDatabase().Database)
  31. log.Println("Database connection test passed!")
  32. // 启动微服务
  33. startMicroService(cfg)
  34. }
  35. // 启动微服务
  36. func startMicroService(cfg config.IConfig) {
  37. serviceConfig := cfg.GetService()
  38. // 初始化数据库
  39. dbFactory, err := database.GetDBFactory()
  40. if err != nil {
  41. log.Fatalf("Failed to create DB factory: %v", err)
  42. }
  43. defer func() {
  44. if err := dbFactory.Close(); err != nil {
  45. log.Printf("Database close error: %v", err)
  46. }
  47. }()
  48. // 设置优雅关闭
  49. setupGracefulShutdown(dbFactory)
  50. webService := myservice.StartStandalone(cfg)
  51. // 注册HTTP路由到webService
  52. registerRoutes(webService, dbFactory)
  53. // 等待服务运行
  54. log.Printf("Service started successfully")
  55. log.Printf(" • Service: %s", serviceConfig.ServiceName)
  56. log.Printf(" • Port: %d", serviceConfig.Port)
  57. log.Printf(" • Mode: %s", getServiceMode(cfg))
  58. // 保持主程序运行
  59. select {}
  60. }
  61. // 判断是否使用注册中心
  62. func shouldUseRegistry(cfg config.IConfig) bool {
  63. microConfig := cfg.GetMicro()
  64. // 如果有配置注册中心地址且不为空,则使用注册中心
  65. return microConfig.RegistryAddress != ""
  66. }
  67. // 获取服务模式描述
  68. func getServiceMode(cfg config.IConfig) string {
  69. if shouldUseRegistry(cfg) {
  70. return "With Service Discovery"
  71. }
  72. return "Standalone"
  73. }
  74. // 注册所有路由
  75. func registerRoutes(webService web.Service, dbFactory *database.DBFactory) {
  76. // 查询接口 - JSON
  77. webService.Handle("/api/query/json", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  78. myhandle.QueryHandlerJson(w, r, dbFactory, functions.QueryToJSON)
  79. })))
  80. // 查询接口 - CSV
  81. webService.Handle("/api/query/csv", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  82. myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryToCSV)
  83. })))
  84. // 查询接口 - CSV with positional params
  85. webService.Handle("/api/query/csv/param", middleware.JWTAuthMiddleware(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  86. myhandle.QueryHandlerBytes(w, r, dbFactory, functions.QueryPositionalToCSV)
  87. })))
  88. }
  89. // 设置优雅关闭
  90. func setupGracefulShutdown(dbFactory *database.DBFactory) {
  91. signalCh := make(chan os.Signal, 1)
  92. signal.Notify(signalCh, os.Interrupt, syscall.SIGTERM)
  93. go func() {
  94. <-signalCh
  95. log.Println("\nReceived shutdown signal, closing database connection...")
  96. if err := dbFactory.Close(); err != nil {
  97. log.Printf("Error closing database: %v", err)
  98. }
  99. log.Println("Database connection closed gracefully")
  100. os.Exit(0)
  101. }()
  102. }