Java 17 + WebFlux 从零写了一套 AI 网关

大家随便把公司代码、身份证号复制给 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。

bash 复制代码
# 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 一起交流完善。

相关推荐
鶴哥只手遮天36 分钟前
《rustc 内幕》第 1 章 全景:rustc 编译流水线与 crate 版图
后端·rust·开源
逐梦苍穹1 小时前
DeepInfer 推理框架源码精讲:逐行读 DeepSeek 开源的推理引擎(2 小时 20 分视频+文字版)
人工智能·开源·ai编程·deepseek·claudecode·deepinfer·deepseekinfer
夕水1 小时前
我用trae重构了ew-color-picker,一个插件化架构的现代颜色选择器
前端·javascript·开源
parade岁月10 小时前
开源也扛不住 AI 了?ESLint 宣布立即终止外部贡献者奖励
开源
AllData公司负责人11 小时前
AI大模型数据开发底座系列说明书,AllData集成Chat2DB开源项目建设AI 数据库分析底座,涵盖AI 洞察/对话SQL/智能视图!
数据库·人工智能·sql·开源·ai 洞察·对话sql
冬奇Lab14 小时前
一天一个开源项目(第260篇):Plannotator —— 给 AI 编码 Agent 配一块「可批注的审阅台」,计划和代码改动都能在浏览器里逐条批示
人工智能·开源·claude
炫酷的大高个1 天前
98% 连跑 20 次只剩 67%,我算了大模型重试账
人工智能·架构·开源
分布式存储与RustFS1 天前
镜像仓库的层别只堆本地盘:用 RustFS 给 Harbor 当 S3 后端
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
IT古董1 天前
AI 资讯日报 | 2026年10月25日:Kimi K3.1 Pro开源逼近前沿,OpenAI改离线训练,Claude合并Cowork,神经网络黑箱获新解,具身智能竞技场落幕
人工智能·神经网络·开源