UNPKG

tencentcloud-edgeone-migration-nodejs-v2

Version:

tencentcloud cdn config copy to edgeone

620 lines (619 loc) 17.4 kB
import { ApiStatKey, ApiStatValue, CacheStat, ComputedStat, Logger, Instance, InstanceStatus, Location, LocationMatchLevel, LogVerbosity, Metadata, MetadataCondition, RatelimitRule, RoutingRules, Service, StatusChangelog, StatusChangeRequest } from "."; import { QuotaConfig } from "./rules"; import { RequireKeys } from "./utils"; /** * 数据存储结构 */ export declare type DataWithRevision<T> = T extends unknown ? { /** * 数据列表 */ data: T; /** * 当前列表版本号 */ revision: string; } : never; /** * 全量服务数据集合 */ export declare type ServiceDataSet<T> = Partial<Record<string, Partial<Record<string, T>>>>; /** * 插件类型 */ export declare enum PluginType { /** 服务发现 */ NamingService = 1, /** 本地名字服务 */ LocalRegistry = 2, /** 服务路由 */ ServiceRouter = 4, /** 负载均衡 */ LoadBalancer = 8, /** 健康探测 */ OutlierDetector = 16, /** 节点熔断 */ CircuitBreaker = 32, /** 动态权重调整 */ WeightAdjuster = 64, /** 统计上报 */ StatReporter = 128, /** 日志跟踪 */ TraceLogging = 256, /** 限流服务 */ RatelimitService = 512, /** 流量整型 */ TrafficShaping = 1024 /** 1 << 10 */ } /** * 插件列表 */ export interface PluginList { /** 服务发现 */ [PluginType.NamingService]: NamingServicePlugin; /** 本地名字服务 */ [PluginType.LocalRegistry]: LocalRegistryPlugin; /** 服务路由 */ [PluginType.ServiceRouter]: ServiceRouterPlugin[]; /** 负载均衡 */ [PluginType.LoadBalancer]: LoadBalancerPlugin; /** 健康探测 */ [PluginType.OutlierDetector]: OutlierDetectorPlugin[]; /** 节点熔断 */ [PluginType.CircuitBreaker]: CircuitBreakerPlugin; /** 动态权重调整 */ [PluginType.WeightAdjuster]: WeightAdjusterPlugin[]; /** 统计上报 */ [PluginType.StatReporter]: StatReporterPlugin[]; /** 日志跟踪 */ [PluginType.TraceLogging]: TraceLoggingPlugin[]; /** 限流服务 */ [PluginType.RatelimitService]: RatelimitServicePlugin; /** 流量整型 */ [PluginType.TrafficShaping]: TrafficShapingPlugin[]; } /** * 插件 */ export interface Plugin { /** * 插件类型 * 此为 `PluginType` 组成的位域, * 允许单个实例实现多种不同类型插件 */ readonly type: number; /** * 插件名 * 尽量避免插件重名 */ readonly name: string; /** * 是否已销毁(释放) */ readonly isDisposed?: boolean; /** * 销毁(释放)所占资源 * 被调用后插件不可重入 */ dispose?(): void; /** * 设置日志输出模块 * @param logger 日志输出模块 */ setLogger?(logger: Logger): void; /** * 设置全局变量 * @param variables 全局变量列表 */ setVariables?(variables: Record<string, string>): void; /** * 获取当前插件配置 * 如插件无配置项,可不实现此接口 * @returns 当前插件配置 */ getConfig?(): unknown; } /** * 统计上报接口 */ export interface StatReporterPlugin extends Plugin { /** * 上报 API 调用统计 * @param key 维度 * @param value 指标 * @returns 是否上报成功 */ apiStatistics?(key: ApiStatKey, value: ApiStatValue): Promise<boolean>; /** * 上报服务间调用统计信息 * @param namespace 命名空间 * @param service 服务名 * @param stat 周期汇总统计信息 * @returns 是否上报成功 */ serviceStatistics?(namespace: string, service: string, stat: ComputedStat): Promise<boolean>; /** * 上报本地仓库中服务状态 * @param namespace 命名空间 * @param service 服务名 * @param stat 周期汇总服务信息 * @returns 是否上报成功 */ registryCache?(namespace: string, service: string, stat: CacheStat): Promise<boolean>; /** * 上报当前系统配置信息 * @param config 收集的配置信息 * @returns 是否上报成功 */ systemConfig?(config: unknown): Promise<boolean>; /** * 上报实例状态变化情况 * @param namespace 命名空间 * @param service 服务名 * @param stat 周期汇总状态变更信息 * @returns 是否上报成功 */ statusChangelog?(namespace: string, service: string, stat: StatusChangelog): Promise<boolean>; } /** * 节点熔断插件 */ export interface CircuitBreakerPlugin extends Plugin { /** * 周期熔断 * * 统计周期结束时,判断节点熔断 * * @param namespace 命名空间 * @param service 服务名 * @param instances 服务列表 * @param stat 周期汇总统计信息 * @returns 状态变更请求(只需包含需要变更状态的实例) */ period(namespace: string, service: string, instances: Instance[], stat: ComputedStat): Map<Instance, StatusChangeRequest>; /** * 实时熔断 * * 用户上报时,判断节点熔断 * * @param namespace 命名空间 * @param service 服务名 * @param instance 当前实例 * @param success 是否调用成功 * @param code 返回码(可选) * @returns 状态变更请求(如需熔断) */ realtime(namespace: string, service: string, instance: Instance, success: boolean, code?: string): StatusChangeRequest | undefined; } /** * 探测结果 */ export declare const enum DetectResult { /** 成功 */ Success = 0, /** 失败 */ Failure = 1, /** 其他 */ Other = 2 } /** * 健康探测插件 */ export interface OutlierDetectorPlugin extends Plugin { /** * 主动健康探测 * @param instance 需探测的实例 * @returns 探测结果 */ detect(instance: Instance): Promise<DetectResult>; } /** * 权重类型 */ export declare const enum WeightType { /** 动态权重 */ Dynamic = 0, /** 静态权重 */ Static = 1, /** 无 */ None = 2 } /** * 负载均衡插件 */ export interface LoadBalancerPlugin extends Plugin { /** * 支持的权重类型 */ supportedWeightType: WeightType; /** * 通过特定负载均衡规则选取一个特定实例 * @param namespace 命名空间 * @param service 服务名 * @param instances 可选择的实例列表 * @param args 本次调用附加参数(可选) * @returns 被选出的实例 */ choose<AdditionalArgs>(namespace: string, service: string, instances: Instance[], args?: AdditionalArgs): Instance; /** * 当实例状态发生改变时调用 * @param namespace 命名空间 * @param service 服务名 * @param instance 发生状态改变的实例 * @param prevStatus 实例前序状态 */ onStatusChange?(namespace: string, service: string, instance: Instance, prevStatus: InstanceStatus): void; } /** * 动态权重调整插件 */ export interface WeightAdjusterPlugin extends Plugin { /** * 权重调整 * @param namespace 命名空间 * @param service 服务名 * @param instances 实例列表 * @param stat 周期统计信息 */ adjust(namespace: string, service: string, instances: Instance[], stat: ComputedStat): void; } /** * 路由条件 */ export declare enum RoutingCondition { Found = 0, NotFound = 1 } /** * 路由行为 */ export declare enum RoutingAction { /** 中断,不再查询本插件 */ Break = 0, /** 旁通,旁通路由链上特定插件(可包含本插件) */ Bypass = 1 } /** 中断行为 */ export declare type BreakAction = Record<RoutingAction.Break, boolean>; /** 旁通行为 */ export declare type BypassAction = Record<RoutingAction.Bypass, string[]>; /** * 目标查询规则 */ export interface DestinationQuery { /** * 控制器,可根据匹配结果控制后续处理方式 * 如不填则以缺省方式处理 */ controller: Partial<Record<RoutingCondition, Partial<BreakAction & BypassAction>>>; /** * 目标信息 */ destination: Partial<DestinationInfo>; /** * 源信息 */ source?: Partial<SourceInfo>; } export interface SourceInfo { /** * 主调方元数据所匹配出的参数列表 */ parameters: Record<string, string>; } /** * 目标信息 */ export interface DestinationInfo { /** * 被转发服务名 */ transfer: string; /** * 被调方服务名 */ service: string; /** * 被调方元数据匹配条件 */ metadata: MetadataCondition; /** * 位置信息比较级别 */ level: LocationMatchLevel; } /** * 二次过滤结果 */ export interface FilteredResult { /** * 匹配的实例 */ filtered: Instance[]; /** * 路由行为(可选) */ action?: Partial<BreakAction & BypassAction>; } /** * 前置要求 */ export declare enum RequisiteBitfield { /** 无 */ None = 0, /** 规则 */ Rule = 1 } /** * 路由插件 */ export interface ServiceRouterPlugin extends Plugin { /** * 前置要求 * 此为 `RequisiteBitfield` 组成的位域 */ requisite: number; /** * 通用查询 * @param callee 被调方服务信息 * @param rules 全量路由规则(可选) * @param caller 主调方服务信息(可选) * @param args 本次调用附加参数(可选) * @returns 目标查询规则 */ query<AdditionalArgs>(callee: Service, rules?: RoutingRules[], caller?: Service, args?: AdditionalArgs): Iterable<Partial<DestinationQuery>>; /** * 二次过滤 * @description 通用查询的每个迭代均会调用此方法,用于通用查询给出的结果的二次过滤,以满足通用查询无法支持的特定需求 * @param instances 待过滤的实例 * @param query 目标查询规则 * @param args 本次调用附加参数(可选) * @returns 过滤结果 */ filter?<AdditionalArgs>(instances: Instance[], query: Partial<DestinationQuery>, args?: AdditionalArgs): FilteredResult; } /** * 数据存取接口 */ export interface RegistryData<T> { /** * 获取数据 * @param namespace 命名空间 * @param service 服务名 * @returns 带版本号的数据(可为空) */ get(namespace: string, service: string): DataWithRevision<T> | null; /** * 设置数据 * @param namespace 命名空间 * @param service 服务名 * @param data 带版本号的数据 */ set(namespace: string, service: string, data: DataWithRevision<T>): void; /** * 删除数据 * @param namespace 命名空间 * @param service 服务名 * @returns 删除是否成功(数据是否存在) */ delete(namespace: string, service: string): boolean; /** * 获取全部数据 * @returns 当前存储的全部数据,数据组织结构为:`namespace(命名空间)`.`service(服务名)` = DataWithRevision<T> */ all(): ServiceDataSet<DataWithRevision<T>>; } /** * 数据存储类别 */ export declare enum RegistryCategory { /** 实例 */ Instance = "Instance", /** 规则 */ Rule = "Rule", /** 流控 */ Ratelimit = "Ratelimit" } /** * 本地名字服务插件 */ export interface LocalRegistryPlugin extends Plugin { /** * 实例 */ [RegistryCategory.Instance]: RegistryData<Instance[]>; /** * 规则 */ [RegistryCategory.Rule]: RegistryData<ServiceRules>; /** * 流控 */ [RegistryCategory.Ratelimit]: RegistryData<RatelimitRule[]>; } /** * 健康检查类型 */ export declare enum HealthCheckType { UNKNOWN = 0, HEARTBEAT = 1 } /** * 注册选项 */ export interface RegisterOptions { /** * 是否开启健康检查 */ enableHealthCheck: boolean; /** * 实例健康检查类型 */ healthCheckType: HealthCheckType; /** * 超时时间(秒) */ healthCheckTTL: number; } /** * 服务规则 */ export interface ServiceRules { /** * 入站规则 */ in: RoutingRules[]; /** * 出站规则 */ out: RoutingRules[]; } /** * 待服务注册的实例类型 */ export declare type RegistrationInstance = RequireKeys<Partial<Omit<Instance, "dynamicWeight">>, "host" | "port">; /** * 运行模式 */ export declare enum OperatingMode { /** 内部 */ Internal = 0, /** 外部 */ External = 1 } /** * 名字服务插件 */ export interface NamingServicePlugin extends Plugin { /** * 运行模式 */ readonly mode: OperatingMode; /** * 客户端位置信息 */ readonly location?: Location; /** * 获取单个服务实例 * @param namespace 命名空间 * @param service 服务名 * @param metadata 元数据信息,用于过滤服务实例,可选 * @returns 选出的实例(可为空) */ select?(namespace: string, service: string, metadata?: Metadata): Promise<Instance | null>; /** * 获取全部服务实例 * @note 返回的每个实例中的字段 `id` | `host` | `port` | `staticWeight` | `status` 不能为假值 * @param namespace 命名空间 * @param service 服务名 * @param revision 修订版本号 * @returns 带版本号的实例列表 */ list(namespace: string, service: string, revision?: string): Promise<DataWithRevision<Instance[]>>; /** * 获取路由规则 * @param namespace 命名空间 * @param service 服务名 * @param revision 修订版本号 * @returns 服务规则 */ routingRules(namespace: string, service: string, revision?: string): Promise<DataWithRevision<ServiceRules>>; /** * 服务注册 * @param namespace 命名空间 * @param service 服务名 * @param token 服务 Token 用来鉴权 * @param instance 待注册的实例 * @param options 注册选项 * @returns 实例唯一 ID */ register(namespace: string, service: string, token: string, instance: RegistrationInstance, options?: RegisterOptions): Promise<string>; /** * 服务注销 * @param id 实例唯一 ID * @param token 服务 Token 用来鉴权 * @returns 是否注销成功 */ unregister(id: string, token: string): Promise<boolean>; /** * 服务注销 * @param namespace 命名空间 * @param service 服务名 * @param host 节点 IP 或者域名 * @param port 节点端口号 * @param token 服务 Token 用来鉴权 * @returns 是否注销成功 */ unregister(namespace: string, service: string, host: string, port: number, token: string): Promise<boolean>; /** * 服务心跳上报 * @param id 实例唯一 ID * @param token 服务 Token 用来鉴权 * @returns 是否发送成功 */ heartbeat(id: string, token: string): Promise<boolean>; /** * 服务心跳上报 * @param namespace 命名空间 * @param service 服务名 * @param host 节点 IP 或者域名 * @param port 节点端口号 * @param token 服务 Token 用来鉴权 * @returns 是否发送成功 */ heartbeat(namespace: string, service: string, host: string, port: number, token: string): Promise<boolean>; } /** * 限流服务插件 */ export interface RatelimitServicePlugin extends Plugin { /** * 获取限流规则 * @param namespace 命名空间 * @param service 服务名 * @returns 限流规则 */ ratelimitRules(namespace: string, service: string, revision?: string): Promise<DataWithRevision<RatelimitRule[]>>; /** * 获取限流配额 * @param namespace 命名空间 * @param service 服务名 * @param rule 限流规则 * @param used 周期已使用的配额 * @returns 当前周期所使用的配额总量 */ acquireQuota(namespace: string, service: string, rule: RatelimitRule, used: QuotaConfig[]): Promise<QuotaConfig[]>; } /** * 日志跟踪插件 */ export interface TraceLoggingPlugin extends Omit<Plugin, "setLogger"> { /** * 输出普通日志 * @param severity 日志级别 * @param prefix 前缀(可选) * @param message 日志内容(可选) * @param optionalParams 附加参数 */ log(severity: LogVerbosity, prefix?: unknown, message?: unknown, ...optionalParams: unknown[]): void; /** * 输出跟踪日志 * @param tracer 发起者 * @param transaction 跟踪 ID(可选) * @param message 日志内容(可选) * @param optionalParams 附加参数 */ trace(tracer: string, transaction?: unknown, message?: unknown, ...optionalParams: unknown[]): void; } /** * 流量整型插件 */ export interface TrafficShapingPlugin extends Plugin { /** * 流量控制 * @param rule 限流规则 * @param partition 当前限流规则分区数 * @returns 返回当前申请配额的 {Promise} 对象 */ inFlow(rule: RatelimitRule, partition: number): Promise<void>; }