云原生领域技能Skill domain-cloud-native

本技能专注于使用 Rust 语言构建符合云原生原则的应用程序。它涵盖了在 Kubernetes、Docker 等容器化环境中设计和实现微服务的关键约束、模式和最佳实践。核心内容包括无状态设计、优雅关闭、可观测性(追踪与指标)、健康检查、12要素应用配置以及相关的 Rust 生态系统库(如 tonic, tracing, kube)。适用于开发高可用、可扩展、易于运维的分布式云服务。关键词:云原生,微服务,容器,Kubernetes,Docker,Rust,可观测性,无状态,优雅关闭,健康检查。

云原生架构 0 次安装 0 次浏览 更新于 2/27/2026

name: domain-cloud-native description: “用于构建云原生应用。关键词:kubernetes, k8s, docker, container, grpc, tonic, microservice, service mesh, observability, tracing, metrics, health check, cloud, deployment, 云原生, 微服务, 容器” user-invocable: false

云原生领域

第3层:领域约束

领域约束 → 设计影响

领域规则 设计约束 Rust 实现含义
12要素应用 配置来自环境 基于环境的配置
可观测性 指标 + 追踪 tracing + opentelemetry
健康检查 存活/就绪探针 专用端点
优雅关闭 清理终止 信号处理
水平扩展 无状态设计 无本地状态
容器友好 小体积二进制文件 发布优化

关键约束

无状态设计

规则:无本地持久化状态
原因:Pod 可能随时被终止/重新调度
RUST:外部状态(Redis, DB),不使用静态可变变量

优雅关闭

规则:处理 SIGTERM,排干连接
原因:零停机部署
RUST:tokio::signal + 优雅关闭

可观测性

规则:每个请求必须可追踪
原因:调试分布式系统
RUST:tracing spans, opentelemetry 导出

向下追踪 ↓

从约束到设计(第2层):

"需要分布式追踪"
    ↓ m12-lifecycle: Span 生命周期
    ↓ tracing + opentelemetry

"需要优雅关闭"
    ↓ m07-concurrency: 信号处理
    ↓ m12-lifecycle: 连接排干

"需要健康检查"
    ↓ domain-web: HTTP 端点
    ↓ m06-error-handling: 健康状态

关键 Crate

用途 Crate
gRPC tonic
Kubernetes kube, kube-runtime
Docker bollard
追踪 tracing, opentelemetry
指标 prometheus, metrics
配置 config, figment
健康检查 HTTP 端点

设计模式

模式 目的 实现
gRPC 服务 服务网格 tonic + tower
K8s 操作符 自定义资源 kube-runtime Controller
可观测性 调试 tracing + OTEL
健康检查 编排 /health, /ready
配置 12要素应用 环境变量 + 密钥

代码模式:优雅关闭

use tokio::signal;

async fn run_server() -> anyhow::Result<()> {
    let app = Router::new()
        .route("/health", get(health))
        .route("/ready", get(ready));

    let addr = SocketAddr::from(([0, 0, 0, 0], 8080));

    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .with_graceful_shutdown(shutdown_signal())
        .await?;

    Ok(())
}

async fn shutdown_signal() {
    signal::ctrl_c().await.expect("failed to listen for ctrl+c");
    tracing::info!("shutdown signal received");
}

健康检查模式

async fn health() -> StatusCode {
    StatusCode::OK
}

async fn ready(State(db): State<Arc<DbPool>>) -> StatusCode {
    match db.ping().await {
        Ok(_) => StatusCode::OK,
        Err(_) => StatusCode::SERVICE_UNAVAILABLE,
    }
}

常见错误

错误 违反领域规则 修复方法
本地文件状态 非无状态 外部存储
无 SIGTERM 处理 硬终止 优雅关闭
无追踪 无法调试 tracing spans
静态配置 非12要素应用 环境变量

追踪到第1层

约束 第2层模式 第1层实现
无状态 外部状态 Arc<Client> 用于外部
优雅关闭 信号处理 tokio::signal
追踪 Span 生命周期 tracing + OTEL
健康检查 HTTP 端点 专用路由

相关技能

何时 参见
异步模式 m07-concurrency
HTTP 端点 domain-web
错误处理 m13-domain-error
资源生命周期 m12-lifecycle