multi-lane-manager
Version:
Nacos 泳道管理与请求路由组件
185 lines (171 loc) • 6.59 kB
text/typescript
import type { H3Event } from "h3";
import type { LogObject } from "consola";
import type { Consola } from "consola";
/**
* 服务实例信息
* 定义了服务实例的基本信息,包括 IP、端口、服务名等
*/
export interface ServiceInstanceInfo {
ip: string; // 实例 IP 地址
port: number; // 实例端口
serviceName: string; // 服务名称
clusterName: string; // 集群名称,通常是泳道 ID
ephemeral: boolean; // 是否为临时实例
metadata: Record<string, any>; // 实例元数据,包含泳道 ID 等信息
status: "UP" | "DOWN" | "UNKNOWN"; // 实例状态
lastHeartbeat: number | string; // 最后心跳时间
healthy?: boolean; // 是否健康
version?: string; // 实例版本
}
/**
* 泳道信息
* 定义了泳道的基本信息,包括泳道 ID 和实例列表
*/
export interface LaneInfo {
id: string; // 泳道 ID
instances: ServiceInstanceInfo[]; // 泳道中的实例列表
}
/**
* 请求规则
* 定义了请求路由规则,用于将请求路由到指定泳道
*/
export interface RequestRule {
path: string; // 请求路径
method?: string; // 请求方法,如 GET、POST 等
targetLane: string; // 目标泳道 ID
}
/**
* 请求日志
* 定义了请求日志的结构,用于记录请求处理情况
*/
export interface RequestLog {
traceId: string; // 请求跟踪 ID
laneId: string; // 泳道 ID
path: string; // 请求路径
method: string; // 请求方法
statusCode: number; // 响应状态码
instance: ServiceInstanceInfo; // 处理请求的实例
error?: Error; // 错误信息(如果有)
timestamp: number | string; // 请求时间戳
}
/**
* 泳道管理器配置
* 定义了泳道管理器的配置选项
*/
export interface LaneManagerOptions {
serverAddr: string; // Nacos 服务器地址
serverPort: number; // Nacos 服务器端口
namespace: string; // Nacos 命名空间
serviceName?: string; // 服务名称
hostname?: string; // 主机名
port?: string | number; // 服务端口
logger?: any; // 日志记录器
heartbeatInterval?: number; // 心跳间隔(毫秒)
heartbeatTimeout?: number; // 心跳超时(毫秒)
retryTimes?: number; // 重试次数
version?: string; // 版本
enabled?: boolean; // 是否启用
}
/**
* 泳道管理器事件
* 定义了泳道管理器的事件回调函数
*/
export interface LaneManagerEvents {
onRegistered?: (instance: ServiceInstanceInfo) => void; // 注册成功回调
onDeregistered?: (instance: ServiceInstanceInfo) => void; // 注销成功回调
onHeartbeat?: (instance: ServiceInstanceInfo) => void; // 心跳成功回调
onError?: (error: Error) => void; // 错误回调
onRequest?: (log: RequestLog) => void; // 请求处理回调
}
/**
* 泳道管理器
* 定义了泳道管理器的接口,包括注册、注销、获取实例等方法
*/
export interface LaneManager {
register(instance: ServiceInstanceInfo): Promise<boolean>; // 注册服务实例
deregister(): Promise<boolean>; // 注销服务实例
close(): Promise<void>; // 关闭管理器
isRegistered(): boolean; // 检查是否已注册
getClient(): any; // 获取 Nacos 客户端
getCurrentInstance(): ServiceInstanceInfo | null; // 获取当前实例
getServiceInstance(laneId: string): Promise<ServiceInstanceInfo | null>; // 获取指定泳道的实例
getAllLanes(): Promise<LaneInfo[]>; // 获取所有泳道信息
getNacosStatus(): Promise<any>; // 获取 Nacos 状态
logRequest(log: RequestLog): void; // 记录请求日志
logError(log: RequestLog): void; // 记录错误日志
}
/**
* 模块选项
* 定义了模块的配置选项
*/
export interface ModuleOptions {
enabled: boolean; // 是否启用
autoRegister: boolean; // 是否自动注册
rules: RequestRule[]; // 请求路由规则
serverAddr: string; // Nacos 服务器地址
serverPort: number; // Nacos 服务器端口
namespace: string; // Nacos 命名空间
heartbeatInterval: number; // 心跳间隔(毫秒)
heartbeatTimeout: number; // 心跳超时(毫秒)
retryTimes: number; // 重试次数
}
/**
* 扩展 Nuxt 类型
* 将模块选项添加到 Nuxt 配置中
*/
declare module "nuxt" {
interface NuxtConfig {
multiLaneManager?: Partial<ModuleOptions>;
}
}
/**
* 扩展 H3Event 上下文
* 添加泳道管理器相关的上下文信息
*/
declare module "h3" {
interface H3EventContext {
laneManager?: LaneManager; // 泳道管理器实例
traceId?: string; // 请求跟踪 ID
laneInfo?: { // 泳道信息
id: string; // 泳道 ID
traceId: string; // 请求跟踪 ID
timestamp: string | number; // 时间戳
};
runtimeConfig?: { // 运行时配置
public?: {
multiLaneManager?: {
enabled: boolean; // 是否启用
rules: RequestRule[]; // 请求路由规则
};
};
};
// 泳道管理器处理标记
_laneManagerHandled?: boolean; // 是否已被泳道管理器处理
_laneManagerProcessing?: boolean; // 是否正在被泳道管理器处理
}
}
/**
* 扩展 Nuxt Schema
* 将模块选项添加到 Nuxt 配置和选项中
*/
declare module "@nuxt/schema" {
interface NuxtConfig {
multiLaneManager?: Partial<ModuleOptions>;
}
interface NuxtOptions {
multiLaneManager?: Partial<ModuleOptions>;
}
}
/**
* 扩展 Nitropack
* 将模块选项添加到 Nitro 运行时配置中
*/
declare module "nitropack" {
interface NitroRuntimeConfig {
multiLaneManager?: Partial<ModuleOptions>;
}
}
// 导出其他模块的类型
export type * from "h3";
export * from "@nuxt/schema";
export * from "nitropack";