multi-lane-manager
Version:
Nacos 泳道管理与请求路由组件
1 lines • 11.1 kB
Source Map (JSON)
{"version":3,"sources":["../src/runtime/nitro-plugin.ts"],"sourcesContent":["import type { H3Event } from 'h3';\n// 使用 any 类型来避免 TypeScript 类型错误\n// 因为 NitroApp 的类型定义可能与实际使用的不一致\nimport type { NitroApp as OriginalNitroApp } from 'nitropack';\ntype NitroApp = OriginalNitroApp & {\n options?: {\n runtimeConfig?: {\n appName?: string;\n public?: {\n appName?: string;\n };\n };\n };\n};\nimport { getConfig, getGlobalState, updateConfigPort } from '../utils/config';\nimport { logger } from '../utils/logger';\nimport { registerServiceInstance, deregisterServiceInstance } from '../utils/nacos';\nimport { getServerPort } from './server-utils';\n\n/**\n * Nitro 插件 - 泳道管理服务注册\n *\n * 此插件在 Nitro 服务器启动时执行,负责:\n * 1. 获取服务器端口\n * 2. 注册服务实例到 Nacos\n * 3. 设置服务器关闭时的注销逻辑\n * 4. 提供健康检查接口\n */\n\n// 在模块加载时立即执行的代码\nlogger.info(`====== 🚀 泳道管理 Nitro 插件模块被加载 ======`);\nlogger.debug(`⏱️ 当前时间: ${new Date().toISOString()}`);\nlogger.debug(`🆔 当前进程ID: ${process.pid}`);\nlogger.debug(`📂 当前工作目录: ${process.cwd()}`);\nlogger.debug(`🔧 环境变量: NODE_ENV=${process.env.NODE_ENV}, NITRO_PORT=${process.env.NITRO_PORT || '未设置'}, PORT=${process.env.PORT || '未设置'}`);\n\n// 初始化全局状态\nconst globalState = getGlobalState();\nif (!globalState._laneMgrRegistered) {\n globalState._laneMgrRegistered = false;\n globalState._laneMgrPort = undefined;\n logger.debug(`🔄 初始化全局注册状态为 false`);\n} else {\n logger.debug(`ℹ️ 全局注册状态已存在: ${globalState._laneMgrRegistered}`);\n}\n\n/**\n * Nitro 插件主函数\n * 在 Nitro 服务器启动时执行,负责服务注册和健康检查\n *\n * @param nitroApp Nitro 应用实例\n */\nexport default async (nitroApp: NitroApp) => {\n logger.info(`====== 🔌 泳道管理 Nitro 插件函数被调用 ======`);\n logger.debug(`⏱️ 当前时间: ${new Date().toISOString()}`);\n logger.debug(`✅ nitroApp 对象可用: ${!!nitroApp}`);\n logger.debug(`✅ nitroApp.hooks 可用: ${!!nitroApp.hooks}`);\n\n // 导入中间件\n try {\n const { default: middleware } = await import('./server-middleware');\n logger.info(`✅ 成功导入中间件`);\n\n // 添加中间件到 Nitro 应用\n nitroApp.hooks.hook('request', middleware);\n logger.info(`✅ 成功添加中间件到 Nitro 应用`);\n } catch (error) {\n logger.error(`❌ 导入或添加中间件失败: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n // 尝试从Nitro运行时配置获取应用名称\n try {\n if (nitroApp.options && nitroApp.options.runtimeConfig) {\n const appName = nitroApp.options.runtimeConfig.appName ||\n (nitroApp.options.runtimeConfig.public && nitroApp.options.runtimeConfig.public.appName);\n\n if (appName) {\n // 将应用名称存储在全局变量中,以便在其他地方使用\n (global as any).__nitroAppName = appName;\n logger.info(`✅ 从Nitro运行时配置获取应用名称: ${appName}`);\n\n // 清除配置缓存,强制下次获取配置时重新创建\n // 这样可以确保使用最新的应用名称\n const { clearConfigCache } = await import('../utils/config');\n clearConfigCache();\n }\n }\n } catch (error) {\n logger.warn(`⚠️ 无法从Nitro运行时配置获取应用名称: ${error}`);\n }\n\n // 立即注册服务\n (async () => {\n logger.info(`====== 📝 开始注册服务 ======`);\n\n try {\n // 如果已经注册过,则跳过\n if (globalState._laneMgrRegistered) {\n logger.info(`ℹ️ 服务已注册,跳过重复注册`);\n return;\n }\n\n // 获取服务器端口\n const port = getServerPort();\n\n // 更新配置中的端口\n updateConfigPort(port);\n\n // 标记为已注册,避免重复注册\n globalState._laneMgrRegistered = true;\n globalState._laneMgrPort = port;\n\n // 注册服务实例\n logger.info(`📤 开始注册服务到 Nacos,端口: ${port}`);\n const success = await registerServiceInstance(port);\n logger.info(`📋 服务注册结果: ${success ? '✅ 成功' : '❌ 失败'}`);\n\n if (success) {\n // 设置服务器关闭时的注销逻辑\n const gracefulShutdown = async () => {\n logger.info(`🛑 服务器关闭,正在注销服务...`);\n await deregisterServiceInstance(port);\n logger.info(`✅ 服务注销完成`);\n };\n\n // 监听进程退出事件\n process.on('beforeExit', gracefulShutdown);\n process.on('SIGINT', async () => {\n logger.info(`🔴 收到 SIGINT 信号`);\n await gracefulShutdown();\n process.exit(0);\n });\n process.on('SIGTERM', async () => {\n logger.info(`🔴 收到 SIGTERM 信号`);\n await gracefulShutdown();\n process.exit(0);\n });\n\n // 监听 Nitro 关闭事件\n nitroApp.hooks.hook('close', async () => {\n logger.info(`🔴 收到 Nitro close 事件`);\n await gracefulShutdown();\n });\n\n logger.info(`✅ 已设置服务注销钩子`);\n }\n } catch (error) {\n logger.error(`❌ 服务注册过程中出错:`, error);\n }\n })();\n\n // 添加请求处理钩子,确保能拦截所有请求,包括静态资源\n nitroApp.hooks.hook('request', async (event: H3Event) => {\n // 检查请求是否已经被处理过,避免重复处理\n if (event.context._laneManagerHandled || event.context._laneManagerProcessing) {\n return;\n }\n\n // 记录所有请求,确保插件被触发\n console.log(`[multi-lane-manager:nitro-plugin] Intercepting request: ${event.path}`);\n\n // 特别记录 /_nuxt/ 路径的请求\n if (event.path.startsWith('/_nuxt/')) {\n console.log(`[multi-lane-manager:nitro-plugin] Intercepting _nuxt request1: ${event.path}`);\n logger.info(`🔍 Nitro插件拦截到静态资源请求: ${event.path}`);\n }\n\n // 特别记录 /api/ 路径的请求\n if (event.path.startsWith('/api/')) {\n console.log(`[multi-lane-manager:nitro-plugin] Intercepting API request: ${event.path}`);\n logger.info(`🔍 Nitro插件拦截到API请求: ${event.path}, 方法: ${event.node.req.method}`);\n }\n\n // 如果请求路径是 /api/lane-manager/health,则返回健康状态\n if (event.path === '/api/lane-manager/health') {\n // 标记请求正在被处理,避免重复处理\n event.context._laneManagerProcessing = true;\n\n logger.debug(`🩺 收到健康检查请求: ${event.path}`);\n\n // 获取当前配置\n const config = getConfig();\n\n try {\n // 设置响应\n if (!event.node.res.headersSent) {\n event.node.res.statusCode = 200;\n event.node.res.setHeader('Content-Type', 'application/json');\n\n // 返回健康状态信息\n event.node.res.end(JSON.stringify({\n status: 'ok',\n registered: globalState._laneMgrRegistered || false,\n port: globalState._laneMgrPort || null,\n laneId: config.currentLaneId,\n serviceName: config.serviceName,\n timestamp: new Date().toISOString(),\n nitroPluginLoaded: true\n }));\n }\n } catch (error) {\n logger.error(`❌ 处理健康检查请求时出错: ${error instanceof Error ? error.message : String(error)}`);\n }\n\n // 标记请求已处理\n event.context._laneManagerHandled = true;\n }\n });\n\n logger.info(`====== ✅ 泳道管理 Nitro 插件初始化完成 ======`);\n};\n"],"mappings":"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","names":[]}