2026/08/15 spring AI学习总结
一. Tomcat线程如何配置
1. YAML 写法:
2. java代码实现
1.threads.max: 300— 最大工作线程数
Tomcat 用来实际处理请求的线程池上限。每个 HTTP 请求到达后,会被分配一个工作线程来执行你的 Controller 逻辑。
- 默认值:200
- 你设为 300,意味着最多同时处理 300 个请求
- 当 300 个线程全忙时,新请求不会立即被处理,而是进入等待队列
2.threads.min-spare: 20— 最小空闲线程数
Tomcat 启动时预先创建的线程数量,也是线程池收缩时保留的最低线程数。
- 默认值:10
- 你设为 20,意味着即使没有请求,也会保持 20 个线程待命
- 好处是突发流量来了不用临时创建线程,减少延迟
类比:饭店即使没客人,也至少留 20 个厨师值班。
3.max-connections: 8192— 最大连接数
Tomcat 在任意时刻能同时维持的 TCP 连接数上限(NIO 模式下)。
- 默认值:8192
- 注意:连接数 ≠ 并发处理数。一个连接建立了,但可能还没发请求,也可能在等线程处理
- 当连接数达到 8192 时,新连接会被放入
accept-count等待队列
类比:饭店里最多坐 8192 桌客人。
4.accept-count: 100— 等待队列长度
当max-connections满了之后,操作系统层面还能排队等待的连接数。
- 默认值:100
- 当连接数 + 等待队列都满了(即 8192 + 100 + 1),新请求会被直接拒绝(连接超时或 Connection Refused)
类比:饭店坐满了,门口还有 100 个小板凳,再多人就只能走了。
5.connection-timeout: 20000— 连接超时时间
Tomcat 在接受一个 TCP 连接后,等待客户端发送 HTTP 请求行的最长时间(单位:毫秒)。
- 默认值:20000ms(20 秒)
- 如果客户端建立了连接但 20 秒内没发送任何数据,Tomcat 会主动断开这个连接
- 主要用于防止慢速攻击(Slowloris 等)
二. WebFlux,Streaming,Sentinel使用
1. 常用的类总结
| 技术 | 作用 |
|---|---|
| RestTemplate | 同步 HTTP 调用 |
| WebClient | HTTP 客户端 |
| WebFlux | 非阻塞/响应式编程 |
| Mono | 0~1 个异步结果 |
| Flux | 0~N 个异步结果 |
| SSE | 服务端持续向客户端推送数据 |
| Spring AI Streaming | 大模型 Token 流式返回 |
2. 使用WebFlux编程的好处
同步:
线程 ────────────────等待5秒────────────────>
异步:
线程 ──发请求──释放
↓
处理其他请求
↓
响应回来再继续
3. 使用Sentinel的好处
没有保护情况下拖垮服务:
大量请求
↓
大量调用 DeepSeek
↓
大量超时
↓
大量线程/连接占用
↓
你的 Spring Boot
↓
也开始崩
有防护:
请求
↓
Sentinel
↓
判断是否超过阈值
↓
允许 ─────→ DeepSeek
↓
拒绝
↓
Fallback
↓
"AI服务暂时繁忙,请稍后再试"
4. 一张架构图看懂三者交互
第一版图:
用户
│
▼
POST /ai/chat
│
▼
Sentinel
┌──────┴──────┐
│ │
正常 限流/异常
│ │
▼ ▼
WebFlux Fallback
│ │
▼ ▼
Spring AI “AI服务繁忙”
│
▼
DeepSeek
│
Streaming
│
┌──────┴──────┐
▼ ▼
token1 token2 ...
│ │
└──────┬──────┘
▼
SSE/Flux
│
▼
前端
第二版图: