关键在于让网关不感知阻塞,退为调度中枢,通过事件驱动异步流水线承载组件全流程;组件服务契约化、路由-服务-组件动态绑定、上下文隔离与错误收敛、轻量链路可观测性共同构成高可用大屏网关架构。

关键不是让网关“快”,而是让它“不感知阻塞”——把组件数据获取、转换、组装的全过程从同步等待中剥离,交由事件驱动与上下文隔离的异步流水线承载。网关本身退为调度中枢,而非执行容器。
组件级服务契约化:定义可编排的异步单元
每个大屏组件(如实时折线图、告警列表、GIS热力层)背后对应一个明确语义的异步服务,不暴露实现细节,只声明输入依赖与输出结构:
- 用 @ServiceKey("chart.energy.realtime") 标识服务唯一身份,便于路由匹配与调试追踪
- 通过 @DependsOn("$route.siteId, $user.role") 声明运行上下文依赖,中间件自动注入变更感知能力
- 返回类型统一为 CompletableFuture
,屏蔽底层是 HTTP 调用、MQTT 订阅还是 WebSocket 推送
无感映射的核心:路由-服务-组件三者动态绑定
网关不硬编码组件与接口的对应关系,而是基于元数据完成运行时映射:
- 解析 URL 如 /dashboard/factory-001/energy?tab=power,提取
siteId=factory-001和tab=power - 查服务注册表,发现
chart.energy.realtime服务声明了@Scope("site")且依赖$route.siteId - 自动创建该服务实例,并将其输出变量挂载到组件作用域:$comp.chart_power.data、$comp.chart_power.loading
- 前端仅需写
{{ $comp.chart_power.data }},无需关心它何时触发、如何加载、失败怎么兜底
上下文隔离与错误收敛:避免组件间干扰
上百个组件并行请求时,必须防止状态污染和异常扩散:
- 每个组件实例获得独立的子上下文快照(含
$route、$user、$env),即使父上下文后续变更也不影响已启动任务 - 所有服务调用结果被封装为标准响应变量:$comp.xxx.status(pending/fulfilled/rejected)、$comp.xxx.value、$comp.xxx.error
- 支持声明式降级:例如地图组件超时后,自动切换为静态图 +
$comp.map.status = "degraded",前端可据此渲染提示文案
轻量链路可观测性:调试不靠日志,而靠变量流
网关内置轻量事件总线,记录每个服务调用的触发源、耗时、状态、traceId,但不落盘全量日志:
- 调试面板按 $comp.id 或 $route.path 过滤,秒级还原某次刷新中各组件的执行时序与依赖关系
- 支持在变量流中直接查看
$comp.chart_power.data的上游来源是哪个 Callable、是否经过缓存、有无重试 - 当某个组件长时间 pending,可一键定位是依赖的服务未就绪,还是其上游数据源(如 Prometheus 查询)本身延迟











