技术栈学院 · 中间件全景

中间件就是操作系统和应用之间的那层胶水,帮你搞定分布式系统的各种脏活累活。用户请求从浏览器到数据库,中间要经过Nginx 接待、Tomcat 干活、Redis 缓存、Kafka 传话、ELK 记账、Zabbix 放哨——这一页把九大类中间件一次讲透,从安装配置到集群部署到面试高频题,一本书的厚度。

1
第 1 节 · 最新版本与兼容性基线
Versions & Compatibility Matrix

装之前先搞清楚版本。中间件这行有个规矩:stable 分支上生产,mainline 分支尝鲜。下面这张表是本页所有示例的

进入本节 →
2
第 2 节 · Web 服务器中间件:Nginx 与 Apache
Web Server Middleware · Nginx / Apache

Nginx 就是前台接待员——所有用户请求先到它这,它笑盈盈地接过请求,能自己搞定的(静态图片、HTML)直接给你,搞不

进入本节 →
3
第 3 节 · 数据库中间件:连接池、读写分离、分库分表
Database Middleware · Connection Pool /

数据库中间件就是"在应用和数据库之间加一层",搞定三件事:连接池(别每次都重新建连接)、读写分离(写主库读从库)、分库分

进入本节 →
4
第 4 节 · 消息中间件:Kafka 与 RabbitMQ
Message Queue · Kafka / RabbitMQ

消息中间件就是系统之间的邮局。以前 A 系统要通知 B 系统,直接打电话(同步调用),B 挂了 A 也卡住。现在 A 把

进入本节 →
5
第 5 节 · 缓存中间件:Redis 与 Memcached
Cache Middleware · Redis / Memcached

Redis 就是内存里的百货商店——内存键值数据库,C 语言写的,单线程事件驱动,性能极高,缓存/会话/排行榜/分布式锁

进入本节 →
6
第 6 节 · 应用服务器中间件:Tomcat 与 JBoss
Application Server · Tomcat / WildFly

Tomcat 就是Java 代码的跑马场——Apache 开源 Servlet 容器,轻量级,你写的 Servlet/S

进入本节 →
7
第 7 节 · 事务中间件:分布式事务与 Seata
Distributed Transaction · 2PC / TCC / Se

分布式事务就是跨多个数据库/服务的事务,要么全成功要么全回滚。你下单要扣库存(库存服务)、减余额(账户服务)、写订单(订

进入本节 →
8
第 8 节 · 安全中间件:WAF 与 TLS/SSL
Security Middleware · WAF / TLS

安全中间件就是门口的安检。WAF 拦 SQL 注入、XSS、CSRF 这些恶意请求;TLS 给通信加密,让窃听者看到的是

进入本节 →
9
第 9 节 · 日志中间件:ELK 与 Fluentd
Log Middleware · ELK Stack / Fluentd

日志中间件就是机房的行车记录仪。出了线上事故,你第一句话就是"查日志"。但几十台服务器,每台上百个日志文件,你一台台 S

进入本节 →
10
第 10 节 · 监控中间件:Zabbix 与 Prometheus
Monitoring · Zabbix / Nagios / Prometheu

Zabbix 就是机房的保安——服务器 CPU 飙了、磁盘满了、进程死了,它第一时间给你发邮件。没有监控,线上挂了你都是

进入本节 →
11
第 11 节 · 中间件选型决策树
Middleware Selection Decision Tree

学了一大堆,真到项目里怎么选?这张表就是你的"快速决策卡"——场景一列,答案一目了然。

进入本节 →
12
第 12 节 · 面试高频 30 题
30 Must-Know Interview Questions

中间件面试就考这些,点开展开看答案。覆盖 Nginx/Kafka/Redis/RabbitMQ/分布式事务/ELK/Za

进入本节 →
13
第 13 节 · 服务网格:Istio + Envoy
Service Mesh · Istio / Envoy / Sidecar

前面几章你应该已经发现了:微服务里真正难写的从来不是业务,而是业务旁边那一堆治理代码——超时设多少、失败要不要重试、下游

进入本节 →
14
第 14 节 · API 网关:Kong 与 APISIX
API Gateway · Kong / APISIX / Rate Limit

如果说服务网格管的是"服务之间怎么说话"(东西向流量),那 API 网关管的是"外面的人怎么进来"(南北向流量)。它是所

进入本节 →
15
第 15 节 · 服务发现与协调:ZooKeeper / etcd /
Service Discovery & Coordination · ZooKe

微服务一上规模,第一个现实问题就来了:订单服务要知道库存服务在哪。而库存服务今天 3 个实例、明天扩到 8 个、IP 还

进入本节 →
16
第 16 节 · 消息队列补全:Apache Pulsar
Message Queue · Pulsar vs Kafka vs Rocke

第 3 章我们讲过 Kafka 和 RabbitMQ,第 6 章提到过 RocketMQ 的事务消息。但消息队列的世界里

进入本节 →
01

中间件全景总览:九大类在系统里各站哪

Middleware Landscape · Where Each One Sits

用户在浏览器点一下"下单"按钮,请求穿过公网,经过 CDN,到机房,然后一路往下走。下面这张图就是请求从外到内要经过的"关卡",每一关都有对应的中间件在站岗。

浏览器 / App
用户发起 HTTPS 请求
→
WAF
第七类:安全中间件,拦恶意请求
→
Nginx
第一类:Web 服务器,接待+反向代理+负载均衡
Tomcat / JBoss
第五类:应用服务器,跑你的 Java 代码
←
Redis
第四类:缓存中间件,挡在数据库前面
←
Kafka / RabbitMQ
第三类:消息中间件,异步解耦
Seata
第六类:事务中间件,跨服务一致性
→
数据库中间件
第二类:读写分离 / 分库分表
→
MySQL / PG
真正存数据的地方
ELK + Filebeat
第八类:日志中间件,记录谁干了啥
+
Zabbix / Prometheus
第九类:监控中间件,机器一咳嗽就报警
这两层是"旁路"——不拦请求,只记录和盯梢

论九大类中间件一句话定位

① 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 飙了、磁盘满了、进程死了,第一时间给你发邮件。

13

综合练习 15 题

15 Comprehensive Exercises

配置题+排错题+设计题混合,检验你是不是真懂了。点开展开看答案。

综合练习(点开展开答案)

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)。

14

全书小结与自测

Summary & Self-Test
记
全书读完,你现在的位置

① 九大类中间件你已经从安装讲到集群讲到面试:Nginx 接待、数据库中间件管连接、Kafka/RabbitMQ 传话、Redis 缓存、Tomcat 跑代码、Seata 管事务、WAF/TLS 安检、ELK 记账、Zabbix 放哨。

② 中间件不是背命令,理解"它在系统架构里站哪、解决什么问题"比记参数重要一百倍。

③ 下一步:挑一个中间件(推荐 Redis 或 Nginx),在你自己的项目里真的装一遍、配一遍、跑一遍。动手比看书管用十倍。

自测 5 题(不看前面,先答再对答案)

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,按报错信息排查。千万别在不看日志的情况下瞎改。