Language:Chinese VersionEnglish Version

让开发者无需等待运维即可发布产品的平台

平台工程是构建内部开发者平台的实践——包括工具、工作流和自助服务能力,使应用开发者能够专注于功能而非基础设施。它已成为软件工程中增长最快的学科之一,这一趋势源于一个简单的观察:超过一定规模的团队都会重新发明相同的内部工具,而这种重新发明的成本很高。本指南涵盖了平台工程实际涉及的内容、用于构建它的具体工具,以及关于何时值得投资的诚实指导。

平台工程解决的问题

没有平台团队,应用开发者通常会将20-30%的时间花在与产品核心无关的任务上:

  • 为新服务配置CI/CD流水线
  • 设置Kubernetes部署、服务和入口
  • 管理密钥(轮换凭证、更新环境变量)
  • 申请并等待新的数据库、队列或存储桶
  • 为新服务配置监控和告警
  • 处理生产环境访问的合规要求

平台团队构建自助服务系统以减少这种开销。产出不仅仅是工具——它减少了认知负荷和等待时间,从而减缓了产品工程的进度。

内部开发者门户:Backstage

Spotify的Backstage已成为内部开发者门户的标准基础。它提供服务目录、用于引导新服务的软件模板,以及一个插件系统,用于将所有内部工具集成到一个界面中。

# 安装Backstage
npx @backstage/create-app@latest
cd my-platform
yarn dev

# 或使用官方Docker镜像
docker run -p 7007:7007 spotify/backstage

服务目录是核心:一个可以查看每个服务、其所有者、文档、部署状态和依赖关系的单一位置。

# catalog-info.yaml — 检入到每个服务的仓库中
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: order-service
  title: Order Service
  description: 处理订单创建、管理和履行
  annotations:
    github.com/project-slug: myorg/order-service
    backstage.io/techdocs-ref: dir:.
    pagerduty.com/service-id: P1234
    datadog/service-name: order-service
  tags:
    - java
    - kafka
    - payments
spec:
  type: service
  owner: team-commerce
  lifecycle: production
  dependsOn:
    - component:payment-service
    - component:inventory-service
    - resource:orders-postgres
  providesApis:
    - order-api

软件模板让开发者无需阅读文档即可搭建新服务:

# template.yaml — 新微服务的软件模板
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: java-microservice
  title: Java Spring Boot 微服务
  description: 创建一个新的 Java 微服务,预配置了 CI/CD、监控和部署功能
spec:
  parameters:
    - title: 服务详情
      properties:
        name:
          title: 服务名称
          type: string
          pattern: '^[a-z][a-z0-9-]*$'
        owner:
          title: 所有者团队
          type: string
          ui:field: OwnerPicker
        description:
          title: 描述
          type: string

  steps:
    - id: fetch-template
      name: 获取模板
      action: fetch:template
      input:
        url: ./skeleton
        values:
          name: ${{ parameters.name }}
          owner: ${{ parameters.owner }}

    - id: create-github-repo
      name: 创建 GitHub 仓库
      action: publish:github
      input:
        repoUrl: github.com?repo=${{ parameters.name }}&owner=myorg
        defaultBranch: main

    - id: register-in-catalog
      name: 在目录中注册
      action: catalog:register
      input:
        repoContentsUrl: ${{ steps['create-github-repo'].output.repoContentsUrl }}
        catalogInfoPath: /catalog-info.yaml

    - id: create-datadog-monitor
      name: 创建监控
      action: http:backstage:request
      input:
        method: POST
        path: /api/proxy/datadog/monitor
        body:
          name: "错误率 - ${{ parameters.name }}"
          type: metric alert
          query: "avg(last_5m):sum:trace.servlet.request.errors{service:${{ parameters.name }}} / sum:trace.servlet.request.hits{service:${{ parameters.name }}} > 0.05"

开发者运行此模板,填写表单,即可获得一个生产就绪的仓库,包含 CI/CD、Kubernetes 清单、监控和目录注册功能 — 全部在 5 分钟内完成,无需等待任何运维团队的参与。

基础设施即自助服务:Crossplane

Crossplane 扩展了 Kubernetes,使其能够使用与应用程序相同的 GitOps 工作流来管理外部云资源。这正是平台团队如何为开发者提供对数据库、队列和存储的自助访问权限,而无需暴露云凭证。

# 开发者通过提交 Kubernetes 资源创建数据库
# 平台团队定义了"数据库"在其环境中的含义
apiVersion: database.platform.mycompany.com/v1alpha1
kind: PostgresDatabase
metadata:
  name: order-service-db
  namespace: team-commerce
spec:
  storageGB: 20
  version: "16"
  tier: standard          # 平台团队定义了'standard'的含义
  backupEnabled: true
  maintenanceWindow: "sun:03:00-sun:04:00"
# 在幕后,Crossplane 将此转换为 AWS RDS 实例
# 平台团队定义了 Composition
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: postgres-database-aws
spec:
  compositeTypeRef:
    apiVersion: database.platform.mycompany.com/v1alpha1
    kind: PostgresDatabase
  resources:
    - name: rds-instance
      base:
        apiVersion: rds.aws.upbound.io/v1beta1
        kind: Instance
        spec:
          forProvider:
            region: us-east-1
            engine: postgres
            instanceClass: db.t3.medium
            allocatedStorage: 20
            backupRetentionPeriod: 7
      patches:
        - type: FromCompositeFieldPath
          fromFieldPath: spec.storageGB
          toFieldPath: spec.forProvider.allocatedStorage

应用程序开发者声明他们的需求。平台团队控制如何配置这些资源。合规性、成本控制和最佳实践都被编码在 Composition 中,而不是记录在无人阅读的 wiki 中。

内部黄金路径:有主见的默认值

平台团队最具影响力的产出往往不是工具,而是一套有主见的默认值——即常见任务的”黄金路径”。黄金路径是做某事的推荐方式,被实现为模板或工具,使正确的选择变得简单易行。

值得构建的黄金路径示例:

  • 服务模板:包含预配置的 Dockerfile、Kubernetes 清单、CI 管道和可观测性的 GitHub 仓库模板
  • 密钥模板:使用 Vault 或 AWS Secrets Manager 的标准模式——开发者获得文档化的工作示例,而不是从头开始摸索
  • 可观测性模板:为新服务预构建的 Grafana 仪表板——错误率、延迟、饱和度——在新服务创建时自动配置
  • 运行手册模板:每个服务使用的标准运行手册结构,包含相同的章节和升级路径

衡量平台工程的成功

平台团队就是基础设施团队——他们的客户是内部开发者。正确的指标应反映开发者的生产力和满意度,而不是平台正常运行时间:

  • 新服务的首次部署时间:从仓库创建到首次生产部署。纵向跟踪这一指标。
  • 开发者体验评分:季度调查,要求开发者对其工作流程中的摩擦程度进行评分(1-10分)
  • 自助服务比例:无需人工运维工单即可完成的基础设施请求百分比
  • DORA指标:部署频率、变更前置时间、变更失败率、恢复时间——平台团队的工作应当推动这些指标改善

平台工程何时为时过早

平台工程有成本:它需要那些不构建产品功能的工程师。问题是这项投资是否比直接的产品工作创造更多价值。

当以下情况出现时,平台工程为时过早:

  • 您的工程团队少于15-20人
  • 生产环境中的服务少于5-10个
  • 每个团队仍然能够端到端地理解整个技术栈
  • 基础设施工作不是可衡量的瓶颈

当以下情况出现时,平台工程变得值得:

  • 多个团队在重复基础设施设置工作
  • 新团队入职需要数周时间,因为内部工具没有文档记录
  • 开发者需要等待运维工单才能获得基本资源配置
  • 安全和合规控制被绕过,因为合规路径太慢

原则与任何共享基础设施相同:当没有平台的成本超过构建平台的成本时,投资平台。在小规模情况下,一个组织良好的Wiki和一些shell脚本就是您的平台。随着规模扩大,自助服务工具的投资会产生复合效应——每个能够独立部署的开发者,都是不需要等待他人的开发者。

By Michael Sun

Founder and Editor-in-Chief of NovVista. Software engineer with hands-on experience in cloud infrastructure, full-stack development, and DevOps. Writes about AI tools, developer workflows, server architecture, and the practical side of technology. Based in China.

Leave a Reply

Your email address will not be published. Required fields are marked *

You missed