云原生12要素
云原生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