RushWind Admin — 用 Rust 写的企业级中后台开源了中后台大概是世界上被写得最多、也最不被认真对待的软件品类几乎每家公司都要再写一遍用户、角色、租户、审计写完还要为它们的安全性、性能与多前端适配反复买单。更麻烦的是这块代码谁都不敢动——它不产生差异化价值却出不起事故。RushWind Admin中文名锐风把这套底座用 Rust 完整做了一遍112 个 proto 契约文件、构建期生成 203 条路由、六类审计日志、存储层多租户隔离、TOTP 多因素认证、异步任务队列、SSE 实时推送、脚本级插件系统外加 React / Vue Element / Vue Vben 三套前端共享同一份生成客户端。本文是它的自我介绍至于Go 写业务、Rust 扛平台的混合架构论证另有一篇硬核文专门展开。一、它是什么一句话定位以 Protobuf 契约为唯一事实源、用 Rust 实现的企业级中后台平台。层选型后端Rustedition 2021· RushWind 框架 · axum · tokio契约链Protobuf · protoc protox 双编译器 · 构建期确定性生成路由 / 错误表 / 接口 / 挂载存储SeaORM · PostgreSQL · Redis · S3 / MinIO认证JWT RS256 非对称双钥 · 双 Cookie 刷新轮换 · Redis 会话白名单吊销前端React 19Ant Design V6· Vue 3 Element Plus · Vue 3 VbenAnt Design Vue三端共享字节相同的生成客户端文档服务内置 OpenAPISwagger UI / ReDoc 开箱即用无需另建文档站质量门禁fmt / clippy / test / 契约同步四道 CI 门ubuntu windows 矩阵· 依赖审计 · 差分回归台架两个设计立场贯穿整个项目先摆在前面立场一API 层是编译产物不是手写目录。路由、错误码、参数绑定、前端客户端全部从 proto 契约构建期生成。契约变了产物重算契约没变产物字节稳定。手写路由会漂移、文档会腐化编译产物不会。立场二平台能力做厚业务侵入为零。这里只有任何系统都需要的东西——认证、权限、租户、审计、消息、任务、文件。它不规定你的业务怎么写也不需要你的业务代码参与它的编译反过来你的业务系统通过同一份契约消费它甚至感知不到它是 Rust 写的。二、先看它有什么分组能力清单组织与权限用户 / 角色 / 权限点 / 菜单 / 组织 / 职位 / 租户 / 套餐配额多租户、多角色、多部门菜单、按钮、数据行、字段四级权限粒度认证与会话用户名 / 邮箱 / 手机号多标识登录图形验证码、登录失败限流IP 用户名双维、可配置登录策略CIDR / 时间窗 / 设备、TOTP 多因素、找回密码、AK/SK 机器凭证审计与合规登录 / 操作 / API / 数据访问 / 权限变更 / 策略评估六类审计流IP 归属地与 trace_id 全程留痕留存 180 天 JSONL 归档按等保 2.0 技术要求对表设计系统功能字典、平台参数多实例缓存广播失效、任务调度Postgres 队列 cron、文件S3 / MinIO、通知渠道、站内信SSE 实时到达、脚本系统Lua / JS 生命周期钩子、多语言、服务与 Redis 监控表格是索引下面把几个平时要团队磨几周、这里开箱即有的点说透。认证是一条纵深防御链不是验密码、发 token看一条登录请求POST /admin/v1/login背后依次发生的事图形验证码先行校验——服务端渲染 PNG、答案存 Redis、一次性消费。自动化脚本的第一道减速带登录失败限流IP 与用户名双维度计数Redis Lua 原子扣减连续失败进入冷却窗口撞库脚本的成本被拉高几个数量级登录策略匹配目标用户命中的限制策略IP 段、时间窗、设备直接拒绝并留下拒绝原因供审计回溯口令解密与校验口令在应用层 AES 加密后才进传输层不是明文过 HTTPS 了事服务端解密后 bcrypt 比对——且对不存在的用户做恒时假校验让探测哪些用户名存在在时间侧信道上变成统计学噪音TOTP 多因素如已绑定签发短时效登录挑战错误次数超限即锁定登录风控评分失败次数、未知用户、缺失设备或 IP、内网来源等因素加权评分LOW / MEDIUM / HIGH 三档随登录审计落库——安全团队有了分档告警的抓手签发双令牌RS256 非对称签名的 access token 走响应体refresh token 走 HttpOnly CookiePath 锁定到刷新端点配套一张非 HttpOnly 的过期时间 Cookie 供前端感知会话寿命。SameSiteLaxTLS 环境自动Secure会话白名单Redis 登记本次会话。登出即吊销——旧 token 的下一次请求立刻 401不存在等它自然过期的裸奔窗口。八步走完密码学部件各就各位传输层有 AES、存储层有 bcrypt、签名层有 RS256谁也不用兼职谁的工作。多租户隔离做在存储层不靠服务层自觉多租户系统最怕的不是没有隔离而是靠每个开发者记得加租户条件的隔离。RushWind Admin 把隔离压到存储层读查询自动注入租户过滤租户视图只见本租户平台视图全见——写业务查询的人想漏都漏不掉写防伪造租户字段更新与删除强制携带租户谓词跨租户的 UPDATE / DELETE 语句在数据库层面就执行不出去面租户请求再按(路径模板, 方法)查接口表做 fail-closed 校验——没登记的路由默认拒绝而不是默认放行。新加的路由忘了配权限点生产环境不会替你兜底商业层套餐模块白名单控制租户能用哪些模块套餐到期自动进入只读态读放行、写拒绝初始化新增租户自动建好部门、默认角色与管理员开箱即用。审计是六类流不是一张日志表多数系统的审计是一张 operation_log 表。等保 2.0 的口径下这远远不够RushWind Admin 按数据类型拆了六条流登录带风控加权评分分档、操作资源定位 请求快照、API操作者 / 路径 / 方法 / 结果、数据访问SQL 词法脱敏 自动提取涉及表与数据分类、权限变更操作者 / 目标 / 原因、策略评估每次鉴权判定落一行带评估上下文与 trace_id。所有流统一带 IP 归属地与 trace_id留存与归档策略可调默认库内 180 天、超期导出 JSONL 归档文件留痕。排障时用 trace_id 把六条流串起来谁在什么时候为什么被拒绝是一行查询的事。平时看不见的底盘任务调度Postgres 队列指数退避、死信标记 cron 生产者分钟对齐、类型去重管理页可启停、立即执行、查看运行日志——不引入 Redis 队列外的第三种基础设施SSE 推送独立网关端口承载事件流token 三种方式携带、按用户严格过滤站内信实时到达、已读状态可查脚本系统Lua / JavaScript 脚本挂在实体生命周期上before 可否决、after 异步执行也能做定时任务与 HTTP 出站域名白名单 fail-closed数据库是事实源管理页改完即时生效不用发版参数管理平台级键值参数服务侧经缓存读取多实例部署下变更经 Redis 发布订阅广播失效——参数改了所有实例同时知道文件服务S3 / MinIO 五类内容桶 签名图片代理上传自动嗅探 MIME 覆写客户端声明AK/SK 机器凭证租户级 AccessKey / SecretKeySecret 仅创建时一次性展示轮换后旧密钥立即失效机器令牌仅签发租户作用域的访问令牌。三、界面预览真跑起来的样子以下截图取自真实运行环境——本仓后端REST :7788与 React 版前端数据是种子库的真实数据没有为截图专门造数。登录——图形验证码 租户编号留空为平台登录口令在应用层加密后才进传输层仪表盘——用户 / 角色 / 今日登录 / 审计条数的实时统计含登录趋势与占比分布用户管理——组织树联动 高级查询多角色、多部门、主管与状态配置菜单管理——目录 / 菜单 / 按钮三类节点权限标识与路由、组件路径一一对应操作审计日志——操作类型、资源定位与请求 ID 全程留痕成功失败均可追溯在线用户——会话与设备视图支持强制下线管理端之外后端自带 API 文档服务server.yaml的enable_swagger/enable_redoc开关原始规格见/q/openapi.yaml——Swagger UI全量接口按服务分组、可直接在线调试ReDoc三栏式阅读视图参数说明与请求 / 响应示例并列。这两份文档不是另行维护的文档站就是前面说的契约生成物本身。四、为什么中后台值得用 Rust很多团队对 Rust 的想象停留在系统编程语言离业务很远。但中后台恰好有一块非常 Rust 的内核——平台层鉴权门在每条路由上。203 条路由条条要过验签 → 接口表 fail-closed → 租户状态与套餐检查 → 动态 RBAC四阶段这是纯 CPU 的热路径不产生业务价值却对每个请求计税。Rust 把这笔税压到最低——QPS 越高省得越多。尾延迟可预算。没有 GC就没有停顿窗口与标记辅助P99 不取决于这一批请求里谁分配得多。对一个每请求都要做权限判定的服务可预测性本身就是特性。内存安全直接缩小漏洞面。审计日志、口令哈希、密钥管理这类模块一个内存错误的代价是数据泄露。Rust 在编译期把整类问题挡掉安全审计的检查清单跟着变短。部署密度。平台服务往往被每个业务系统部署一份内存驻留的差距乘以副本数就是实打实的账单。诚实地说另一半业务编排层不必 Rust。组织机构怎么算、报表怎么拼、流程怎么编排——这些天天变的东西Go / Java / Node 都比 Rust 舒服硬上 Rust 是让最贵的变更摩擦落在最频繁变更的地方。所以本项目的推荐用法从来不是全栈 Rust而是平台层 Rust业务层随意——两种语言的进程通过同一份 proto 契约互通。具体怎么拆、边界画在哪、四种集成模式的取舍见 Go 写业务Rust 扛底盘一套可落地的混合架构。五、架构一瞥┌──────────────────────────────────────┐ │ proto 契约唯一事实源 │ │ 112 文件 · 16 模块 · 197 条主绑定 │ └──────────────────┬───────────────────┘ │ 构建期确定性生成 ┌─────────────────────────┼─────────────────────────┐ ▼ ▼ ▼ 203 条路由 免鉴权白名单 441 条错误状态映射 198 个服务接口 │ │ │ └───────────┬─────────────┴─────────────────────────┘ ▼ ┌─────────────────────────────────────────────────────────────┐ │ admin-apiRust · axum · tokio │ │ 鉴权门认证 → 租户 → 授权· 服务实现 · 审计层 · 参数缓存 │ └───────┬────────────┬───────────────┬───────────────┬────────┘ ▼ ▼ ▼ ▼ REST :7788 SSE :7789 任务队列 worker cron 生产者 │ │ │ └─────┬──────┴───────┬───────┘ ▼ ▼ PostgreSQL Redis ▼ S3/MinIO 前端React / Vue Element / Vue Vben ← 同一份生成客户端零改动换后端一次启动拉起四个服务面REST 网关:7788203 条路由 8 个免鉴权端点、SSE 推送网关:7789、任务队列 worker 与 cron 生产者——共享同一个生命周期配置驱动装配信号统一收敛退出。六、契约先行换后端语言前端一行不改Protobuf 是唯一 API 契约。构建期从契约确定性生成四样东西203 条路由含 additional_bindings、441 条错误 reason → HTTP 状态映射、198 个服务接口方法、逐路由的参数绑定计划——后端零手写路由前端 TypeScript 客户端同样由契约生成三套前端拿到的客户端字节相同。跨语言最容易翻车的两处序列化语义64 位整数在 JSON 里的字符串化、proto3 presence 字段未设置时的省略行为用金样测试钉死错误信封是统一的四字段 protojsoncode / reason / message / metadata前端与任何语言的服务端消费者看到的形状一致。更进一步同一份契约在 Go 与 Rust 两个后端栈上各有一套实现差分台架对全量路由 HEAD 探针自动 sweep、逐字节比对响应——契约兼容不是文档承诺是 CI 里跑的回归。这条工程线的完整拆解生成器暗礁、序列化金样、豁免治理见 契约驱动203 条路由零手写的工程化拆解。七、质量门禁CIubuntu windows 双平台矩阵跑四道门cargo fmt/cargo clippy -D warnings/cargo test/ 契约同步校验外加cargo-deny依赖审计许可证与已知漏洞通报。再往前一步是差分回归台架compose 拉起中间件与 Go / Rust 双栈后端对 203 条路由 89 条 HEAD 自动 sweep 逐字节比对豁免须显式登记——四类豁免各有名目review 时看得见理由。它专治一类事故“我只是升级了个依赖/重构了下生成器行为怎么就变了”。八、快速开始后端以同级克隆布局引用框架仓与工具库仓# Gitee国内直连gitclone https://gitee.com/tx7do/rushwindgitclone https://gitee.com/tx7do/rust-utilsgitclone https://gitee.com/tx7do/rushwind-admin# 或 GitHubgitclone https://github.com/tx7do/rushwindgitclone https://github.com/tx7do/rust-utilsgitclone https://github.com/tx7do/rushwind-admincdrushwind-admin/backendcargorun-padmin-api# REST :7788启动时自动迁移建表、播种演示数据前置要求Rust stable、protoc、PostgreSQL、RedisMinIO 可选。数据库连接等配置位于backend/services/admin-api/assets/支持环境变量覆盖。仓库内嵌的 JWT 密钥是演示密钥生产部署务必更换。React 版前端随仓维护dev 代理默认指向本仓后端零配置直连cdrushwind-admin/frontend/admin/reactpnpminstallpnpmdev# :5888代理转发至 REST :7788服务起来后 API 文档开箱即用/q/swagger-ui全量接口按服务分组、可在线调试、/q/redoc三栏式文档、原始规格/q/openapi.yaml。九、在线演示前端版本演示地址Vue3 Vbenhttps://vben.admin.gowind.cloudVue3 Element Plushttps://ele.admin.gowind.cloudReacthttps://react.admin.gowind.cloud后端 Swaggerhttps://api.demo.admin.gowind.cloud/docs/默认账号密码admin/Abcd1234十、相关链接rushwind-admin—— 本项目后端 React 前端 契约与台架Gitee GitHubrushwind—— RushWind 框架 monorepohttp / http-binding / authn / transport / gen-http / bootstrap 等 crate本项目的底座Gitee GitHubrust-utils—— 工具库查询语法解析等Gitee GitHub掘金专栏 —— 系列文章持续更新系列文章下一篇契约驱动203 条路由零手写的工程化拆解硬核向Go 写业务Rust 扛底盘一套可落地的混合架构——Go 的 GC 到底交多少税、Rust 的优势边界在哪、四种集成模式怎么选。