← 返回首页
☁️

云原生12要素

📂 architecture ⏱ 1 min 177 words

云原生12要素

12要素概览

云原生12要素是构建可移植、可扩展SaaS应用的最佳实践,适用于任意语言和后端服务。

1. 基准代码      6. 进程
2. 依赖          7. 端口绑定
3. 配置          8. 并发
4. 后端服务      9. 易处理
5. 构建/发布/运行 10. 开发/生产等价
                11. 日志
                12. 管理进程

基准代码与依赖

一份代码多份部署,依赖显式声明避免隐式依赖。

# 显式声明依赖
FROM python:3.9-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
# 依赖锁定
# requirements.txt
flask==2.3.0
redis==5.0.0
sqlalchemy==2.0.0

配置外置

配置通过环境变量注入,不硬编码在代码中。

import os

class Config:
    DATABASE_URL = os.environ.get('DATABASE_URL', 'sqlite:///default.db')
    REDIS_URL = os.environ.get('REDIS_URL', 'redis://localhost:6379')
    API_KEY = os.environ.get('API_KEY')
    DEBUG = os.environ.get('DEBUG', 'false').lower() == 'true'

后端服务

后端服务作为附加资源通过URL绑定,不区分本地和第三方服务。

# 后端服务配置
services:
  database:
    url: postgresql://db:5432/app
    type: managed
  cache:
    url: redis://cache:6379
    type: self-hosted
  storage:
    url: s3://bucket-name
    type: third-party

进程与端口绑定

应用通过端口绑定提供服务,无需外部服务器。

# Flask端口绑定
from flask import Flask
app = Flask(__name__)

@app.route('/health')
def health():
    return {'status': 'ok'}

if __name__ == '__main__':
    port = int(os.environ.get('PORT', 8080))
    app.run(host='0.0.0.0', port=port)

并发与易处理

通过水平扩展进程实现并发,进程快速启动和优雅关闭。

# 优雅关闭
import signal
import sys

def shutdown_handler(signum, frame):
    print("收到关闭信号,正在清理...")
    cleanup_resources()
    sys.exit(0)

signal.signal(signal.SIGTERM, shutdown_handler)
signal.signal(signal.SIGINT, shutdown_handler)

开发/生产等价

开发环境和生产环境尽可能一致,减少环境差异导致的问题。

# docker-compose保持一致性
services:
  app:
    build: .
    environment:
      - DATABASE_URL=postgresql://db:5432/app
      - REDIS_URL=redis://cache:6379
    depends_on:
      - db
      - cache

日志与管理进程

日志作为事件流输出到标准输出/错误,管理进程作为一次性进程运行。

# 日志输出到stdout
import logging
import sys

handler = logging.StreamHandler(sys.stdout)
handler.setLevel(logging.INFO)
logging.getLogger().addHandler(handler)

# 管理脚本
# python manage.py migrate
# python manage.py createsuperuser