Nav apraksta
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

main.go 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package main
  2. import (
  3. "context"
  4. "log"
  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-db/factory/mongodb"
  14. "git.x2erp.com/qdy/go-svc-code/internal/opencode"
  15. "git.x2erp.com/qdy/go-svc-code/internal/routes"
  16. "git.x2erp.com/qdy/go-svc-code/internal/service/event"
  17. "git.x2erp.com/qdy/go-svc-code/internal/service/menu"
  18. )
  19. var (
  20. appName = "svc-code"
  21. appVersion = "1"
  22. )
  23. // 全局变量存储 opencode 进程信息
  24. var (
  25. //opencodeProcess *opencode.Process
  26. opencodePort int
  27. //opencodeMutex sync.Mutex
  28. )
  29. func main() {
  30. // 0. 初始化启动日志
  31. logBootFactory := logger.InitBootLog()
  32. // 1. 获取配置文件
  33. cfg := config.GetConfig()
  34. cfg.SetAppName(appName)
  35. cfg.SetAppVersion(appVersion)
  36. // 2. 创建关闭容器
  37. ctr := container.NewContainer(cfg)
  38. // 注册日志,实现自动关闭
  39. container.Reg(ctr, logBootFactory)
  40. // 3. 启用运行日志(需要在启动 opencode 服务之前)
  41. container.Create(ctr, logger.InitRuntimeLogger)
  42. // 创建mongodb
  43. mongoDBFactory := container.Create(ctr, mongodb.CreateFactory)
  44. mongoDBFactory.TestConnection()
  45. // 创建会话-菜单映射服务
  46. mappingService := menu.NewMappingService(mongoDBFactory)
  47. // 确保索引存在
  48. ctx := context.Background()
  49. if err := mappingService.EnsureIndexes(ctx); err != nil {
  50. log.Printf("警告:创建会话-菜单映射索引失败: %v", err)
  51. } else {
  52. log.Printf("会话-菜单映射索引确保成功")
  53. }
  54. // 4. 创建 configure 客户端
  55. configClient, err := configure.NewClient()
  56. if err != nil {
  57. log.Fatalf("创建 configure 客户端失败: %v", err)
  58. }
  59. // 5. 创建 opencode 客户端(使用 DirectClient,连接外部 opencode 服务)
  60. opencodePort = opencode.DefaultOpenCodePort
  61. client, err := opencode.NewDirectClient(opencodePort)
  62. if err != nil {
  63. log.Fatalf("创建 opencode 客户端失败: %v", err)
  64. }
  65. log.Printf("opencode 客户端已创建,连接端口: %d", opencodePort)
  66. // 启动事件分发器(用于多用户流式对话隔离)
  67. dispatcher := event.GetEventDispatcher(client.GetBaseURL(), client.GetPort())
  68. if err := dispatcher.Start(context.Background()); err != nil {
  69. log.Printf("警告:事件分发器启动失败(流式功能可能受影响): %v", err)
  70. } else {
  71. log.Printf("事件分发器已启动")
  72. defer dispatcher.Stop()
  73. }
  74. // 初始化订阅服务单例(暂时注释,使用简单回调方案)
  75. // event.InitSubscriptionService(dispatcher, mongoDBFactory)
  76. // log.Printf("订阅服务单例已初始化")
  77. // 6. 得到 webservice 服务工厂
  78. webxFactory := webx.GetWebServiceFactory()
  79. // 7. 建立 httpService 服务
  80. webService, err := webxFactory.CreateService(cfg.GetServiceConfig())
  81. if err != nil {
  82. log.Fatalf("创建 HTTP 服务失败: %v", err)
  83. }
  84. // 8. 建立路由-api
  85. routerService := router.NewWebService(webService.GetRouter())
  86. // 注册健康检查-api
  87. health.RegisterConsulHealthCheck(routerService)
  88. // 9. 注册路由--api
  89. registerRoutes(routerService, webService, configClient, client, nil, opencodePort, mappingService)
  90. // 9. 注册前端静态文件服务
  91. //registerStaticFiles(webService)
  92. // 10. 启动服务
  93. webService.Run()
  94. // 11. 启用运行日志
  95. container.Create(ctr, logger.InitRuntimeLogger)
  96. // 12. 等待关闭
  97. graceful.WaitForShutdown(cfg.GetServiceConfig().ServiceName, ctr, webService.GetServer())
  98. }
  99. // registerRoutes 注册所有 API 路由
  100. func registerRoutes(ws *router.RouterService, webService *webx.WebService, configClient *configure.Client, client opencode.OpenCodeClient, opencodeProcess *opencode.Process, opencodePort int, mappingService *menu.MappingService) {
  101. // 认证路由(公开登录接口)
  102. routes.RegisterAuthRoutes(ws, configClient)
  103. // 会话管理路由
  104. routes.RegisterSessionRoutes(ws, client, mappingService)
  105. // 同步对话路由
  106. routes.RegisterPromptSyncRoutes(ws, client)
  107. // 流式对话路由(需要直接 HTTP 处理器)
  108. routes.RegisterPromptStreamRoutes(ws, webService, client)
  109. // 日志流路由(需要直接 HTTP 处理器)
  110. routes.RegisterLogStreamRoutes(ws, webService, opencodeProcess, opencodePort)
  111. // 会话消息路由
  112. routes.RegisterSessionMessagesRoutes(ws, client)
  113. // 菜单路由
  114. routes.RegisterMenuRoutes(ws, mappingService)
  115. }