2. 服务画像定义:什么是服务画像,服务画像的核心维度

在构建基于服务画像的 CI/CD 流水线 SLI 口径之前,必须先回答一个根本问题:什么是服务画像? 服务画像不是简单的服务名称或技术标签,而是一组多维度、可量化、可观测

核心观点: 服务画像 = 业务属性 × 技术栈 × 流量特征 × 变更频率。四个维度共同决定了该服务在 CI/CD 流水线中应该被如何测试、如何部署、如何观测,以及 SLI 口径应该如何差异化设计。

2.1 服务画像的定义

服务画像(Service Profile)是对一个微服务静态属性与动态行为的结构化描述。它帮助 SRE 和 DevOps 团队回答以下关键问题:

  • 这个服务有多重要? —— 业务属性决定 SLI 的权重和告警优先级。
  • 它用什么技术实现? —— 技术栈决定流水线中工具链的选择和测试策略。
  • 它承受什么样的流量? —— 流量特征决定压测模型和容量规划口径。
  • 它多久变一次? —— 变更频率决定流水线的触发策略和部署节奏。

服务画像不是一成不变的,它应该随着服务演进持续更新,并与 CMDB、服务目录、监控系统保持同步。

2.2 服务画像的核心维度

服务画像由四个核心维度构成,每个维度下包含若干关键属性。下表给出了完整的维度定义与典型取值:

维度 关键属性 典型取值 / 示例 对 SLI 口径的影响
业务属性 服务等级、业务域、SLO 目标、合规要求 核心支付 / 用户推荐 / 日志采集;P0/P1/P2 决定 SLI 的可用性目标(99.99% vs 99.9%)和告警响应时间
技术栈 编程语言、框架、中间件、存储、部署形态 Go + gRPC + Redis + MySQL;Java + Spring Boot + Kafka + PostgreSQL 决定流水线中编译、测试、静态分析、容器化的工具选型
流量特征 QPS 峰值、请求模式、读写比例、调用链深度 10k QPS 突发型;读多写少 9:1;同步调用链 5 跳 决定压测 SLI 的并发模型、延迟分位数口径和容量阈值
变更频率 日均部署次数、代码提交频率、配置变更频率 每天 20 次部署(高频);每周 1 次(低频) 决定流水线触发方式(CI 自动 vs 手动)、部署策略(滚动 vs 蓝绿)

2.3 服务画像四维关系图

下图展示了四个核心维度之间的逻辑关系:业务属性作为顶层驱动,技术栈和流量特征作为运行基础,变更频率作为动态调节因子,共同输出差异化的 SLI 口径策略。

服务画像四维关系图 服务画像 业务属性 技术栈 流量特征 变更频率 说明:业务属性决定服务等级目标,技术栈和流量特征决定运行基线,变更频率决定流水线节奏。 四个维度共同输出差异化的 SLI 口径策略。

2.4 各维度详解

2.4.1 业务属性

业务属性是服务画像的顶层分类,它直接关联到服务的商业价值和 SLO 承诺。常见的业务属性分类包括:

  • 服务等级(Tier): Tier-0(基础设施)、Tier-1(核心业务)、Tier-2(支撑业务)、Tier-3(工具/内部服务)。
  • 业务域: 支付域、用户域、商品域、订单域、数据域等。
  • SLO 目标: 可用性 99.99% / 99.9% / 99%,延迟 P99 < 100ms / < 500ms。
  • 合规要求: PCI-DSS、GDPR、HIPAA 等。
实践建议: 在 CMDB 或服务目录中为每个服务打上 Tier 标签,流水线根据 Tier 自动选择 SLI 口径模板。例如 Tier-1 服务必须通过全量回归测试和性能基线验证才能部署。

2.4.2 技术栈

技术栈维度描述了服务的实现语言、框架、中间件依赖和部署形态。不同技术栈对流水线的要求差异巨大:

  • 语言与框架: Go + gRPC、Java + Spring Boot、Python + FastAPI、Node.js + Express。
  • 中间件: Redis、Kafka、RabbitMQ、MySQL、PostgreSQL、MongoDB。
  • 部署形态: 容器化(Kubernetes)、虚拟机、Serverless(FaaS)、裸金属。
  • 构建工具: Maven/Gradle、Go build、npm/pnpm、Bazel。

2.4.3 流量特征

流量特征描述了服务在生产环境中的请求模式,它直接影响压测 SLI 和容量规划口径:

  • QPS 峰值: 日常 QPS、大促峰值、突发流量倍数。
  • 请求模式: 读多写少(9:1)、写多读少(1:9)、读写均衡。
  • 调用链深度: 同步调用跳数、异步消息依赖、外部 API 依赖。
  • 流量来源: 用户端、内部服务、定时任务、外部 Webhook。

2.4.4 变更频率

变更频率是服务画像中最动态的维度,它决定了流水线的触发策略和部署节奏:

  • 高频变更: 每天 10+ 次部署,通常对应前端、BFF、配置中心服务。
  • 中频变更: 每天 1~5 次部署,对应大部分业务服务。
  • 低频变更: 每周/每月 1 次部署,对应基础库、中间件、数据管道。
  • 零变更: 只读服务、静态资源服务,流水线仅用于监控和告警。

2.5 服务画像与 SLI 口径的映射关系

服务画像的四个维度不是孤立存在的,它们共同决定了 CI/CD 流水线中每个阶段的 SLI 口径。下表展示了典型的映射关系:

流水线阶段 受影响的画像维度 SLI 口径示例
代码提交 → 静态分析 技术栈 Java 服务必须通过 Checkstyle + SpotBugs;Go 服务必须通过 golangci-lint
单元测试 → 集成测试 业务属性 + 技术栈 Tier-1 服务要求行覆盖率 ≥ 80%;Tier-3 服务要求 ≥ 50%
性能压测 流量特征 读多写少服务压测模型为 9:1 读写混合;突发型服务需模拟 2x 峰值流量
部署审批 变更频率 高频变更服务使用自动审批 + 金丝雀;低频变更服务需要人工审批
生产观测 业务属性 + 流量特征 Tier-1 服务 SLI 口径为 P99 延迟 + 错误率 + 饱和度;Tier-3 仅监控错误率

2.6 服务画像的落地流程

在实际组织中,服务画像的建立需要遵循以下步骤:

  1. 初始化: 从 CMDB 或服务目录导出所有服务列表,补充业务属性标签。
  2. 技术栈扫描: 通过代码仓库分析工具自动识别语言、框架、依赖。
  3. 流量基线采集: 从监控系统(Prometheus、Datadog)拉取过去 30 天的 QPS、延迟、错误率数据。
  4. 变更频率统计: 从 CI/CD 平台(Jenkins、GitLab CI、ArgoCD)统计过去 30 天的部署次数。
  5. 画像入库: 将四个维度的数据写入服务画像数据库,并关联到流水线配置。
  6. 持续更新: 设置定时任务(每周/每月)自动刷新流量特征和变更频率数据。
常见陷阱: 不要试图一次性为所有服务建立完整的画像。建议从 Tier-1 核心服务开始,逐步扩展到全量服务。画像的精度应该与服务的业务重要性成正比。

2.7 本章小结