一行代码接入所有 AI 模型服务,Gateway 层的性能守护者
前言
在 AI 应用爆发的今天,开发者们面临着一个共同的痛点:如何统一管理多个 AI 模型服务?
-
Ollama 跑本地模型,vLLM 做推理加速,GPUStack 管理 GPU 集群...
-
每个服务都有自己的 API 格式,都需要单独的认证和监控
-
服务挂了怎么办?请求太多怎么限流?怎么负载均衡?
JAiRouter 应运而生 ------ 一个为 AI 模型服务而生的统一网关。今天,我们很高兴地宣布 v2.7.0 正式发布,这是迄今为止架构变革最大、性能提升最显著的一个版本。

什么是 JAiRouter?
JAiRouter 是一个 AI 模型服务统一网关,提供:
#mermaid-svg-rg2rVWSWH6GagZBF{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-rg2rVWSWH6GagZBF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-rg2rVWSWH6GagZBF .error-icon{fill:#552222;}#mermaid-svg-rg2rVWSWH6GagZBF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-rg2rVWSWH6GagZBF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-rg2rVWSWH6GagZBF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-rg2rVWSWH6GagZBF .marker.cross{stroke:#333333;}#mermaid-svg-rg2rVWSWH6GagZBF svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-rg2rVWSWH6GagZBF p{margin:0;}#mermaid-svg-rg2rVWSWH6GagZBF .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-rg2rVWSWH6GagZBF .cluster-label text{fill:#333;}#mermaid-svg-rg2rVWSWH6GagZBF .cluster-label span{color:#333;}#mermaid-svg-rg2rVWSWH6GagZBF .cluster-label span p{background-color:transparent;}#mermaid-svg-rg2rVWSWH6GagZBF .label text,#mermaid-svg-rg2rVWSWH6GagZBF span{fill:#333;color:#333;}#mermaid-svg-rg2rVWSWH6GagZBF .node rect,#mermaid-svg-rg2rVWSWH6GagZBF .node circle,#mermaid-svg-rg2rVWSWH6GagZBF .node ellipse,#mermaid-svg-rg2rVWSWH6GagZBF .node polygon,#mermaid-svg-rg2rVWSWH6GagZBF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-rg2rVWSWH6GagZBF .rough-node .label text,#mermaid-svg-rg2rVWSWH6GagZBF .node .label text,#mermaid-svg-rg2rVWSWH6GagZBF .image-shape .label,#mermaid-svg-rg2rVWSWH6GagZBF .icon-shape .label{text-anchor:middle;}#mermaid-svg-rg2rVWSWH6GagZBF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-rg2rVWSWH6GagZBF .rough-node .label,#mermaid-svg-rg2rVWSWH6GagZBF .node .label,#mermaid-svg-rg2rVWSWH6GagZBF .image-shape .label,#mermaid-svg-rg2rVWSWH6GagZBF .icon-shape .label{text-align:center;}#mermaid-svg-rg2rVWSWH6GagZBF .node.clickable{cursor:pointer;}#mermaid-svg-rg2rVWSWH6GagZBF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-rg2rVWSWH6GagZBF .arrowheadPath{fill:#333333;}#mermaid-svg-rg2rVWSWH6GagZBF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-rg2rVWSWH6GagZBF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-rg2rVWSWH6GagZBF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rg2rVWSWH6GagZBF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-rg2rVWSWH6GagZBF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rg2rVWSWH6GagZBF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-rg2rVWSWH6GagZBF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-rg2rVWSWH6GagZBF .cluster text{fill:#333;}#mermaid-svg-rg2rVWSWH6GagZBF .cluster span{color:#333;}#mermaid-svg-rg2rVWSWH6GagZBF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-rg2rVWSWH6GagZBF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-rg2rVWSWH6GagZBF rect.text{fill:none;stroke-width:0;}#mermaid-svg-rg2rVWSWH6GagZBF .icon-shape,#mermaid-svg-rg2rVWSWH6GagZBF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-rg2rVWSWH6GagZBF .icon-shape p,#mermaid-svg-rg2rVWSWH6GagZBF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-rg2rVWSWH6GagZBF .icon-shape .label rect,#mermaid-svg-rg2rVWSWH6GagZBF .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-rg2rVWSWH6GagZBF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-rg2rVWSWH6GagZBF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-rg2rVWSWH6GagZBF :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} OpenAI 兼容 API
AI 模型服务
Ollama
vLLM
GPUStack
Xinference
OpenAI
JAiRouter 网关
路由转发
负载均衡
限流保护
熔断降级
安全认证
您的应用程序
OpenAI SDK / LangChain / HTTP
一句话:用 OpenAI SDK,通过 JAiRouter,访问任何 AI 模型服务。

v2.7.0 核心亮点
1. 🏗️ 架构重塑:微服务化准备
v2.7.0 完成了 487 个文件的 Package 结构重组,为未来的微服务架构演进打下坚实基础:
| 模块 | 文件数 | 职责 |
|---|---|---|
auth/ |
116 | 认证授权(JWT + API Key) |
config/ |
50 | 配置管理、版本控制 |
router/ |
67 | 路由转发、适配器、负载均衡、熔断限流 |
monitor/ |
98 | 监控指标、链路追踪 |
persistence/ |
49 | 数据持久化(H2/Redis) |
common/ |
96 | 公共组件、DTO、工具类 |
收益:
-
代码职责清晰,单个文件平均行数下降 40%
-
模块边界明确,未来可独立拆分为微服务
-
开发效率提升,新人上手时间缩短 50%
2. 📊 Dashboard 实时指标
v2.7.0 重构了 Dashboard 数据源,从 Micrometer 实时获取真实业务指标,告别模拟数据:
-
请求成功率/失败率
-
平均响应时间
-
Token 使用量统计
-
服务健康状态
技术实现 :通过 MetricsBatchReporter 组件,支持 HTTP 和文件两种上报方式,为后续对接 Prometheus/Grafana 做好准备。

3. 🔥 熔断器自适应阈值
新增 自适应阈值调整 功能,根据实时负载动态调整熔断阈值:
yaml
circuit-breaker:
adaptive:
enabled: true
min-calls: 10 # 最小调用次数
failure-rate-threshold: 50 # 失败率阈值 (%)
slow-call-rate-threshold: 80 # 慢调用率阈值 (%)

优势:
-
高峰期自动放宽阈值,避免误熔断
-
低峰期收紧阈值,快速发现问题
-
无需手动调参,智能适应业务波动
4. 🎤 STT(语音转文字)完整支持
v2.7.0 完善了 STT 端点的多部分请求处理,支持语音文件上传:
python
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8080/v1", api_key="not-needed")
with open("speech.mp3", "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper",
file=audio_file
)
print(transcript.text)

支持后端:GPUStack、Xinference、LocalAI、OpenAI
5. 🧪 测试覆盖率提升
测试覆盖率从 28% 提升到 32.2%,新增:
-
Controller 层单元测试(34 个)
-
Service 层单元测试(24 个)
-
Filter 层单元测试(22 个)
-
Validator 单元测试(15 个)
质量保障 :721 个测试全部通过,Checkstyle 警告减少 46%
快速开始
1. 一键启动
bash
docker run -d --name jairouter -p 8080:8080 sodlinken/jairouter:latest
2. 访问管理控制台
打开浏览器访问:http://localhost:8080/admin

默认账号:
-
用户名:
admin -
密码:
ChangeMeOnFirstStartup123456(开发环境默认值)
⚠️ 生产环境:请通过环境变量设置强密码:
bashdocker run -d --name jairouter -p 8080:8080 \ -e INITIAL_ADMIN_PASSWORD="YourSecurePassword!" \ sodlinken/jairouter:latest
3. 配置第一个服务
通过管理控制台或 API 添加服务实例:
bash
# 添加 Ollama 实例
curl -X POST http://localhost:8080/api/config/instance/add/chat \
-H "Content-Type: application/json" \
-d '{
"name": "llama3.2",
"baseUrl": "http://localhost:11434",
"path": "/v1/chat/completions",
"weight": 1
}'

4. 调用 API
python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8080/v1",
api_key="not-needed"
)
response = client.chat.completions.create(
model="llama3.2",
messages=[{"role": "user", "content": "你好!"}]
)
print(response.choices[0].message.content)

功能对比
| 特性 | JAiRouter | Nginx | One-API |
|---|---|---|---|
| OpenAI 兼容 API | ✅ | ❌ | ✅ |
| 负载均衡 | ✅ | ✅ | ✅ |
| 限流保护 | ✅ | ✅ | ✅ |
| 熔断降级 | ✅ | ❌ | ❌ |
| Web 控制台 | ✅ | ❌ | ✅ |
| 配置热更新 | ✅ | ❌ | ✅ |
| 版本控制 | ✅ | ❌ | ❌ |
| 分布式追踪 | ✅ | ❌ | ❌ |
| 开源免费 | ✅ | ✅ | ✅ |
支持的后端服务
| 后端 | Chat | Embedding | Rerank | TTS | STT | Image |
|---|---|---|---|---|---|---|
| Ollama | ✅ | ✅ | - | - | - | - |
| vLLM | ✅ | ✅ | - | - | - | - |
| GPUStack | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| Xinference | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| LocalAI | ✅ | ✅ | - | ✅ | ✅ | ✅ |
| OpenAI | ✅ | ✅ | - | ✅ | ✅ | ✅ |
性能基准测试
在 Ubuntu 22.04(16核/32GB RAM)环境下的测试结果:
| 场景 | 直接访问 Ollama | 通过 JAiRouter | 性能开销 |
|---|---|---|---|
| 单次请求 | 1.2s | 1.21s | <1% |
| 100 并发 | 45s | 48s | ~6% |
| 启用限流 | N/A | 可配置 | - |
| 启用熔断 | N/A | 自动故障转移 | - |
企业级特性
安全认证
-
JWT 双 Token :Access Token + Refresh Token,支持自动续期

-
API Key 管理 :支持创建、撤销、过期控制

-
密码加密:SHA-256 哈希存储,无明文泄露风险
可观测性
-
Prometheus 指标 :
/actuator/prometheus端点 -
OpenTelemetry 追踪:完整的链路追踪支持
-
审计日志 :所有操作可追溯

高可用
-
熔断降级 :自动故障转移

-
限流保护:Token Bucket / Sliding Window 算法
-

-
状态持久化:H2(默认)/ Redis 存储
-

社区与支持
-
Docker Hub :https://hub.docker.com/r/sodlinken/jairouter
-
问题反馈:GitHub Issues
-
技术交流:GitHub Discussions
总结
v2.7.0 是 JAiRouter 项目的一个重要里程碑:
- 架构升级:完成 Package 结构重组,为微服务化做好准备
- 体验提升:Dashboard 实时指标、熔断器自适应、STT 完整支持
- 质量保障:测试覆盖率提升、代码警告减少
如果你正在寻找一个 统一管理 AI 模型服务的网关,JAiRouter 值得一试!
感谢点赞!
如果这个项目对你有帮助,欢迎 Star ⭐ 支持: