引言
平台工程(Platform Engineering)是DevOps的演进,通过构建内部开发者平台(Internal Developer Platform,IDP)为开发者提供自助式服务,降低认知负担,提升开发效率。
本文将介绍平台工程的核心概念、架构设计和实践案例。
平台工程的核心理念
从DevOps到平台工程
DevOps模式:
┌─────────────────────────────────────────────────────┐
│ 开发者 │
│ ├─ 写代码 │
│ ├─ 配置CI/CD │
│ ├─ 管理Kubernetes │
│ ├─ 配置监控告警 │
│ └─ 处理基础设施问题 │
│ │
│ 问题:认知负担重,每个团队重复造轮子 │
└─────────────────────────────────────────────────────┘
平台工程模式:
┌─────────────────────────────────────────────────────┐
│ 平台团队 │
│ ├─ 构建IDP(内部开发者平台) │
│ ├─ 提供自助式服务 │
│ ├─ 标准化最佳实践 │
│ └─ 自动化运维 │
│ │
│ 开发者 │
│ ├─ 写代码 │
│ └─ 使用IDP自助部署 │
│ │
│ 优势:降低认知负担,提升开发效率 │
└─────────────────────────────────────────────────────┘
平台工程的关键原则
- 自助式优先:开发者无需等待平台团队,可自助完成常见任务
- 黄金路径:提供标准化的最佳实践,降低出错概率
- 抽象复杂性:隐藏底层基础设施细节
- 可观测性内置:默认集成监控、日志、追踪
内部开发者平台架构
核心组件
┌─────────────────────────────────────────────────────────┐
│ Internal Developer Platform │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ 开发者门户 │ │ 服务目录 │ │ 模板引擎 │ │
│ │ (Backstage) │ │ (Catalog) │ │ (Scaffold) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ CI/CD编排 │ │ 基础设施 │ │ 可观测性 │ │
│ │ (Tekton) │ │ (Terraform) │ │ (Grafana) │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ Kubernetes / Cloud Infrastructure │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
Backstage:开源开发者门户
# Backstage组件配置(catalog-info.yaml)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: user-service
description: "用户管理服务"
annotations:
backstage.io/techdocs-ref: dir:.
github.com/project-slug: my-org/user-service
prometheus.io/rule: alertname="HighErrorRate",job="user-service"
spec:
type: service
lifecycle: production
owner: team-backend
system: e-commerce-platform
providesApis:
- user-api
consumesApis:
- payment-api
- notification-api
---
apiVersion: backstage.io/v1alpha1
kind: API
metadata:
name: user-api
description: "用户管理API"
spec:
type: openapi
lifecycle: production
owner: team-backend
definition:
$text: ./api/openapi.yaml
// Backstage插件开发示例
import { createPlugin, createRoutableExtension } from '@backstage/core-plugin-api';
import { rootRouteRef } from './routes';
export const deploymentPlugin = createPlugin({
id: 'deployment',
routes: {
root: rootRouteRef,
},
});
export const DeploymentPage = deploymentPlugin.provide(
createRoutableExtension({
name: 'DeploymentPage',
component: () =>
import('./components/DeploymentPage').then(m => m.DeploymentPage),
mountPoint: rootRouteRef,
}),
);
自助式服务目录
服务模板(Scaffolder)
# 微服务模板定义
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: microservice-template
title: "微服务模板"
description: "创建标准化的微服务项目"
tags:
- go
- microservice
- recommended
spec:
owner: platform-team
type: service
parameters:
- title: 基本信息
required:
- name
- owner
properties:
name:
title: 服务名称
type: string
description: "服务名称(小写字母、数字、连字符)"
pattern: '^[a-z0-9-]+$'
owner:
title: 负责团队
type: string
ui:field: OwnerPicker
ui:options:
allowedKinds:
- Group
description:
title: 服务描述
type: string
- title: 技术栈
required:
- language
- database
properties:
language:
title: 编程语言
type: string
enum:
- go
- java
- nodejs
- python
database:
title: 数据库
type: string
enum:
- postgresql
- mysql
- mongodb
enableGrpc:
title: 启用gRPC
type: boolean
default: false
steps:
- id: fetch-template
name: 获取模板
action: fetch:template
input:
url: ./skeleton
values:
name: ${{ parameters.name }}
owner: ${{ parameters.owner }}
description: ${{ parameters.description }}
language: ${{ parameters.language }}
database: ${{ parameters.database }}
enableGrpc: ${{ parameters.enableGrpc }}
- id: create-repo
name: 创建代码仓库
action: publish:github
input:
allowedHosts: ['github.com']
repoUrl: github.com?owner=my-org&repo=${{ parameters.name }}
defaultBranch: main
- id: register
name: 注册到服务目录
action: catalog:register
input:
repoContentsUrl: ${{ steps['create-repo'].output.repoContentsUrl }}
catalogInfoPath: '/catalog-info.yaml'
output:
links:
- title: 代码仓库
url: ${{ steps['create-repo'].output.remoteUrl }}
- title: 服务目录
icon: catalog
entityRef: ${{ steps['register'].output.entityRef }}
基础设施自助申请
# 数据库自助申请模板
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
name: database-provision
title: "申请数据库"
description: "自助申请PostgreSQL数据库实例"
spec:
owner: platform-team
type: infrastructure
parameters:
- title: 数据库配置
required:
- name
- environment
- size
properties:
name:
title: 数据库名称
type: string
environment:
title: 环境
type: string
enum:
- development
- staging
- production
size:
title: 规格
type: string
enum:
- small
- medium
- large
enumNames:
- "小型(2核4G,100GB)"
- "中型(4核8G,500GB)"
- "大型(8核16G,1TB)"
backupEnabled:
title: 启用自动备份
type: boolean
default: true
steps:
- id: provision
name: 创建数据库
action: terraform:apply
input:
modulePath: ./modules/postgresql
variables:
name: ${{ parameters.name }}
environment: ${{ parameters.environment }}
size: ${{ parameters.size }}
backup_enabled: ${{ parameters.backupEnabled }}
- id: notify
name: 发送通知
action: slack:send-message
input:
channel: '#infrastructure-requests'
message: |
数据库已创建:${{ parameters.name }}
环境:${{ parameters.environment }}
规格:${{ parameters.size }}
连接信息已发送到申请者的邮箱
output:
text:
- title: 连接信息
content: |
Host: ${{ steps.provision.outputs.host }}
Port: ${{ steps.provision.outputs.port }}
Database: ${{ steps.provision.outputs.database }}
Username: ${{ steps.provision.outputs.username }}
Password: (已发送到邮箱)
开发者工作流优化
本地开发环境标准化
# devcontainer配置(.devcontainer/devcontainer.json)
{
"name": "Go Microservice",
"image": "mcr.microsoft.com/devcontainers/go:1.21",
"features": {
"ghcr.io/devcontainers/features/docker-in-docker:2": {},
"ghcr.io/devcontainers/features/kubectl-helm-minikube:1": {}
},
"postCreateCommand": "make dev-setup",
"customizations": {
"vscode": {
"extensions": [
"golang.go",
"ms-azuretools.vscode-docker",
"ms-kubernetes-tools.vscode-kubernetes-tools"
],
"settings": {
"go.toolsManagement.checkForUpdates": "local",
"go.useLanguageServer": true,
"go.gopath": "/go"
}
}
},
"forwardPorts": [8080, 5432, 6379],
"portsAttributes": {
"8080": { "label": "API Server" },
"5432": { "label": "PostgreSQL" },
"6379": { "label": "Redis" }
}
}
标准化Makefile
# 标准化Makefile模板
.PHONY: dev test build deploy
# 开发环境
dev:
docker-compose up -d
go run cmd/server/main.go
# 测试
test:
go test -v -race -coverprofile=coverage.out ./...
go tool cover -html=coverage.out -o coverage.html
test-integration:
go test -v -tags=integration ./test/integration/...
# 构建
build:
docker build -t $(IMAGE_NAME):$(VERSION) .
# 部署
deploy-dev:
kubectl apply -f k8s/dev/
deploy-staging:
kubectl apply -f k8s/staging/
deploy-prod:
@echo "请通过GitOps流程部署到生产环境"
# 代码质量
lint:
golangci-lint run
format:
gofmt -w .
goimports -w .
# 数据库迁移
migrate-up:
goose -dir migrations postgres "$(DB_URL)" up
migrate-down:
goose -dir migrations postgres "$(DB_URL)" down
可观测性内置
默认监控配置
# Prometheus ServiceMonitor(自动创建)
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: ${service-name}-monitor
labels:
app: ${service-name}
spec:
selector:
matchLabels:
app: ${service-name}
endpoints:
- port: metrics
interval: 15s
path: /metrics
---
# 默认告警规则
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: ${service-name}-alerts
spec:
groups:
- name: ${service-name}
rules:
- alert: HighErrorRate
expr: |
rate(http_requests_total{service="${service-name}", status=~"5.."}[5m])
/
rate(http_requests_total{service="${service-name}"}[5m]) > 0.05
for: 5m
labels:
severity: critical
annotations:
summary: "高错误率告警"
description: "${service-name} 错误率超过5%"
- alert: HighLatency
expr: |
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket{service="${service-name}"}[5m])) > 1
for: 5m
labels:
severity: warning
annotations:
summary: "高延迟告警"
description: "${service-name} P95延迟超过1秒"
度量平台工程效果
关键指标
// 平台工程指标采集
interface PlatformMetrics {
// 开发者效率指标
leadTime: number; // 从代码提交到生产部署的时间
deploymentFrequency: number; // 每周部署次数
changeFailureRate: number; // 变更失败率
meanTimeToRecovery: number; // 平均恢复时间
// 平台使用指标
selfServiceRate: number; // 自助服务比例
ticketVolume: number; // 工单数量
timeToFirstDeploy: number; // 新服务首次部署时间
// 开发者满意度
developerNPS: number; // 开发者NPS分数
onboardingTime: number; // 新员工上手时间
}
// 定期调研问卷
const surveyQuestions = [
{
question: "使用IDP部署新服务的体验如何?",
type: "rating",
scale: 1-5
},
{
question: "平台文档是否清晰易懂?",
type: "rating",
scale: 1-5
},
{
question: "你希望平台增加哪些功能?",
type: "open-text"
}
];
总结
平台工程通过构建内部开发者平台(IDP),为开发者提供自助式服务,显著提升开发效率:
- 自助式服务:开发者无需等待平台团队,可自助完成常见任务
- 标准化模板:提供黄金路径,降低出错概率
- 抽象复杂性:隐藏底层基础设施细节
- 可观测性内置:默认集成监控、日志、追踪
平台工程的目标是让开发者专注于业务逻辑,而不是基础设施运维。
延伸阅读
- Platform Engineering - Martin Fowler
- Backstage Documentation
- Team Topologies - Matthew Skelton
- Internal Developer Platform
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。