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.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. package main
  2. import (
  3. "log"
  4. "sync"
  5. "git.x2erp.com/qdy/go-base/config"
  6. "git.x2erp.com/qdy/go-base/container"
  7. "git.x2erp.com/qdy/go-base/graceful"
  8. "git.x2erp.com/qdy/go-base/logger"
  9. "git.x2erp.com/qdy/go-base/sdk/configure"
  10. "git.x2erp.com/qdy/go-base/webx"
  11. "git.x2erp.com/qdy/go-base/webx/health"
  12. "git.x2erp.com/qdy/go-base/webx/router"
  13. "git.x2erp.com/qdy/go-svc-code/internal/opencode"
  14. "git.x2erp.com/qdy/go-svc-code/internal/routes"
  15. )
  16. var (
  17. appName = "svc-code"
  18. appVersion = "1"
  19. )
  20. // 全局变量存储 opencode 进程信息
  21. var (
  22. opencodeProcess *opencode.Process
  23. opencodePort int
  24. opencodeMutex sync.Mutex
  25. )
  26. func main() {
  27. // 0. 初始化启动日志
  28. logBootFactory := logger.InitBootLog()
  29. // 1. 获取配置文件
  30. cfg := config.GetConfig()
  31. cfg.SetAppName(appName)
  32. cfg.SetAppVersion(appVersion)
  33. // 2. 创建关闭容器
  34. ctr := container.NewContainer(cfg)
  35. // 注册日志,实现自动关闭
  36. container.Reg(ctr, logBootFactory)
  37. // 3. 启用运行日志(需要在启动 opencode 服务之前)
  38. container.Create(ctr, logger.InitRuntimeLogger)
  39. // 4. 创建 configure 客户端
  40. configClient, err := configure.NewClient()
  41. if err != nil {
  42. log.Fatalf("创建 configure 客户端失败: %v", err)
  43. }
  44. // 5. 创建 opencode 客户端(使用 DirectClient,连接外部 opencode 服务)
  45. opencodePort = opencode.DefaultOpenCodePort
  46. client, err := opencode.NewDirectClient(opencodePort)
  47. if err != nil {
  48. log.Fatalf("创建 opencode 客户端失败: %v", err)
  49. }
  50. log.Printf("opencode 客户端已创建,连接端口: %d", opencodePort)
  51. // 6. 得到 webservice 服务工厂
  52. webxFactory := webx.GetWebServiceFactory()
  53. // 7. 建立 httpService 服务
  54. webService, err := webxFactory.CreateService(cfg.GetServiceConfig())
  55. if err != nil {
  56. log.Fatalf("创建 HTTP 服务失败: %v", err)
  57. }
  58. // 8. 建立路由-api
  59. routerService := router.NewWebService(webService.GetRouter())
  60. // 注册健康检查-api
  61. health.RegisterConsulHealthCheck(routerService)
  62. // 9. 注册路由--api
  63. registerRoutes(routerService, webService, configClient, client, nil, opencodePort)
  64. // 9. 注册前端静态文件服务
  65. //registerStaticFiles(webService)
  66. // 10. 启动服务
  67. webService.Run()
  68. // 11. 启用运行日志
  69. container.Create(ctr, logger.InitRuntimeLogger)
  70. // 12. 等待关闭
  71. graceful.WaitForShutdown(cfg.GetServiceConfig().ServiceName, ctr, webService.GetServer())
  72. }
  73. // registerRoutes 注册所有 API 路由
  74. func registerRoutes(ws *router.RouterService, webService *webx.WebService, configClient *configure.Client, client opencode.OpenCodeClient, opencodeProcess *opencode.Process, opencodePort int) {
  75. // 认证路由(公开登录接口)
  76. routes.RegisterAuthRoutes(ws, configClient)
  77. // 会话管理路由
  78. routes.RegisterSessionRoutes(ws, client)
  79. // 同步对话路由
  80. routes.RegisterPromptSyncRoutes(ws, client)
  81. // 流式对话路由(需要直接 HTTP 处理器)
  82. routes.RegisterPromptStreamRoutes(ws, webService, client)
  83. // 日志流路由(需要直接 HTTP 处理器)
  84. routes.RegisterLogStreamRoutes(ws, webService, opencodeProcess, opencodePort)
  85. }