Java 后端常用的应用层中间件——Netty、Nginx、RPC、Dubbo、Elasticsearch、MongoDB、XXL-JOB。
跟下面这两个相邻模块的边界:
- 网络协议 + IO 基础(TCP / HTTP / IO 模型 / 多路复用 / 零拷贝 / WebSocket)→ 拆出到 Network 模块,本模块默认你已经懂这些。
- 缓存 / 消息 / 关系数据库等同样属于"中间件"的核心存储 → 各自在 Redis / MQ / MySQL 模块单独成体系。
本模块特指通信框架 + 反向代理 + 远程调用 + 搜索引擎 + NoSQL 文档库 + 分布式调度这一类——Java 后端最常自建或选型的中间件。
| 文档 |
一句话定位 |
| Netty |
主从 Reactor / EventLoop / Pipeline / ByteBuf / 内存池 |
| Nginx |
Master-Worker / epoll 异步 / 反代 LB / 限流 / HTTPS 卸载 |
| 文档 |
一句话定位 |
| RPC 原理 |
序列化对比 / 协议设计 / HTTP vs RPC / 主流框架横评 |
| Dubbo |
10 层架构 / SPI 微内核 / 集群容错 / Triple 协议 |
| 文档 |
一句话定位 |
| MongoDB |
WiredTiger / 副本集选举 + Oplog / 分片片键 / 4.0 事务 / 踩坑 |
| 文档 |
一句话定位 |
| XXL-JOB |
Admin + Executor / DB 行锁调度 / 9 路由 + 分片广播 / 失败处理 |
WebSocket(HTTP Upgrade / 帧格式 / 心跳 / 长连接架构)已迁到 Network 模块,因为它本质是网络协议而非中间件框架。
| 高频题 |
跳转 |
| 为什么不用 JDK NIO? |
Netty |
| Netty 线程模型 / EventLoop? |
Netty |
| ByteBuf vs ByteBuffer? |
Netty |
| Pipeline 的 Inbound/Outbound 顺序? |
Netty |
| TCP 粘包/拆包怎么处理? |
Netty |
| Netty 怎么做心跳? |
Netty |
| Netty 内存泄漏怎么排查? |
Netty |
| 业务慢怎么不阻塞 IO 线程? |
Netty |
| FastThreadLocal 比 ThreadLocal 快在哪? |
Netty |
| 高频题 |
跳转 |
| ES 为什么这么快? |
ES |
| 倒排索引 / Term Index / DocValues 是啥? |
ES |
| ES 写入流程? |
ES |
| refresh / flush / merge 区别? |
ES |
| ES 是实时的吗? |
ES |
| term vs match 区别? |
ES |
| filter vs must 区别? |
ES |
| 怎么解决深分页? |
ES |
| text 字段聚合 OOM 怎么办? |
ES |
| 怎么避免脑裂? |
ES |
[Network 模块] ← 前置:协议、IO 模型、零拷贝
TCP / HTTP / epoll
IO 模型 / 零拷贝
│
│ 提供基础设施
▼
┌───────┴───────┐
▼ ▼
[Netty] [Nginx]
主从 Reactor Master-Worker
ByteBuf+Pipeline epoll 异步
│ │
├──────┬────────┼─────────┐
▼ ▼ ▼ ▼
[RPC原理] [ES] [MongoDB] (Web 入口)
序列化+协议 Lucene WiredTiger
│ + 副本集 + 分片
▼
[Dubbo] [XXL-JOB]
SPI + Cluster Admin + Executor
Triple 协议 DB 行锁调度
↑
└ 依赖 MySQL 行锁
(见 MySQL 模块)
核心传导:
- Java 中间件的网络底盘:几乎都是 Netty(Dubbo / RocketMQ / ES Transport / Spring Cloud Gateway)。
- 流量入口:Nginx 是 Web 网关事实标准,应用层网关用 Spring Cloud Gateway(Microservice 模块)。
- 微服务调用:HTTP RPC(Feign / Spring Cloud)vs 二进制 RPC(Dubbo)—— 选型见 RPC 原理。
- 存储分工:MySQL(强事务 OLTP)/ MongoDB(半结构化 + 弹性 schema)/ ES(检索分析)/ Redis(缓存)—— 典型架构 MySQL+MongoDB 主存,CDC 同步到 ES 检索,Redis 顶热。
- 调度 vs 事件驱动:周期定时(凌晨对账、批处理)用 xxl-job;事件触发(订单超时关闭)用 MQ 延迟消息别用 xxl-job 扫表。
0. 先看 Network 模块 ← 必修:TCP/HTTP/IO 模型/epoll/零拷贝
1. Netty ← Java 网络框架天花板
2. Nginx ← Web 入口 / 网关基础
3. RPC 原理 ← 远程调用通用原理
4. Dubbo ← Java RPC 工业实现
5. Elasticsearch ← 搜索引擎专题
6. MongoDB ← NoSQL 文档库(建议先看 MySQL/InnDB 做对照)
7. XXL-JOB ← 分布式任务调度(先看 MySQL/锁机制 + Distributed/分布式锁)
↓ 进入应用层
8. Microservice/Feign + SpringCloudGateway ← 微服务侧 RPC + 网关
每篇都已配 答题模板(60 秒话术)——直接复述就是 senior 级回答:
| 序列化 |
大小 |
速度 |
跨语言 |
字段兼容 |
备注 |
| JSON |
★ |
★★ |
✅ |
强 |
HTTP 默认、可读性好 |
| Hessian2 |
★★★ |
★★★ |
✅(弱) |
中 |
Dubbo 默认 |
| Kryo |
★★★★ |
★★★★ |
❌ |
弱 |
Spark 用 |
| Protobuf ⭐ |
★★★★★ |
★★★★ |
✅ |
强 |
gRPC 标配 |
| FlatBuffers |
★★★★★ |
★★★★★ |
✅ |
强 |
零拷贝反序列化 |
| 策略 |
行为 |
适用 |
| Failover(默认) |
失败重试其他节点 |
读 + 幂等 |
| Failfast |
失败立即抛异常 |
写(避免重复扣款) |
| Failsafe |
异常吞掉 |
日志类 |
| Failback |
异步重试 |
通知类 |
| Forking |
并行多节点取最快 |
读 + 强一致 |
| Broadcast |
广播全部 |
配置同步 |
| 算法 |
说明 |
| Random(默认) |
加权随机 |
| RoundRobin |
加权轮询 |
| LeastActive ⭐ |
最少活跃数,自动避开慢节点 |
| ConsistentHash |
一致性哈希,用户粘性 |
| ShortestResponse |
最短响应时间,更激进避慢 |
| 子句 |
评分 |
缓存 |
用途 |
| must |
✅ |
❌ |
全文匹配 |
| must_not |
— |
❌ |
排除 |
| filter ⭐ |
❌ |
✅ |
不需评分必用(status / range) |
| should |
✅ |
❌ |
OR / 加分 |
| term |
— |
— |
不分词精确匹配(keyword) |
| match |
✅ |
❌ |
分词全文搜索(text) |
- Netty 内存泄漏:ByteBuf 没 release → 堆外内存爆。开 PARANOID 检测,用 SimpleChannelInboundHandler 自动 release。→ Netty
- 业务阻塞 EventLoop:DB/RPC 直接在 Handler 调 → IO 线程卡死全员超时。必派发独立线程池。→ Netty
- Dubbo retries 用在写接口:Failover 重试 3 次 → 重复扣款。写接口必
cluster=failfast + 幂等。→ Dubbo
- Dubbo 优雅下线丢请求:发版必先反注册再等 30s。→ Dubbo
- 超时设置错误雪崩:下游超时 ≥ 上游 → 上游已超时下游还在跑,连接池打满。→ Dubbo / RPC 原理
- ES 深分页 OOM:from + size 上限 10000,用 search_after / PIT。→ ES
- ES fielddata 爆 Heap:text 字段聚合 → 用 keyword + DocValues。→ ES
- ES mapping 爆炸:dynamic: true + 动态字段 → Cluster State 巨大、Master 卡死。
dynamic: strict + total_fields.limit。→ ES
- MongoDB 片键选错:单调递增 ID 当片键 = 写热点,4.4 前重建集群代价巨大。→ MongoDB
- MongoDB Oplog 太小 Secondary 追不回来:失联超 oplog 窗口 → 永远 RECOVERING。生产保 24~72h。→ MongoDB
- xxl-job 调度日志爆库:默认保留 30 天,海量任务一周撑爆 MySQL。
logretentiondays:7 + 独立 DB。→ XXL-JOB
- xxl-job 任务超时 kill 不掉:业务代码必须响应
Thread.interrupt(),否则 kill 命令无效。→ XXL-JOB
- Network 模块 — TCP / HTTP / IO 模型 / 多路复用 / 零拷贝 / WebSocket(前置必修)
- Microservice 模块 — Spring Cloud Feign / Gateway 是另一套 HTTP RPC + 网关方案
- Distributed 模块 — Raft / Gossip / 一致性哈希 / 分布式锁(ES / MongoDB / Dubbo / xxl-job 实现层引用)
- MQ 模块 — RocketMQ Remoting 基于 Netty;延迟消息是 xxl-job 周期扫表的更优替代方案
- Redis 模块 — Redis 单 Reactor + epoll 极致案例;MongoDB + Redis 缓存常见双写一致性方案
- MySQL 模块 — InnoDB B+ Tree 与 MongoDB WiredTiger 对照;行锁原理是 xxl-job 调度协调的根基
- JVM 模块 — 堆外内存(Netty Direct Buffer)/ GC / 调优
- Concurrency 模块 — 线程模型 / FastThreadLocal / 任务线程池(xxl-job Executor 基础)