关于 domain-cloud-native
面向 Rust 云原生开发的领域参考资料,将无状态设计、可观测性和优雅关闭等约束关联到设计模式与实现方式。适用于构建服务及 Kubernetes 工作负载的开发者。
主要功能
- 01说明云原生设计约束
- 02关联约束与 Rust 实现
- 03列出常用 Crate
- 04提供健康检查与关闭模式
适用场景
- 01规划无状态服务架构
- 02为服务添加追踪与健康检查
- 03设计 SIGTERM 优雅关闭流程
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ actionbook/ rust-skills --skill domain-cloud-native安装后在 Claude Code 中输入/domain-cloud-native确认已加载。
详细介绍
云原生领域
第 3 层:领域约束
领域约束 → 设计影响
| 领域规则 | 设计约束 | Rust 影响 |
|---|---|---|
| 12 因子 | 从环境变量读取配置 | 基于环境的配置 |
| 可观测性 | 指标 + 追踪 | tracing + opentelemetry |
| 健康检查 | 存活/就绪 | 专用端点 |
| 优雅关闭 | 平稳终止 | 信号处理 |
| 水平扩展 | 无状态设计 | 不使用本地状态 |
| 容器友好 | 小型二进制文件 | 发布优化 |
关键约束
无状态设计
RULE: No local persistent state
WHY: Pods can be killed/rescheduled anytime
RUST: External state (Redis, DB), no static mut
优雅关闭
RULE: Handle SIGTERM, drain connections
WHY: Zero-downtime deployments
RUST: tokio::signal + graceful shutdown
可观测性
RULE: Every request must be traceable
WHY: Debugging distributed systems
RUST: tracing spans, opentelemetry export
向下追溯 ↓
从约束到设计(第 2 层):
"Need distributed tracing"
↓ m12-lifecycle: Span lifecycle
↓ tracing + opentelemetry
"Need graceful shutdown"
↓ m07-concurrency: Signal handling
↓ m12-lifecycle: Connection draining
"Need health checks"
↓ domain-web: HTTP endpoints
↓ m06-error-handling: Health status
关键 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 |
| 优雅关闭 | 信号处理 | tokio::signal |
| 追踪 | Span 生命周期 | tracing + OTEL |
| 健康检查 | HTTP 端点 | 专用路由 |
相关技能
| 场景 | 参见 |
|---|---|
| 异步模式 | m07-concurrency |
| HTTP 端点 | domain-web |
| 错误处理 | m13-domain-error |
| 资源生命周期 | m12-lifecycle |
评论
支持 Markdown