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