2. Backstage 架构概览:核心组件、数据流与插件通信机制

在排查 IDP 自助门户故障之前,必须理解 Backstage 的运行时骨架。Backstage 采用 单页应用(SPA)前端 + 模块化后端 的架构,所有功能通过插件(Plugin)组装。本节从组件、数据流、通信三个维度拆解其核心设计。

2.1 三大核心组件

组件 职责 运行位置 故障排查关注点
App 应用外壳,负责路由、主题、登录态、全局布局 浏览器(React SPA) 路由 404、登录回调失败、主题加载异常
Backend 统一后端网关,提供鉴权、事件总线、插件注册 Node.js 进程(Express) 启动失败、插件注册冲突、鉴权 过期
Plugin 独立功能模块,前端 + 后端(可选)成对出现 浏览器 + Node.js 前端组件未加载、后端 API 超时、依赖缺失
排查口诀: App 管壳,Backend 管桥,Plugin 管业务。故障时先定位问题发生在哪一层。

2.2 数据流全景

一次典型的用户操作(例如在 Catalog 页面查看服务信息)会经过以下数据路径:

  1. 用户交互 → 浏览器中的 Plugin 前端组件触发事件。
  2. 前端路由 → App 层将 URL 映射到对应 Plugin 页面。
  3. API 请求 → Plugin 前端通过 fetch 或 useApi 调用 Backend 网关。
  4. 后端路由 → Backend 将请求转发到目标 Plugin 后端。
  5. 数据返回 → Plugin 后端处理业务逻辑(查询数据库、调用外部系统),返回 JSON。
  6. 状态更新 → Plugin 前端更新 React 状态,重新渲染 UI。
Backstage 数据流全景 用户浏览器 React SPA App 外壳 路由 / 鉴权 Plugin 前端 UI 组件 Backend 网关 Express 路由 Plugin 后端 业务逻辑 外部系统 / DB ① 用户操作触发 ② 路由匹配 → ③ API 调用 ④ 后端转发 → ⑤ 业务处理 ⑥ 数据返回 → 渲染

2.3 插件通信机制

Backstage 的插件之间不允许直接耦合,所有跨插件通信必须通过以下三种标准化方式:

通信方式 适用场景 实现机制 故障特征
API 引用 插件 A 调用插件 B 的后端接口 通过 createApiRef 声明接口契约,Backend 网关路由 接口返回 404 或 500,跨插件数据为空
事件总线 插件 A 通知插件 B 发生某事件 Backend 内置 EventBus,支持发布/订阅模式 事件未触发、订阅方未收到消息、事件丢失
实体引用 插件 A 读取插件 B 注册的 Catalog 实体 通过 EntityProvider 将实体注册到统一 Catalog 实体未显示、实体字段缺失、依赖实体循环引用
常见陷阱: 插件前端直接 import 另一个插件的内部组件会导致打包体积膨胀和运行时错误。必须使用 API 引用或事件总线解耦。

2.4 插件注册与依赖解析

每个插件在 app-config.yaml 或 packages/app/src/plugins.ts 中注册。Backend 启动时会执行依赖拓扑排序:

// packages/app/src/plugins.ts 示例
export const plugins = [
  catalogPlugin,          // 依赖:无
  scaffolderPlugin,       // 依赖:catalogPlugin
  techdocsPlugin,         // 依赖:catalogPlugin
  kubernetesPlugin,       // 依赖:catalogPlugin, scaffolderPlugin
  lighthousePlugin,       // 依赖:catalogPlugin
];

依赖解析失败时,Backend 日志会输出类似 Plugin "kubernetes" depends on "scaffolder" but it is not registered 的错误。

插件依赖拓扑 catalog scaffolder techdocs kubernetes lighthouse 箭头方向:被依赖 → 依赖方 启动时按拓扑顺序加载

2.5 故障排查速查表

架构视角的故障定位:
  • 页面白屏 / 路由跳转失败 → 检查 App 层路由配置,确认 RouteRef 与 Plugin 绑定正确。
  • API 返回 401/403 → 检查 Backend 鉴权中间件,确认 传递和身份解析链路。
  • 插件页面加载但数据为空 → 检查 Plugin 后端是否注册、API 路径是否匹配、后端是否启动成功。
  • 跨插件数据不显示 → 检查 API 引用是否声明、事件总线 Topic 是否一致、实体 Provider 是否注册。
  • Backend 启动报依赖错误 → 检查 plugins.ts 注册顺序和依赖声明。