中间件就是操作系统和应用之间的那层胶水,帮你搞定分布式系统的各种脏活累活。用户请求从浏览器到数据库,中间要经过Nginx 接待、Tomcat 干活、Redis 缓存、Kafka 传话、ELK 记账、Zabbix 放哨——这一页把九大类中间件一次讲透,从安装配置到集群部署到面试高频题,一本书的厚度。
本页目录 · 九大类,外加选型和面试题
- 最新版本与兼容性
- 中间件全景总览
- Web 服务器中间件(Nginx / Apache)
- 数据库中间件(连接池 / 读写分离 / 分库分表)
- 消息中间件(Kafka / RabbitMQ)
- 缓存中间件(Redis / Memcached)
- 应用服务器中间件(Tomcat / JBoss)
- 事务中间件(2PC / TCC / Seata / Saga)
- 安全中间件(WAF / TLS)
- 日志中间件(ELK / Fluentd)
- 监控中间件(Zabbix / Nagios / Prometheus)
- 中间件选型决策树
- 面试高频 30 题
- 综合练习 15 题
- 全书小结与自测
- 服务网格(Istio / Envoy)
- API 网关(Kong / APISIX)
- 服务发现与协调(ZooKeeper / etcd / Consul)
- 消息队列补全(Apache Pulsar)
第 1 节 · 最新版本与兼容性基线
装之前先搞清楚版本。中间件这行有个规矩:stable 分支上生产,mainline 分支尝鲜。下面这张表是本页所有示例的
第 2 节 · Web 服务器中间件:Nginx 与 Apache
Nginx 就是前台接待员——所有用户请求先到它这,它笑盈盈地接过请求,能自己搞定的(静态图片、HTML)直接给你,搞不
第 3 节 · 数据库中间件:连接池、读写分离、分库分表
数据库中间件就是"在应用和数据库之间加一层",搞定三件事:连接池(别每次都重新建连接)、读写分离(写主库读从库)、分库分
第 4 节 · 消息中间件:Kafka 与 RabbitMQ
消息中间件就是系统之间的邮局。以前 A 系统要通知 B 系统,直接打电话(同步调用),B 挂了 A 也卡住。现在 A 把
第 5 节 · 缓存中间件:Redis 与 Memcached
Redis 就是内存里的百货商店——内存键值数据库,C 语言写的,单线程事件驱动,性能极高,缓存/会话/排行榜/分布式锁
第 6 节 · 应用服务器中间件:Tomcat 与 JBoss
Tomcat 就是Java 代码的跑马场——Apache 开源 Servlet 容器,轻量级,你写的 Servlet/S
第 7 节 · 事务中间件:分布式事务与 Seata
分布式事务就是跨多个数据库/服务的事务,要么全成功要么全回滚。你下单要扣库存(库存服务)、减余额(账户服务)、写订单(订
第 8 节 · 安全中间件:WAF 与 TLS/SSL
安全中间件就是门口的安检。WAF 拦 SQL 注入、XSS、CSRF 这些恶意请求;TLS 给通信加密,让窃听者看到的是
第 9 节 · 日志中间件:ELK 与 Fluentd
日志中间件就是机房的行车记录仪。出了线上事故,你第一句话就是"查日志"。但几十台服务器,每台上百个日志文件,你一台台 S
第 10 节 · 监控中间件:Zabbix 与 Prometheus
Zabbix 就是机房的保安——服务器 CPU 飙了、磁盘满了、进程死了,它第一时间给你发邮件。没有监控,线上挂了你都是
第 11 节 · 中间件选型决策树
学了一大堆,真到项目里怎么选?这张表就是你的"快速决策卡"——场景一列,答案一目了然。
第 12 节 · 面试高频 30 题
中间件面试就考这些,点开展开看答案。覆盖 Nginx/Kafka/Redis/RabbitMQ/分布式事务/ELK/Za
第 13 节 · 服务网格:Istio + Envoy
前面几章你应该已经发现了:微服务里真正难写的从来不是业务,而是业务旁边那一堆治理代码——超时设多少、失败要不要重试、下游
第 14 节 · API 网关:Kong 与 APISIX
如果说服务网格管的是"服务之间怎么说话"(东西向流量),那 API 网关管的是"外面的人怎么进来"(南北向流量)。它是所
第 15 节 · 服务发现与协调:ZooKeeper / etcd /
微服务一上规模,第一个现实问题就来了:订单服务要知道库存服务在哪。而库存服务今天 3 个实例、明天扩到 8 个、IP 还
第 16 节 · 消息队列补全:Apache Pulsar
第 3 章我们讲过 Kafka 和 RabbitMQ,第 6 章提到过 RocketMQ 的事务消息。但消息队列的世界里
中间件全景总览:九大类在系统里各站哪
用户在浏览器点一下"下单"按钮,请求穿过公网,经过 CDN,到机房,然后一路往下走。下面这张图就是请求从外到内要经过的"关卡",每一关都有对应的中间件在站岗。
论九大类中间件一句话定位
① Web 服务器中间件(Nginx / Apache):前台接待员。所有 HTTP 请求先到它这,它决定是直接给静态文件,还是把你转发给后面的 Tomcat。
② 数据库中间件(连接池 / 读写分离 / 分库分表):数据库的大管家。应用不直接连数据库,通过它拿连接、分流、分库。
③ 消息中间件(Kafka / RabbitMQ):邮局。系统之间不靠"打电话"(同步调用),靠"写信"(异步消息),削峰填谷、解耦、最终一致性。
④ 缓存中间件(Redis / Memcached):内存里的百货商店。热点数据放这,别每次都去敲数据库的门。
⑤ 应用服务器中间件(Tomcat / JBoss):Java 代码的跑马场。你的 Servlet、Spring Boot 打包的 WAR 扔进去它给你跑起来。
⑥ 事务中间件(2PC / TCC / Seata):跨服务的对账员。一个下单操作要扣库存、减余额、写订单,这三步要么全成要么全撤,它负责协调。
⑦ 安全中间件(WAF / TLS):门口的安检。WAF 拦 SQL 注入、XSS;TLS 给通信加密,让窃听者看到的是乱码。
⑧ 日志中间件(ELK / Fluentd):机房的行车记录仪。所有服务器的日志收集到一起,出了事能查、能搜、能画图表。
⑨ 监控中间件(Zabbix / Prometheus):机房的保安。CPU 飙了、磁盘满了、进程死了,第一时间给你发邮件。
综合练习 15 题
配置题+排错题+设计题混合,检验你是不是真懂了。点开展开看答案。
1.(配置题)Nginx 把 /api/ 反代到 http://127.0.0.1:8080,并传真实 IP。写出 location 块。
查看答案
location /api/ { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; }
2.(排错题)Kafka 消费总是重复,为什么?
查看答案
enable.auto.commit=true 且自动提交 offset 太早(处理完前就提交了)。如果处理崩了,offset 已提交但消息没处理完。解决:关闭自动提交,处理完手动 commitSync()。
3.(设计题)秒杀场景怎么设计中间件架构?
查看答案
Nginx 限流 → Redis Lua 原子扣库存(防超卖)→ 抢成功的写数据库 → Kafka 异步发通知 → Redis 分布式锁防重复下单。
4.(排错题)Redis 内存满了开始报错,怎么回事?
查看答案
maxmemory-policy 是 noeviction(默认),内存满了写直接报错。改成 allkeys-lru 自动淘汰。
5.(设计题)跨服务下单要扣库存+减余额+写订单,怎么保证一致性?
查看答案
用 Seata AT 模式,在订单服务方法上加 @GlobalTransactional 注解。任何一步失败自动回滚。无业务侵入。
6.(配置题)RabbitMQ 怎么实现订单 30 分钟超时取消?
查看答案
TTL 队列(消息 TTL=30min,没人消费)+ 死信交换机 DLX + 取消队列。消息 30 分钟变死信,路由到取消队列,消费者取消订单。
7.(排错题)Nginx reload 报错 "unknown directive",怎么排查?
查看答案
先跑 nginx -t,它会告诉你第几行、什么 directive 不认识。大概率是拼写错误或没加模块。
8.(设计题)日志怎么从 10 台服务器集中收集到一起搜索?
查看答案
每台装 Filebeat 监控日志文件 → 发到 Logstash 解析 → 存到 Elasticsearch → Kibana 搜索可视化。
9.(排错题)Redis 主从切换后客户端还连旧主,为什么?
查看答案
没配 Sentinel。Sentinel 负责自动故障转移并通知客户端新主地址。单主从没有自动切换。
10.(配置题)Tomcat 最大线程数怎么调?
查看答案
server.xml 里 Connector 的 maxThreads 参数,默认 200。按业务调:IO 密集型可大些,CPU 密集型和核数差不多。
11.(设计题)怎么监控一台服务器 CPU 超过 90% 发邮件告警?
查看答案
Zabbix:装 Agent → 加主机 → 用 Linux 模板 → 触发器设 CPU>90% → 动作配邮件通知。
12.(排错题)Kafka 消费者 lag 一直涨,怎么排查?
查看答案
① 消费者处理慢(业务逻辑慢);② 分区数少于消费者数(有消费者空闲);③ rebalance 频繁;④ 下游写入慢。
13.(配置题)Nginx 怎么配 HTTPS?
查看答案
listen 443 ssl http2; ssl_certificate 证书; ssl_certificate_key 私钥; ssl_protocols TLSv1.2 TLSv1.3; 再加 HTTP 80 端口 301 跳 HTTPS。
14.(设计题)Redis 缓存和数据库一致性怎么保证?
查看答案
① 先更新数据库再删缓存(Cache Aside Pattern);② 延迟双删(删缓存→更新DB→延迟再删缓存);③ 监听 binlog(Canal)异步删缓存。
15.(排错题)线上突然所有请求都超时,日志全是数据库连接超时,怎么回事?
查看答案
连接池满了。maxActive 太小或连接没释放。查 HikariCP 等待超时日志,调大 maxActive,检查是否有连接泄漏(忘了 close)。
全书小结与自测
① 九大类中间件你已经从安装讲到集群讲到面试:Nginx 接待、数据库中间件管连接、Kafka/RabbitMQ 传话、Redis 缓存、Tomcat 跑代码、Seata 管事务、WAF/TLS 安检、ELK 记账、Zabbix 放哨。
② 中间件不是背命令,理解"它在系统架构里站哪、解决什么问题"比记参数重要一百倍。
③ 下一步:挑一个中间件(推荐 Redis 或 Nginx),在你自己的项目里真的装一遍、配一遍、跑一遍。动手比看书管用十倍。
1.(概念题)中间件在系统架构里站哪一层?举三个例子。
查看答案
在操作系统和应用之间。Nginx 在最前面接待、Redis 在数据库前面缓存、Kafka 在服务之间传话。一句话:帮你搞定分布式系统的脏活累活。
2.(选择题)高并发日志采集(每秒几十万条)选 Kafka 还是 RabbitMQ?
查看答案
Kafka。Kafka 吞吐量极高(几十万/秒),顺序写磁盘,是大数据管道的事实标准。RabbitMQ 适合企业级可靠消息但吞吐不如 Kafka。
3.(简答题)缓存穿透、击穿、雪崩分别是什么?怎么解决?
查看答案
穿透=查不存在的数据→布隆过滤器;击穿=热点key过期瞬间大量请求打DB→互斥锁/永不过期;雪崩=大量key同时过期→随机TTL+集群+熔断。
4.(设计题)电商下单要跨库存、账户、订单三个服务,怎么保证一致性?
查看答案
Seata AT 模式:订单服务加 @GlobalTransactional 注解,一阶段各服务本地提交+记录 undo log,二阶段成功删 log、失败用 undo log 反向回滚。无侵入,注解式。
5.(排错题)Nginx 改完配置 reload 后,网站打不开了,第一步做什么?
查看答案
跑 nginx -t 检查语法。如果语法报错,改完再 reload。如果语法没问题,看错误日志 /var/log/nginx/error.log,按报错信息排查。千万别在不看日志的情况下瞎改。