Please check the build logs for more information.
See Builds for ideas on how to fix a failed build, or Metadata for how to configure docs.rs builds.
If you believe this is docs.rs' fault, open an issue.
中文 | English
SDForge 是一个基于 Rust 的声明式 SDK 框架,利用过程宏从统一的函数注解自动生成多协议服务接口(HTTP + MCP + gRPC + WebSocket + CLI)。其核心创新在于通过 Cargo features 进行编译时协议选择——未使用的协议将产生零编译代码。
✨ 功能特性 • 🚀 快速开始 • 📚 文档 • 💻 示例 • 🤝 参与贡献
📋 目录
- ✨ 功能特性
- 🚀 快速开始
- 🎨 特性标志
- 📚 文档
- 💻 示例
- 🏗️ 架构
- 📜 OpenAPI 自动生成
- 🔄 MCP 2026-07-28 迁移指南
- 🚀 生产部署
- 🐛 故障排查
- 🧪 测试
- 📊 性能
- 🔒 安全
- 🗺️ 开发路线图
- 🤝 参与贡献
- 📋 更新日志
- 📄 许可证
- 🙏 致谢
- 📞 联系与支持
- ⭐ Star 历史
✨ 功能特性
| 特性 | 说明 |
|---|---|
| 🎯 统一接口定义 | 针对 HTTP、MCP、gRPC、WebSocket、CLI 的单一宏配置 |
| ⚡ 编译时协议选择 | 通过 Feature 控制代码生成,未使用的协议零运行时开销 |
| 🔒 类型安全 | 接口定义的编译时验证 |
| 🌐 多协议支持 | HTTP (Axum)、MCP (rmcp 3.2)、gRPC (tonic)、WebSocket、SSE 流式传输、CLI (clap) |
| 🧩 模块化设计 | 基于 Feature 的架构,允许仅选择所需功能 |
| 🛡️ 安全特性 | 内置认证(Bearer/API Key)、限流(limiteron)、审计日志 |
| 💾 缓存 | 基于内存缓存(oxcache),无需外部数据库 |
| 🔧 配置管理 | 自包含的 TOML 配置(无需外部配置中心) |
| 📊 版本控制 | 内置 API 版本管理 |
| 📜 OpenAPI 自动生成 | 基于 utoipa 5.5 生成 OpenAPI 3.1 规范 |
| 🌐 国际化 | 基于 ICU4X 2.x 的本地化支持(i18n feature) |
🔌 可选功能
以下能力均通过 Cargo feature 按需启用,详见特性标志:
| 可选功能 | 对应 Feature | 说明 |
|---|---|---|
| HTTP 服务器 | http |
Axum 0.8 路由、中间件、版本路由 |
| MCP 协议 | mcp |
rmcp 官方 SDK,2026-07-28 规范(无状态 HTTP 头协议、MRTR、缓存语义) |
| SSE 流式传输 | streaming |
SSE 事件流与流式响应构建 |
| WebSocket | websocket |
连接管理、广播、消息解析 |
| gRPC | grpc |
tonic 服务、统一 handler dispatch |
| CLI | cli |
clap 命令行集成、一站式 CliBuilder::execute() |
| OpenAPI 3.1 | openapi |
编译时注册路由信息,运行时生成规范 |
| 统一文档输出 | docs |
Swagger UI + CLI/MCP Markdown |
| 认证与审计 | security |
API Key / JWT Bearer、审计日志、安全头 |
| 限流 | ratelimit / ratelimit-http |
limiteron 统一限流(核心 / Tower 中间件) |
| 缓存 | cache |
oxcache 内存缓存(LRU、模式失效、统计) |
| 响应时间戳 | timestamp |
自动向响应添加时间戳 |
| 结构化日志 | logging |
结构化请求日志 |
| inklog 集成 | inklog |
桥接到 inklog LoggerManager 结构化日志管道 |
| 国际化 | i18n |
ICU4X 本地化格式化与 Accept-Language 解析 |
| SIMD JSON | simd-json |
SIMD 加速 JSON 序列化 |
🆕 Phase 1 架构改进
近期的架构增强包括:
- 🔄 统一注册系统 — 通过 trait 抽象与过程宏,消除 HTTP、MCP、WebSocket、gRPC 模块间 95+ 行重复代码
- ⚙️ 模块化配置管理 — 配置重构为独立模块(app、cache、security),集中默认值并支持 Builder 模式
- 🔐 增强安全模块 — API Key 版本管理、LRU 缓存、带审计日志的密钥轮换、完善的安全头配置
- 💾 高级缓存 — 基于模式的缓存失效、键规范化、批量操作与统计信息跟踪
🚀 快速开始
📦 安装
或手动添加到 Cargo.toml:
[]
= { = "0.5.0-rc.2", = ["http"] }
注意:
sdforge默认不启用任何特性(default = []),需按需显式启用协议特性。
💡 基本用法
使用单个宏定义你的 API:
use *;
async
async
📁 模块前缀
使用模块前缀对相关 API 进行分组:
这将生成端点:
/auth/api/v1/login/auth/api/v1/logout
🔢 多版本管理
同时支持多个 API 版本:
async
async
这将生成带版本的端点:
/api/v1/users/:id→get_user_v1/api/v2/users/:id→get_user_v2
🛤️ 路径参数
遵循 Rust 命名规范提取路径参数。宏自动将路径段映射到函数参数:
async
🔹 多个路径参数
对于嵌套资源:
async
async
⚠️ 错误处理
定义自定义错误类型并转换为 ServiceError:
use Error;
🔧 #[forge] 宏参数
| 参数 | 说明 | 必填 | 默认值 |
|---|---|---|---|
name |
端点名称 | 是 | - |
version |
API 版本 | 是 | - |
path |
HTTP 路径(如 /users/:id) |
否 | - |
method |
HTTP 方法(GET/POST/PUT/DELETE 等) | 否 | GET |
status |
显式声明成功状态码(如 201 用于 POST 创建) | 否 | 200 |
description |
端点描述 | 否 | - |
tool_name |
MCP 工具名称 | 否 | - |
grpc_method |
gRPC 方法名(启用 grpc feature 时生效) |
否 | - |
cli |
是否注册为 CLI 命令(启用 cli feature 时生效) |
否 | false |
🌐 协议组合
仅 HTTP — 传统 REST API:
[]
= { = "0.5.0-rc.2", = ["http"] }
仅 MCP — AI 工具集成:
[]
= { = "0.5.0-rc.2", = ["mcp"] }
双协议 — 同一份代码同时通过 HTTP 与 MCP 暴露:
[]
= { = "0.5.0-rc.2", = ["http", "mcp"] }
全量特性 — 启用全部能力:
[]
= { = "0.5.0-rc.2", = ["full"] }
🛰️ gRPC Dispatch
启用 grpc feature 后,#[forge(grpc_method = "...")] 会通过 inventory 注册到
SdForgeGrpcService,由其 call() 方法路由到对应 handler。返回值需满足
serde::Serialize,错误类型需为 ApiError:
[]
= { = "0.5.0-rc.2", = ["grpc"] }
use *;
use forge;
async
async
🖥️ CLI Dispatch
启用 cli feature 后,#[forge(cli = true)] 会注册 CliCommandRegistration +
CliHandlerRegistration,由 CliBuilder::execute() 一站式完成 build / parse /
dispatch / 输出 / 退出。返回 Value::String 时输出原始串(不带引号),其他类型
输出 JSON:
[]
= { = "0.5.0-rc.2", = ["cli"] }
= { = "1", = ["rt-multi-thread", "macros"] }
use CliBuilder;
use ApiError;
use forge;
async
async
# 运行:cargo run --example basic_cli --features cli -- echo --name world
# 输出:Hello, world! (无引号 —— 智能提取 Value::String)
🎨 特性标志
SDForge 使用 Cargo features 进行编译时协议选择和特性组合。
| 特性 | 描述 | 默认 |
|---|---|---|
http |
HTTP 服务器 (Axum 0.8) | ❌ |
mcp |
MCP 协议 (rmcp 3.2, 2026-07-28 规范) | ❌ |
streaming |
SSE 流式传输支持 | ❌ |
timestamp |
自动向响应添加时间戳 | ❌ |
logging |
结构化请求日志 | ❌ |
security |
安全特性 (认证, 限流, 审计) | ❌ |
ratelimit |
限流核心 (基于 limiteron,不依赖 http) | ❌ |
ratelimit-http |
HTTP 限流中间件 (Tower middleware) | ❌ |
websocket |
WebSocket 支持 | ❌ |
grpc |
gRPC 支持 (tonic) | ❌ |
cache |
缓存支持 (oxcache) | ❌ |
openapi |
自动 OpenAPI 3.1 规范生成 | ❌ |
cli |
CLI 集成 (clap) | ❌ |
docs |
统一文档输出 (Swagger UI + Markdown) | ❌ |
inklog |
inklog 结构化日志集成 | ❌ |
i18n |
ICU4X 国际化 (本地化格式化) | ❌ |
simd-json |
SIMD 加速 JSON 序列化 | ❌ |
full |
启用所有运行时特性 | ❌ |
🔗 特性依赖关系
default: 空(无预启用特性,需按需显式启用)mcp/grpc/openapi/cli/streaming/cache: 独立于httpsecurity: 启用http、ratelimit-http(含ratelimit)与cache,并引入 hmac/sha2/uuid 等安全依赖ratelimit-http: 需要http+ratelimitwebsocket: 需要http+streamingdocs: 需要openapi+cli(Swagger UI 子模块需额外启用http)kit: trait-kit AsyncKit 集成,需要limiteron-integration+trait-kitfull: 启用全部运行时特性(不含simd-json与hex工具特性)
🔨 构建与测试
# 默认(无特性)
# HTTP 协议
# MCP 协议
# 完整功能
# 自定义特性集
# 测试
# 格式化与 Lint
📚 文档
| 文档 | 说明 |
|---|---|
| 📖 用户指南 | 从安装到进阶的完整使用教程 |
| 📘 API 参考 | 全部公开 API 的详细说明 |
| 🏗️ 架构文档 | 设计理念与内部实现 |
| 🔒 安全文档 | 安全设计与最佳实践 |
| ⚡ 性能基准 | 特性门控 vs 全量打包的编译时间/体积对比 |
| 📋 更新日志 | 每个版本的变更记录 |
| 🤝 贡献指南 | 如何参与项目开发 |
| 📦 在线 API 文档 | docs.rs 自动生成的最新文档 |
💻 示例
仓库包含两类示例。
可运行示例(根包 cargo run --example)
| 示例 | 所需特性 | 说明 |
|---|---|---|
basic_cli |
cli |
#[forge(cli = true)] + CliBuilder 一站式 CLI 入口 |
swagger_demo |
docs |
Swagger UI 路由 + axum serve |
perf_regex_cache |
cache |
正则缓存性能验证 |
perf_lru_eviction |
cache |
LRU 驱逐性能验证 |
perf_prefix_index |
cache |
前缀索引性能验证 |
perf_batch_ops |
cache |
批量操作性能验证 |
# CLI 示例
# Swagger UI 示例
# 缓存性能示例
综合示例库(workspace 成员 sdforge-examples,examples/src/)
| 模块 | 内容 |
|---|---|
basics/ |
简单 API、响应构建、类型与错误处理 |
http/ |
路由(路径参数、查询参数)、中间件(CORS) |
mcp/ |
工具定义与注册、MCP 2026-07-28 迁移(migration_2026.rs)、MRTR 会话(mrtr_example.rs) |
security/ |
API Key 认证、认证失败场景、完整安全栈(comprehensive.rs) |
cache/ |
高级缓存模式(二级缓存、Cache-Aside、Write-Through) |
config/ |
配置管理(app_config.rs) |
streaming/ |
SSE 流式响应 |
websocket/ |
基础用法与聊天室示例 |
grpc/ |
gRPC 服务端 |
logging/ |
结构化日志 |
openapi/ |
OpenAPI 规范生成(OpenApiBuilder、generate_openapi_spec) |
combined/ |
多特性组合的完整示例(full_example.rs) |
# 运行综合示例库的全部模块测试
示例配置文件位于 examples/config/(default.toml、minimal.toml、production.toml、api-key-auth.toml)。
🏗️ 架构
SDForge 采用「统一宏注解 → 编译期协议门控 → inventory 运行时注册」的架构。完整设计说明见 架构文档。
sdforge/
├── src/ # 主框架 crate
│ ├── core/ # 核心类型、错误处理、验证
│ ├── error/ # 框架错误类型(ApiError、SdForgeError)
│ ├── http/ # HTTP 协议实现 (Axum)
│ ├── mcp/ # MCP 协议实现 (rmcp)
│ ├── security/ # 安全特性 (认证、限流、审计)
│ ├── cache/ # 缓存集成 (oxcache)
│ ├── websocket/ # WebSocket 支持
│ ├── grpc/ # gRPC 支持 (tonic)
│ ├── streaming/ # SSE 流式支持
│ ├── cli/ # CLI 集成 (clap)
│ ├── docs/ # 文档生成 (Swagger UI + Markdown)
│ ├── openapi/ # OpenAPI 3.1 规范生成
│ ├── domain/ # 领域抽象
│ ├── config/ # 配置管理
│ ├── i18n/ # 国际化 (ICU4X)
│ ├── integrations/ # trait-kit AsyncKit 集成
│ └── lib.rs # 库入口点
├── macros/ # 过程宏 crate (#[forge])
├── examples/ # 综合示例库 (workspace member)
├── docs/ # 文档
├── benches/ # 基准测试
├── proto/ # protobuf 定义 (gRPC)
├── .github/ # GitHub 工作流
└── scripts/ # 构建和实用脚本
设计原则
- 编译时协议选择:未使用的协议不产生任何编译代码
- Inventory 注册模式:
inventory::submit!()用于编译时注册,init_all_plugins()防止链接器优化 - 三种构造模式:所有组件支持
new()(开箱即用)、builder()(Builder 模式)、with_dependencies()(依赖注入) - 不使用数据库:所有数据交互通过 oxcache(内存缓存)完成
📜 OpenAPI 自动生成
SDForge 基于 utoipa 5.5 自动生成 OpenAPI 3.1 规范。启用 openapi feature 后,每个 #[forge] 宏在编译期通过 inventory 注册 OpenApiRouteInfo;运行时调用 generate_openapi_spec() 收集全部路由并生成完整规范。
🔧 启用
[]
= { = "0.5.0-rc.2", = ["http", "openapi"] }
🚀 基本用法
use generate_openapi_spec;
// 收集所有通过 #[forge] 注册的路由并生成 OpenAPI 规范
let spec = generate_openapi_spec;
// 序列化为 JSON 写入文件或返回给客户端
let json = to_string_pretty.unwrap;
println!;
🎨 自定义元数据
使用 OpenApiBuilder 链式调用自定义 info 部分(title、version、description)。路由始终从全局 inventory 注册表收集:
use OpenApiBuilder;
let spec = new
.title
.version
.description
.build;
🔗 宏集成
启用 openapi feature 后,#[forge] 自动生成注册代码,无需手动维护:
async
上述代码会在编译期自动向全局注册表提交 OpenApiRouteInfo { path: "/users/{id}", method: "GET", ... },generate_openapi_spec() 会将其纳入生成的规范。
注意:未启用
openapifeature 时,宏不生成任何 utoipa 相关代码——零运行时开销。
🔄 MCP 2026-07-28 迁移指南
v0.2.0 将 MCP 实现从 mcp-sdk 0.0.3 全面迁移至官方 rmcp SDK(当前为 rmcp 3.2),适配 MCP 2026-07-28 规范。该迁移是一次 BREAKING 变更。
⚠️ BREAKING 变更
| 旧版本 (v0.1.x) | 新版本 (v0.2.0+) |
|---|---|
mcp-sdk = "0.0" 依赖 |
rmcp 依赖 |
initialize 握手流程 |
移除,改用 server/discover 端点 |
有状态会话 (StatefulServerHandler) |
无状态适配层 (StatelessServerHandler) |
register_mcp(&mut Server) 签名 |
register_mcp(&mut dyn McpToolRegistry) |
🛠️ 无状态适配层
StatelessServerHandler 实现了 rmcp::ServerHandler trait,其方法均不依赖会话状态,适配 2026-07-28 规范的无状态协议模型:
use StatelessServerHandler;
let handler = new;
// 通过 rmcp 的 axum 集成挂载到 HTTP 路由
📨 HTTP 头协议
无状态协议通过 HTTP 头传递方法名与工具名,由 parse_mcp_headers 解析:
use parse_mcp_headers;
// 客户端请求必须携带:
// Mcp-Method: tools/call
// Mcp-Name: get_user
let info = parse_mcp_headers?;
缺少请求头返回 400 Bad Request,与 2026-07-28 规范一致。
🔁 多轮往返请求(MRTR)
新增 MRTR 支持。工具可通过 InputRequiredResult 挂起执行,等待客户端补充输入;300 秒超时后自动取消:
use MrtrSessionManager;
let manager = new;
let result = manager.create_session?;
// 客户端随后通过 session_id 恢复执行
💾 缓存语义
cache_semantics 模块处理 ttlMs 与 cacheScope 字段,支持 global 与 request 两种缓存作用域,并与 oxcache 集成实现工具结果缓存。
📚 迁移步骤
- 将
Cargo.toml中的mcp-sdk依赖替换为rmcp - 将
register_mcp(&mut Server)调用改为register_mcp(&mut dyn McpToolRegistry) - 移除
initialize握手相关代码,改用server/discover端点 - 如需 MRTR 或缓存语义,导入对应模块
完整迁移示例见
examples/src/mcp/migration_2026.rs。
🚀 生产部署
🐳 Docker 部署
FROM rust:1.85 as builder
WORKDIR /app
COPY . .
RUN cargo build --release --features full
FROM debian:bookworm-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /app/target/release/sdforge /usr/local/bin/
EXPOSE 3000
CMD ["sdforge", "serve", "--port", "3000"]
☸️ Kubernetes 部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: sdforge-api
spec:
replicas: 3
selector:
matchLabels:
app: sdforge-api
template:
metadata:
labels:
app: sdforge-api
spec:
containers:
- name: sdforge
image: sdforge:latest
ports:
- containerPort: 3000
env:
- name: FEATURES
value: "full"
resources:
requests:
memory: "256Mi"
cpu: "250m"
limits:
memory: "512Mi"
cpu: "500m"
🔧 环境配置
# 生产环境变量
🐛 故障排查
🔍 常见问题
编译错误
# 错误:找不到 feature
# 解决:检查可用的 features
|
# 启用指定 features
运行时问题
# 使用 tracing 查看日志
RUST_LOG=debug
# 端口冲突
# 解决:更换端口或结束占用进程
性能问题
# 使用 cargo-flamegraph 剖析
# 内存占用分析
📋 健康检查端点
async
🆘 获取帮助
- 📖 文档
- 🐛 Issue 跟踪
- 💬 Discussions
🧪 测试
测试分类
| 分类 | 位置 | 说明 |
|---|---|---|
| 单元测试 | src/ 内嵌 #[cfg(test)]、tests/unit/ |
模块级单元测试 |
| 集成测试 | tests/integration/ |
cache / config / error_handling / feature_combinations / grpc / http / mcp / openapi / security / status_code / streaming / uat / websocket / cli / docs |
| 宏测试 | tests/macros/ |
trybuild 编译失败用例与宏展开验证 |
| E2E 高级测试 | tests/e2e_advanced.rs |
覆盖 12 个模块未覆盖场景(178 个测试) |
| Examples 综合测试 | examples/tests/comprehensive_features.rs |
全 feature re-export 可访问性、跨协议 dispatch(77 个测试) |
| 基准测试 | src/benches/ |
criterion 基准(需 http feature) |
运行命令
# 按特性运行测试
# 仅运行 lib 测试(CI 覆盖率口径)
# 运行指定测试
# 带输出运行
# Release 模式测试
CI 通过 cargo llvm-cov --features full --lib 生成覆盖率并上传 Codecov。
📊 性能
SDForge 的编译时特性门控带来显著的编译时间与产物体积优势(vs 全量打包 --features full):
| 指标 | http only | full | 节省 |
|---|---|---|---|
| 编译时间(debug) | 28.88s | 54.52s | 47.0% |
| 编译时间(release) | 13.72s | 25.48s | 46.2% |
| 框架库体积 rlib(debug) | 33.9 MB | 100.2 MB | 66.2% |
| 框架库体积 rlib(release) | 3.57 MB | 9.07 MB | 60.6% |
| 唯一依赖 crate 数 | 396 | 478 | 17.2% |
数据来源:docs/benchmarks/vs-server-less.md(2026-07-03 实测,AMD Ryzen 9 9950X / rustc 1.93.1 / WSL2)。完整方法论、二进制体积分析与复现命令见该文档。
🔒 安全
SDForge 内置全套安全能力(security feature):API Key / JWT Bearer 认证、限流(limiteron)、审计日志、安全头(CORS/CSP)、输入校验。概要设计与最佳实践见 安全文档。
🛡️ API Key 认证
use ;
let app = new
.route
.layer;
⚡ 限流配置
# config.toml
[]
= true
= 60
= 10
⚠️ 安全默认值(v0.3.0+)
注意:v0.3.0 收紧了安全默认值,迁移时请检查:
- JWT 密钥最小长度:
MIN_SECRET_LENGTH=32,短于 32 字符的密钥将被拒绝- ServerConfig 默认 host:从
"0.0.0.0"(fail-open)改为"127.0.0.1"(fail-safe 回环),生产部署必须显式配置 host- CORS 校验收紧:
"http://"(仅 scheme 无 host)将被拒绝另:v0.4.4 起
extract_client_ip_core在无ConnectInfo时不再信任X-Forwarded-For/X-Real-IP头,生产部署必须配置ConnectInfo以启用不可伪造的 TCP 对端 IP 提取。
🗺️ 开发路线图
以下规划整理自 CHANGELOG.md 未发布条目与工作区验收计划(ACCEPTANCE_PLAN.md):
- v0.5.0 发布(进行中) — 当前处于
0.5.0-rc.2,按工作区验收计划完成依赖链(trait-kit/oxcache/inklog/limiteron)协同发布与终验 - 自定义成功状态码(已合入待发布) —
#[forge(status = <code>)]静态声明 +ServiceResponse::success_with_status动态控制(见 CHANGELOG [Unreleased]) - 错误码行为契约统一 — 评估统一同一校验错误在 HTTP(400)与 gRPC(422)间的状态码差异(验收计划 SIMPL-001,现为记录在案的行为契约)
- 依赖治理 — 中期评估将
bincode(RUSTSEC-2025-0141 unmaintained)迁移至postcard/bitcode/rkyv - MSRV 声明收敛 — 已按工作区 CONFIG_BASELINE 统一为 1.97.1(2026-09-06),覆盖
--all-features下 1.94 的有效要求
🤝 参与贡献
我们欢迎贡献!请阅读 贡献指南 了解开发环境、TDD 工作流和 PR 流程。
# 克隆仓库
# 安装 pre-commit 钩子
# 验证环境
📋 更新日志
详见 CHANGELOG.md。最近版本要点:
- [Unreleased] —
#[forge(status = <code>)]自定义成功状态码(静态声明 +ServiceResponse::success_with_status动态控制,HTTP/gRPC 拉通,OpenAPI 同步) - [0.4.7] — 依赖版本约束移除波浪号;补公开
bincodeRUSTSEC-2025-0141 ignore 决策 - [0.4.6] — CI Clippy 修复;恢复 examples 的
serde依赖 - [0.4.5] — 新增
tests/e2e_advanced.rs(178 个测试)
📄 许可证
本项目基于 MIT + Commons Clause 许可证发布,商业使用需单独授权。详见 LICENSE。
Copyright (c) 2026 Kirky.X
🙏 致谢
SDForge 站在优秀的开源生态之上,感谢以下项目:
- Axum / Tower — HTTP 服务与中间件
- rmcp — MCP 官方 Rust SDK
- Tonic / Prost — gRPC 与 protobuf
- utoipa — OpenAPI 规范生成
- clap — 命令行解析
- inventory — 编译期注册
- ICU4X — 国际化
- base 工作区姊妹项目 oxcache、limiteron、trait-kit、inklog
📞 联系与支持
- 🐛 Issue:github.com/Kirky-X/sdforge/issues
- 💬 讨论:github.com/Kirky-X/sdforge/discussions
- 🏠 仓库:https://github.com/Kirky-X/sdforge
- 📖 文档:https://docs.rs/sdforge
- 👤 维护者:Kirky.X
⭐ Star 历史
💝 支持本项目
如果您觉得这个项目有用,请考虑给它一个 ⭐️!
Built with ❤️ using Rust