# rushwind
**Repository Path**: tx7do/rushwind
## Basic Information
- **Project Name**: rushwind
- **Description**: Rust building-block toolkit for microservices: a lifecycle-orchestration core plus contract crates with conformance-tested engine adapters — transport (axum/WS/QUIC/WebTransport/MQTT), storage, auth, config, discovery, observability, resilience, messaging, scripting, AI, object storage. 100% safe code.
- **Primary Language**: Rust
- **License**: MIT
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2026-09-15
- **Last Updated**: 2026-09-18
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README

# RushWind · 锐风
[English](./README_en.md) | **中文** | [日本語](./README_ja.md)
[](./LICENSE)
[](https://www.rust-lang.org/)
[](https://github.com/tx7do/rushwind/actions/workflows/ci.yml)
---
## 设计哲学
> **不是全家桶,而是积木盒。**
RushWind 只做一件事:**可靠的多服务器生命周期编排**。核心定义契约——传输 trait、停机信号、实例模型——每一个具体协议栈都是独立的适配器 crate,由使用者按需拼装。核心不含日志、不含注册中心、不含配置中心:那些是积木,不是底板。
一切按 Rust 的所有权、取消与错误模型原生设计,契约语义与预算、停机行为的规范细节见 [docs/architecture.md](./docs/architecture.md)。数据访问层是同一哲学的延伸:`rushwind-storage` 用一套 Repository 契约驾驭多种存储引擎——每引擎一个适配器 crate,按需引入。
## 当前状态
能力面已全部落地:**104 个 crate + 8 个示例**,覆盖生命周期编排与传输、HTTP、存储、安全、配置、注册中心、可观测、弹性、缓存、消息、事务、任务、编码、脚本、AI、对象存储等全部能力域。每个域 = 一份契约 crate + 按需引入的引擎矩阵;引擎与适配器一律过一致性套件,`cargo test` 全绿即合规。各域独立演进,按 Rust 生态自身的节奏生长。
路线图上仅剩:kcp(存量互操作时)、`rushwind-protocols` 独立仓。
## 仓库布局
按域分组。契约 crate 不预设引擎;引擎与适配器按需引入,各自过一致性套件。
### 核心与传输
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-core` | 生命周期编排:并发启动、级联停机、分阶段限时、结果观察 |
| `crates/rushwind-transport` | 契约层:`Server` trait、`StopSignal`、`Instance`、`ServerError` |
| `crates/rushwind-transport-axum` | axum 适配器:`Router` 接入生命周期,优雅停机映射见架构文档 |
| `crates/rushwind-transport-ws` | WS 会话路由构建器:门链 + 准入策略 + 会话停机总线,契约见会话中间件文档 [session-middleware.md](./docs/session-middleware.md) |
| `crates/rushwind-transport-quic` | QUIC 适配器:quinn 接受循环接入生命周期,全套会话链;`stop()` 为真实释放(Endpoint::close) |
| `crates/rushwind-transport-webtransport` | WebTransport 适配器:wtransport 端点接入生命周期,全套会话链(会话请求时刻的 HTTP 族门链、原子准入、握手截止),`stop()` 为真实释放 |
| `crates/rushwind-transport-h3` | HTTP/3 适配器:h3/h3-quinn 请求服务接入生命周期,请求时刻门链(拒绝映射为状态响应)与连接级原子准入,`stop()` 为真实释放 |
| `crates/rushwind-transport-mqtt` | MQTT 消费桥:订阅外部 broker(每订阅 handler 注册 + 规范通配分发),重连退避 + 订阅重建,串行泵入 handler |
### HTTP 面
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-http` | HTTP 边缘:gRPC 对齐的错误信封 `HttpError`——code/reason/message/details,`AuthnError`/`StorageError` 内置转换;请求中间件栈 recovery / request-id / logging / CORS / timeout 与 `HttpEdge` 装配器;`with_authn` / `with_authorization` 把认证鉴权契约接上 axum 路由,`Authenticated` 提取器;feature 门控的 `/healthz`+`/readyz` 与 `/metrics` 挂载,设计见 [docs/http-edge.md](./docs/http-edge.md) |
| `crates/rushwind-http-binding` | proto-HTTP 线格式契约(由调用方提供描述符池):表单绑定器(点路径、两种字段名拼写、map/list/oneof 结构、周知叶子白名单)、Content-Type codec 解析、认证前 bind 层、protojson 响应 codec、每路由生命周期尾部、四字段状态错误信封 |
| `crates/rushwind-gen-http` | 描述符驱动的 proto-HTTP 路由面代码生成器:每 binding 路由表 + 表单绑定计划、(package, reason)→HTTP 状态码错误表、每 service 一个 trait + 空占位实现、public/gated 挂载发射器 |
### 存储域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-storage` | 存储契约:`Repository` trait、三种分页(Page/Offset/Token)、过滤器树、Viewer 五级租户、FieldMask、审计钩子 |
| `crates/rushwind-storage-memory` | 内存参考引擎:过滤器/排序/游标的语义基准,零依赖 |
| `crates/rushwind-storage-seaorm` | SeaORM 引擎:SQLite/PostgreSQL/MySQL 三后端同启,三方言 SQL 快照钉死渲染,SQLite 过一致性套件,live 套件跑 CI 容器 |
| `crates/rushwind-storage-mongodb` | MongoDB 引擎:FilterExpr→BSON 翻译离线单测,LIKE 族编译为转义正则,live 套件跑 CI 容器 |
| `crates/rushwind-storage-elasticsearch` | Elasticsearch 引擎:REST + refresh-on-write,`.keyword` 精确匹配,bulk 原子批写 |
| `crates/rushwind-storage-opensearch` | OpenSearch 引擎:ES 线格式薄复用(wire 兼容) |
| `crates/rushwind-storage-cassandra` | Cassandra 引擎:bucket 固定分区 + 契约求值器过滤,LWT 原子批写 |
| `crates/rushwind-storage-influxdb` | InfluxDB 引擎:measurement 即表,id 为 series tag,InfluxQL 删除 |
| `crates/rushwind-storage-clickhouse` | ClickHouse 引擎:SQL over HTTP,mutations_sync 读己之写,探针式冲突检测 |
| `crates/rushwind-storage-cache` | Cache-Aside 装饰器:SingleFlight 合并击穿、缓存键含 viewer 作用域、generation 防陈旧回填 |
| `crates/rushwind-storage-soft-delete` | 软删除装饰器:墓碑写入、全读路径过滤、restore/purge,引擎无关 |
| `crates/rushwind-storage-observe` | 观测装饰器:每调用一个 `tracing` span(table/op/outcome),OTel 导出交由 subscriber 选型 |
| `crates/rushwind-storage-tree` | 树形查询:children/roots/ancestors/subtree,契约级遍历 + 环检测,任意引擎可用 |
| `crates/rushwind-storage-proto` | proto 契约线格式:`proto/rushwind/storage/v1/query.proto` 生成(prost + pbjson),29 操作符映射 + AIP 文本解析 |
| `crates/rushwind-storage-macros` | `ToRecord`/`FromRecord` derive 宏:DTO↔Record 映射编译期生成;标量族加宽、`#[record(as_text)]` 枚举、`#[record(with = "…")]` 自定义转换、`#[record(rename)]` 列名 |
| `crates/rushwind-storage-axum` | HTTP 端点层:任意 Repository 挂成 CRUD 路由,列表查询双入口(protojson `q` / AIP `filter`),viewer 钩子收口租户 |
### 安全域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-authn` | 认证契约:`Authenticator` trait(提取/验证两半)、`AuthClaims` 声明包、错误分类学、`AuthenticationGate` 门链接入层,见 [docs/security-authn-authz.md](./docs/security-authn-authz.md) |
| `crates/rushwind-authn-apikey` | API-key 引擎:静态 key 集 / 每键 claims / 验证回调 |
| `crates/rushwind-authn-basicauth` | Basic-Auth 引擎:RFC 7617 凭证对静态用户表或验证回调 |
| `crates/rushwind-authn-hmac` | HMAC 引擎:keyID.timestamp.signature 签名校验,时钟偏移窗口 |
| `crates/rushwind-authn-jwt` | JWT 引擎:HS/RS/PS/ES/EdDSA 族的铸造与验证 |
| `crates/rushwind-authn-noop` | Noop 引擎:全放行、铸造空凭证 |
| `crates/rushwind-authn-presharedkey` | 预共享 key 引擎:集合成员校验、铸造为随机抽取 |
| `crates/rushwind-authn-session` | 会话引擎:不透明会话 ID + 可插拔 SessionStore |
| `crates/rushwind-authz` | 鉴权契约:`Engine` trait(单裁决 + 三批量过滤)、Subject/Action/Resource/Project 模型、策略 JSON 互通,见 [docs/security-authn-authz.md](./docs/security-authn-authz.md) |
| `crates/rushwind-authz-acl` | ACL 引擎:有序 allow/deny 规则 + 通配匹配,默认拒绝、拒绝优先 |
| `crates/rushwind-authz-rbac` | RBAC 引擎:角色→权限、用户→角色双表,传递继承带环检测 |
| `crates/rushwind-authz-noop` | Noop 引擎:单裁决全通过、批量过滤全空 |
### 配置域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-config` | 配置源契约:`Source` trait(load + 可选 watch/watch_value 能力默认方法)、`SignalStream`/`ValueStream` 流契约、`FallbackSource` 优先级合成(首答胜出 + 有效值变更流合并,无任务边界) |
| `crates/rushwind-config-env` | 环境变量引擎:默认键 + 前缀解析,未设变量为"缺席"而非错误 |
| `crates/rushwind-config-file` | 文件引擎:整文件读取 + 父目录监视(编辑器原子重命名安全),事件突发合并、陈旧值内容抑制,流 Drop 即停 |
| `crates/rushwind-config-http` | HTTP 配置源:URL 即键的 GET + 轮询 ValueWatcher |
| `crates/rushwind-config-etcd` | etcd 配置源:按键 GET + 原生 Watch,signal/push 双模式 |
| `crates/rushwind-config-consul` | Consul KV 配置源:按键 GET + blocking query 的 push 式 watch |
### 注册中心域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-registry` | 注册中心契约:`Registrar` + `Discovery` 双 trait,键布局/线格式以 golden 测试字节级钉死 |
| `crates/rushwind-registry-etcd` | etcd 适配器:注册 + 发现,租约 TTL + 自愈 keepalive,句柄 Drop 回退过期;live 套件(CI etcd 容器)钉死互操作 |
| `crates/rushwind-registry-consul` | Consul 适配器:agent HTTP API 上的注册与发现 |
| `crates/rushwind-registry-eureka` | Eureka 适配器:eureka v2 REST API 上的注册与发现 |
| `crates/rushwind-registry-kubernetes` | Kubernetes 适配器:kube 客户端的 in-cluster pod 标签注册 + pod watch 发现 |
| `crates/rushwind-registry-nacos` | Nacos 适配器:nacos-sdk naming 客户端上的注册与发现 |
| `crates/rushwind-registry-polaris` | Polaris 适配器:polaris v1 HTTP 客户端 API 上的注册与发现 |
| `crates/rushwind-registry-servicecomb` | ServiceComb 服务中心适配器:v4 注册 API 上的注册、心跳与 WebSocket watch |
| `crates/rushwind-registry-zookeeper` | ZooKeeper 适配器:ZooKeeper 协议上的注册与发现 |
### 可观测域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-metrics` | 指标契约:`Metrics` trait(counter 累加 / histogram 记录 / gauge 设置),标签规范化排序,记录永不失败调用方 |
| `crates/rushwind-metrics-prometheus` | Prometheus 引擎:按名懒注册 + 每类缓存表,`encode()` 渲染文本格式挂 /metrics 路由 |
| `crates/rushwind-metrics-otel` | OTel 引擎:OTLP 导出(gRPC/HTTP 二进制 protobuf),仪表懒创建缓存,gauge 以 up-down counter 代位 |
| `crates/rushwind-metrics-datadog` | Datadog 引擎:手写 DogStatsD 线协议 over UDP,标签排序、采样率后缀、可选批量缓冲 |
| `crates/rushwind-tracer` | 追踪契约:OTLP tracer-provider 装配 + W3C trace-context 载体助手 |
| `crates/rushwind-health` | 健康检查契约:Status/Result/Checker + 每检查独立超时的聚合器 + TCP/HTTP 检查器 + axum 处理器 |
### 弹性域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-retry` | 可组合重试:指数退避 + 抖动、重试谓词、总超时 |
| `crates/rushwind-ratelimit` | 限流契约:算法无关的 `Limiter` trait |
| `crates/rushwind-ratelimit-tokenbucket` | 令牌桶引擎:按速率回填 + 突发容量,Allow/Wait/Close |
| `crates/rushwind-ratelimit-bbr` | BBR 式自适应引擎:滑窗吞吐估计 + inflight 上限 |
| `crates/rushwind-circuitbreaker` | 熔断契约:`State` + `CircuitBreaker` trait(Allow/MarkSuccess/MarkFailure/Execute/State/Close) |
| `crates/rushwind-circuitbreaker-vegas` | Vegas 式引擎:延迟膨胀探测 |
| `crates/rushwind-circuitbreaker-sres` | Google SRE 概率式引擎:以接受率优雅衰减取代硬开/硬闭 |
| `crates/rushwind-circuitbreaker-hystrix` | Hystrix 式引擎:错误率阈值 + 睡眠窗 + 半开试探 |
### 缓存域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-cache` | KV 缓存契约:get/set/SetNX/批量 + TTL |
| `crates/rushwind-cache-local` | 进程内 KV 引擎:TTL 惰性过期 + 容量驱逐 |
| `crates/rushwind-cache-redis` | Redis 引擎:GET/SET/SETNX/DEL/EXISTS + MGET 与管道批量 |
### 消息、事务与任务
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-broker` | 消息契约:`Broker` / `Subscriber` trait、Message/Event 形状、JSON handler 助手 |
| `crates/rushwind-broker-kafka` | Kafka 引擎:samsa 纯 Rust 协议客户端上的每 topic 生产者 + 消费组订阅(免 librdkafka C 工具链) |
| `crates/rushwind-broker-pulsar` | Pulsar 引擎:pulsar-rs 多 topic 生产者 + Shared 消费者,固定订阅名 |
| `crates/rushwind-broker-rabbitmq` | RabbitMQ 引擎:lapin 上的 AMQP 0-9-1 发布/订阅,走 amq.topic 交换机 |
| `crates/rushwind-broker-nats` | NATS 引擎:async-nats 上的 core-NATS 发布/订阅 |
| `crates/rushwind-broker-redis` | Redis 引擎:每 topic 专属订阅连接上的 pub/sub |
| `crates/rushwind-broker-mqtt` | MQTT 引擎:rumqttc 上的发布/订阅,重连自动重订阅 |
| `crates/rushwind-broker-stomp` | STOMP 引擎:裸 TCP 上的极简 STOMP 1.2 客户端,对接 RabbitMQ stomp 插件 |
| `crates/rushwind-transaction` | 分布式事务契约:引擎之上的最小客户端面 |
| `crates/rushwind-transaction-dtm` | DTM 引擎:DTM HTTP 协议(reqwest)上的 saga / TCC / 二阶段消息 / XA |
| `crates/rushwind-apalis-postgres` | 任务队列的 Postgres 存储后端(apalis):SKIP LOCKED 认领、可见性超时、孤儿恢复 |
### 编码域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-encoding` | 编码契约:命名注册的 codec 之后的 serde 编解码 |
| `crates/rushwind-encoding-json` | JSON 引擎:serde_json 入册命名 codec 注册表 |
| `crates/rushwind-encoding-msgpack` | MessagePack 引擎:rmp-serde |
| `crates/rushwind-encoding-yaml` | YAML 引擎:serde_yaml |
| `crates/rushwind-encoding-toml` | TOML 引擎:toml |
| `crates/rushwind-encoding-cbor` | CBOR 引擎:ciborium |
| `crates/rushwind-encoding-bson` | BSON 引擎:bson |
| `crates/rushwind-encoding-xml` | XML 引擎:quick-xml |
| `crates/rushwind-encoding-proto` | Protobuf 引擎:prost 二进制 proto,作为类型化 sidecar |
### 脚本域
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-script` | 脚本引擎契约:能力拆分 trait 族(loader / executor / global / function / module / watch 六能力聚合,sandbox / runtime-hook / sync / quota 四能力独立),probe 方法即能力探测面,`ScriptValue` 数据桥,名称键工厂注册表,`EnginePool` / `AutoGrowEnginePool`,`Manager`;源契约 `ScriptSource` / `SignalStream` 与本地载体、组合(memory、file mtime 轮询、静态树 + 前缀、双策略多源聚合、TTL 失效监视缓存、变换链) |
| `crates/rushwind-script-wasm` | Wasm 引擎:wasmi 纯解释器上的模块实例化与 `_start` 导出调用,空导入面,其余能力恒拒 |
| `crates/rushwind-script-cel` | CEL 引擎:cel-rust 表达式编译与求值,`ScriptValue` 变量桥,map 扁平化为前缀全局变量 |
| `crates/rushwind-script-lua` | Lua 引擎:mlua vendored Lua 5.4,标准库白名单沙箱、宿主函数注册、指令配额钩子真中断与事后超时检查、watch 重载 |
| `crates/rushwind-script-javascript` | JavaScript 引擎:boa 运行于专属 actor 线程(命令通道 + 一次性应答,串行执行),全局/模块/脚本函数桥接、结果数组语义、配额事后检查 |
| `crates/rushwind-script-starlark` | Starlark 引擎:starlark-rust 标准方言模块求值、宿主环境注入、脚本函数调用、JSON 序列化值读回、watch 重排队 |
| `crates/rushwind-script-config` | 配置源桥:任意配置域 `Source` 适配为脚本 `ScriptSource`——缺席映射为未找到、错误分类桥(NotWatchable→能力不支持)、信号流直通 |
### AI 与对象存储
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-ai` | AI 模型契约:OpenAI 兼容端点上的 chat 补全 |
| `crates/rushwind-ai-openai` | OpenAI 兼容引擎:reqwest 上的 chat / 流式 / embeddings,通吃 OpenAI、Qwen、Ollama |
| `crates/rushwind-oss` | 对象存储契约:S3 兼容存储上的 put/get/delete |
| `crates/rushwind-oss-s3` | S3 引擎:reqwest 上的 SigV4 签名 REST,覆盖 AWS S3 与 MinIO |
### 装配与测试
| 位置 | 职责 |
|:---|:---|
| `crates/rushwind-bootstrap` | 配置驱动装配:YAML → 各域引擎(存储/注册中心/认证/鉴权/broker/缓存/熔断/限流/AI/对象存储/指标/配置源/脚本)+ HTTP 服务器(路由包、边缘中间件栈与 CORS、按子树的认证鉴权包装、特性门控的健康与指标挂载)+ cron 传输,全部汇入单一生命周期 |
| `crates/rushwind-testkit` | 跨适配器一致性测试套件——任何传输/引擎必须整套通过 |
### 示例
| 位置 | 职责 |
|:---|:---|
| `examples/multi-server` | 双服务器生命周期演示(级联停机、阶段顺序) |
| `examples/axum-admin` | axum 适配器演示:健康路由 + 信号驱动的优雅停机 |
| `examples/ws-gateway` | WS 网关演示:门拒绝 + 会话上限 + 生命周期级联的会话关闭 |
| `examples/quic-gateway` | QUIC 网关演示:环回门 + 会话上限 + 握手截止 + 端点级联关闭 |
| `examples/mqtt-ingest` | MQTT 消费演示:对接外部 broker,信号驱动的干净退出 |
| `examples/bootstrap-demo` | 装配演示:一份 YAML + memory 引擎工厂 + 路由包,起完整服务 |
| `examples/storage-basics` | 同一段 Repository 代码跑内存与 SQLite 双引擎,输出逐行一致 |
| `examples/apalis-postgres-demo` | 任务队列演示:Postgres 存储上的投递/调度/消费全程(认领、重试退避、死信、孤儿恢复) |
## 生命周期
```text
┌─ 启动:全部 Server 并发运行 ────────────────────────────┐
│ 触发集合:OS 信号 / 内部 stop() / 外部信号 / 任一 Server 退出 │
└────────────────────────┬──────────────────────────┘
▼
阶段 2:before 钩子(顺序执行,各自独立预算)
▼
阶段 3:全部 Server.stop 并发执行(各自独立预算,panic 隔离)
▼
阶段 4:after 钩子(顺序执行,各自独立预算)
▼
终局:outcome() / subscribe_done() 对外可观察
```
每一阶段的预算都在**该阶段开始的时刻**现取现造,绝不继承自更早的上下文。忽略停机信号的 Server 在排水截止时被**丢弃**(Rust 的 drop 即取消),挂死的 `stop()` 被截止切断并记录 `Timeout`。规范细节见 [docs/architecture.md](./docs/architecture.md)。
## 给适配器作者
新传输 = 实现 `Server` + 过一致性套件,两件事:
```rust
// crates/rushwind-transport-<你的栈>/tests/conformance.rs
rushwind_testkit::rushwind_conformance_suite!(crate::your_server_factory);
```
新存储引擎同理 = 实现 `Repository` + 过存储套件:
```rust
// crates/rushwind-storage-<你的引擎>/tests/conformance.rs
rushwind_testkit::rushwind_storage_conformance_suite!(crate::fresh_repo);
```
`cargo test` 全绿即合规,CI 对每个适配器 crate 强制执行。契约语义与套件用例清单见 [docs/architecture.md](./docs/architecture.md)。
## 开发门禁
```bash
cargo fmt --all --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
```
CI 在 Linux/Windows/macOS 三平台矩阵上执行同一套门禁。全 workspace `#![forbid(unsafe_code)]`。
## 安全
- 恶意的 `stop()` 拖不死进程:每个阶段有硬预算
- 服务器 panic 被隔离为记录,绝不跳过兄弟服务器的清理
- 漏洞报告流程见 [SECURITY.md](./SECURITY.md),威胁模型见 [docs/threat-model.md](./docs/threat-model.md),认证/鉴权层契约与威胁面速记见 [docs/security-authn-authz.md](./docs/security-authn-authz.md)
## 许可
[MIT License](./LICENSE)