大家随便把公司代码、身份证号复制给 AI,完全没安全意识;团队里几个人共用一个 API Key,遇到写死循环的,一晚上账单直接爆炸。
去 GitHub 上找轮子,像 One-API 确实很火,但基本都是 Python 或 Go 写的。我本身是做 Java 的,手里的技术栈就是 Spring 全家桶,想拿别人的代码做二次开发或者改个 Bug,学习成本太高了。加上传统外包和企业客户基本都是 Java 生态,这东西交给他们去部署维护也费劲。
所以干脆自己动手,用 Java 17 + Spring Boot 3 + WebFlux 写了一套完整的网关,名字叫 AIGate。前端是用 Vue3 写的,这几天刚把代码整理干净,在 Gitee 上开源了(Apache 2.0 协议)。
为什么要用 WebFlux
AI 网关的核心场景是流式输出(SSE) 。
用传统的阻塞式框架,每个请求都要占用一个 Tomcat 线程。如果并发一高,线程池瞬间被打满,系统直接卡死。AIGate 全链路采用了响应式架构(Flux / Mono),底层是 Netty,主打一个非阻塞。单台低配服务器(2核2G)也能稳稳抗住大量的并发流式请求。
核心功能及实现思路
这套系统主要解决三个问题:防超支、防泄密、防断供。
1. 防超支(原子级配额与熔断)
痛点:传统做法是请求结束后再查库扣费,并发一高绝对会超发(也就是常说的“先查后扣”竞态条件)。
实现:在请求进入网关时,直接通过 Redis 的 Lua 脚本做原子操作。脚本内完成“读取当前额度 -> 判断是否超额 -> 预扣一定 Token -> 返回结果”的全部动作。如果超额,直接返回 429 Too Many Requests 切断请求。等大模型流式输出结束后,再根据实际消耗的 Token 数进行多退少补。
2. 防泄密(AC自动机与脱敏)
痛点:不能用大模型去审核大模型,延迟太高,且容易漏判。
实现:底层引入了 Aho-Corasick 自动机算法(多模式匹配,毫秒级),配合预编译的正则表达式。当检测到手机号、身份证号或代码里的 api_key= 时,系统支持两种处置动作:
- BLOCK:直接拦截请求,返回 400 报错,并记录审计日志。
- MASK:将敏感信息替换为
***(例如把手机号打成138****1234),然后再静默转发给大模型。员工完全无感,但数据已经被洗白了。
3. 高可用与自动降级
网关支持配置多个上游供应商(OpenAI、DeepSeek、智谱等)。利用 WebFlux 的 onErrorResume,当主节点(如 OpenAI)发生网络超时或返回 5xx 错误时,系统会无缝切换到备用节点。整个过程对客户端透明,业务不会中断。
踩坑记录:WebFlux 的 DataBuffer
开发过程中踩得最深的坑,是 WebFlux 的 DataBuffer。因为它是响应式的,请求体默认只能被读取一次。如果在过滤器里为了扫描敏感词把它读了,后面转发给上游时就空了。
解决方案:自定义了 ServerHttpRequestDecorator,用 DataBufferUtils.join 聚合并读取后,立刻用 try/finally 释放内存(防止 OOM),然后再用 Flux.defer 重新生成一个新的 DataBuffer 塞回请求链。这部分的代码在仓库里都有详细注释。
(此外,我还顺手写了一份完整的安全渗透测试与风险评估报告,目前达到了 0 严重漏洞、0 高危漏洞的标准,附带在文档里。)
如何一键部署?
为了方便测试,我针对低配服务器专门优化了 Docker 编排。 前置要求:服务器需安装 Docker 和 Docker Compose。
# 1. 克隆代码
git clone https://gitee.com/zogs/aigate.git
cd aigate
# 2. 配置环境变量(修改数据库密码和加密密钥)
cp .env.production .env
# 3. 一键构建并启动 (包含 PG、Redis、后端、Nginx 前端)
docker compose up -d --build
启动完成后,浏览器访问 http://你的IP:8081 即可看到管理后台。
源码与体验
项目纯开源,没有任何套路。如果觉得这套架构和实现思路对你有帮助,欢迎去 Gitee 点个 Star 支持一下,也欢迎提 Issue 一起交流完善。
- Gitee 仓库:gitee.com/zogs/aigate
- 联系作者:
shu.zhong@foxmail.com