2. 服务目录概念:服务目录的定义、核心要素与平台角色
服务目录(Service Catalog)是平台工程中连接“平台能力提供方”与“应用消费方”的核心契约层。它并非简单的服务列表,而是一个包含元数据、依赖关系、运维策略和交付约束的结构化知识库。在 CI/CD 流水线集成场景下,服务目录充当“单一事实源”,确保每一次部署、每一个变更都能被正确路由、监控和审计。
2.1 服务目录的定义
服务目录是对平台所托管的所有服务及其运行态属性的标准化注册与描述。它通常以 YAML/JSON 文件或数据库记录的形式存在,并对外提供查询与变更接口。一个成熟的服务目录至少包含以下特征:
- 唯一标识:每个服务拥有全局唯一的 ID(如
service:order-svc:v2)。 - 版本化:目录条目本身支持版本管理,与服务代码版本解耦。
- 可编程:通过 API 或 GitOps 方式被 CI/CD 流水线、监控系统和成本分析工具直接调用。
- 可发现:开发者和运维人员可通过统一门户或 CLI 工具检索服务信息。
实践要点: 服务目录不应手工维护。推荐使用“代码即目录”模式,将服务注册文件存放在 Git 仓库中,通过 Merge Request 审核变更,再由自动化流水线同步到运行时目录数据库。
2.2 核心要素
一个可用的服务目录条目必须包含以下五个核心要素。下表列出了每个要素的字段名称、数据类型和典型示例:
| 要素 | 字段名 | 数据类型 | 典型示例 |
|---|---|---|---|
| 服务名称 | service_name |
string | payment-gateway |
| 版本 | version |
semver | 2.1.0 |
| 负责人 | owner |
string / team | team-finance |
| SLA | sla |
object | { availability: "99.95%", latency_p99: "200ms" } |
| 运行时元数据 | runtime |
object | { language: "Go", port: 8080, health_check: "/healthz" } |
除了上述必填字段,生产级服务目录通常还会包含:
- 依赖关系:上游 API、下游数据库、消息队列等。
- 部署策略:滚动更新、蓝绿部署、金丝雀发布的参数。
- 告警规则:关联的 Prometheus 规则或 PagerDuty 策略。
- 成本标签:用于云成本分摊的部门/项目标签。
2.3 服务目录在平台工程中的角色
服务目录在平台工程中扮演着“平台大脑”的角色。它向下对接基础设施和 CI/CD 引擎,向上支撑开发者门户和治理报表。具体来说,其核心角色体现在以下四个方面:
- 标准化入口:所有服务必须通过目录注册才能获得平台资源(计算、存储、网络)和流水线权限。
- 自动化驱动:CI/CD 流水线在部署前从目录读取 SLA 和依赖信息,自动生成配置、注入 sidecar、配置健康检查。
- 治理与合规:平台团队通过目录扫描未注册服务、过期版本、无负责人服务,实施强制升级或回收。
- 可观测性关联:监控系统根据目录中的服务名称和版本自动关联日志、指标和链路追踪,无需人工打标签。
2.4 服务目录与 CI/CD 流水线的集成模式
在平台工程实践中,服务目录与 CI/CD 流水线的集成通常采用“流水线查询目录”模式,而非“目录驱动流水线”。具体流程如下:
- 触发阶段:代码合并到主分支后,流水线自动启动。
- 查询阶段:流水线调用服务目录 API,获取当前服务的版本、SLA、依赖和部署策略。
- 校验阶段:流水线对比代码中的版本声明与目录中的版本记录,防止版本回退或未注册服务。
- 构建与部署:根据目录返回的运行时元数据(如端口、健康检查路径)生成容器配置和 K8s 清单。
- 注册更新:部署成功后,流水线自动更新目录中的版本字段和运行时状态。
关键收益: 通过这种集成,平台团队可以确保“没有目录记录的服务不会被部署”,从而消除影子 IT 和配置漂移。同时,开发者无需在流水线中硬编码环境差异,所有环境感知逻辑都集中在服务目录中。
2.5 服务目录的常见反模式
在实施服务目录时,团队容易陷入以下误区。请对照检查你的平台设计:
| 反模式 | 表现 | 后果 |
|---|---|---|
| 目录即静态文档 | 使用 Wiki 或 Excel 维护服务列表 | 信息滞后,无人信任,最终废弃 |
| 过度约束 | 要求开发者填写 50+ 个字段才能注册 | 开发者绕过目录直接操作基础设施 |
| 缺少自动化校验 | 目录数据与运行时状态长期不一致 | 流水线基于错误数据部署,引发故障 |
| 单一团队维护 | 只有平台团队能修改目录条目 | 目录成为瓶颈,无法反映真实服务拓扑 |
避坑建议: 服务目录的字段设计应遵循“最少必要信息”原则。初期只包含服务名称、负责人、版本和 SLA 四个核心字段,后续根据实际需求逐步扩展。同时,通过 GitOps 方式允许服务团队通过 PR 自行更新目录条目,平台团队仅负责审核和自动化校验。