4. 服务目录数据模型:Entity 与 Catalog 模型、API 与 Component 实体、自定义实体类型

Backstage 服务目录的核心是统一的数据模型。所有被管理的软件组件、API、资源、网站、用户或团队,在 Backstage 中都被抽象为 Entity(实体)。理解 Entity 模型、Catalog 模型以及如何扩展自定义实体类型,是实现容量水位巡检与故障排查的基础。

4.1 Entity 模型:统一的数据结构

每个 Entity 都遵循一个标准化的 YAML/JSON 结构,包含以下核心字段:

字段 说明 示例值
apiVersion 实体格式版本,用于向后兼容 backstage.io/v1alpha1
kind 实体类型标识,如 Component、API、Resource Component
metadata 元数据,包含 name、namespace、title、labels、annotations name: user-service
spec 类型特定的规格字段,不同 kind 结构不同 type: service
relations 实体之间的关系,由 Catalog 自动计算 dependsOn: [resource:postgres-db]
巡检故障排查要点: 在排查容量水位问题时,metadata.annotations 是注入自定义监控指标(如 CPU 阈值、内存上限)的关键入口。务必确保巡检插件能正确读取这些注解。

4.2 Catalog 模型:实体关系与图谱

Catalog 模型不仅管理单个 Entity,还维护实体之间的 关系图谱。常见关系包括:

  • dependsOn:A 依赖 B(如服务依赖数据库)
  • provides:A 提供 B(如 Component 提供 API)
  • ownedBy:A 归属于 B(如 Component 属于 Team)
  • partOf:A 是 B 的一部分(如 Service 是 System 的一部分)

这些关系构成了服务目录的“知识图谱”,是故障排查时进行影响范围分析的基础。

Entity 与 Catalog 关系模型 Entity 核心结构 apiVersion: backstage.io/v1alpha1 kind: Component metadata: {name, labels, ...} spec: {type, lifecycle, ...} Catalog 关系层 dependsOn: [Resource A] provides: [API B] ownedBy: [Team C] partOf: [System D] 图谱存储 Neo4j / PostgreSQL 关系遍历查询 影响范围分析 巡检场景应用 通过 Catalog 关系图谱,从故障 Component 出发,快速定位依赖的 Resource(数据库、缓存)和所属 Team。 定义 Entity 建立关系 巡检与排查

4.3 API 与 Component 实体

在容量水位巡检场景中,Component 和 API 是最常打交道的两种实体类型。

4.3.1 Component 实体

Component 代表一个可独立部署的软件单元(微服务、前端应用、批处理任务等)。其 spec 字段包含:

  • type:service、website、library 等
  • lifecycle:experimental、production、deprecated
  • owner:所属团队实体引用
  • system:所属系统实体引用
  • subcomponentOf:父组件引用(可选)

4.3.2 API 实体

API 实体描述一个服务对外暴露的接口。其 spec 字段包含:

  • type:openapi、asyncapi、graphql、grpc 等
  • lifecycle:同 Component
  • owner:所属团队
  • definition:API 定义内容(如 OpenAPI 规范)
  • system:所属系统
巡检技巧: 在容量水位巡检插件中,通常通过 Component 的 dependsOn 关系找到其依赖的 Resource(如数据库),再通过 Resource 的注解获取容量指标。API 实体则用于监控接口级别的请求量和水位。

4.4 自定义实体类型

当内置的 Component、API、Resource、System 等类型无法满足需求时,Backstage 允许通过 自定义实体类型 扩展数据模型。例如,在容量巡检场景中,可能需要定义 CapacityThreshold 或 MonitorTarget 等新类型。

自定义实体类型的步骤:

  1. 定义 Kind:在 catalog 配置中注册新的 kind 名称。
  2. 创建实体处理器:实现 EntityProcessor 接口,解析自定义 YAML 格式。
  3. 注册到 Catalog:在 packages/backend/src/plugins/catalog.ts 中添加处理器。
  4. 编写前端卡片:为自定义实体创建专属的展示组件(EntityCard)。
自定义实体类型扩展流程 1. 定义 Kind catalog.ts kind: CapacityThreshold 2. 实体处理器 EntityProcessor 解析 YAML → Entity 3. 注册 Catalog catalog.ts addProcessor() 4. 前端卡片 EntityCard 组件 展示容量阈值 容量巡检自定义实体示例 定义 CapacityThreshold 实体,包含 cpuThreshold、memoryThreshold、diskThreshold 等字段,由巡检插件读取并触发告警。 YAML 定义示例: apiVersion: backstage.io/v1alpha1 kind: CapacityThreshold metadata: { name: user-service-threshold, annotations: { cpu: "80%", memory: "70%" } }

4.5 实体定义最佳实践

  • 命名规范:实体名称使用 kebab-case,如 user-service、payment-api。
  • 注解驱动:将容量阈值、监控 URL 等运维信息放在 metadata.annotations 中,避免污染 spec 结构。
  • 关系完整性:确保每个 Component 都关联到 owner 和 system,便于故障时快速定位责任团队。
  • 自定义类型谨慎使用:优先复用内置类型,仅在模型差异较大时扩展自定义类型,避免 Catalog 模型碎片化。
常见陷阱: 自定义实体类型如果未正确注册处理器,会导致 Catalog 无法解析 YAML 文件,实体不会出现在服务目录中。务必在 catalog.ts 中显式添加处理器,并重启后端服务。