根据近些年情况整理的Java服务常用中间件及面试复习指南(每个中间件10个以上问题+实战模拟)
中间件分类 | 典型中间件 | 核心应用场景 |
---|---|---|
RPC框架 | Dubbo 3.x、gRPC、Spring Cloud OpenFeign | 微服务通信、跨语言调用 |
消息队列 | Kafka、RocketMQ、RabbitMQ | 异步解耦、削峰填谷、顺序消息 |
缓存 Redis | (集群/Redisson)、Caffeine | 热点数据缓存、分布式锁、本地缓存 |
数据库中间件 | ShardingSphere、MyCat、Seata | 分库分表、读写分离、分布式事务 |
搜索引擎 | Elasticsearch(ES) | 全文检索、日志分析、实时聚合 |
容器化与编排 | Kubernetes(K8s)、Docker | 容器部署、服务弹性伸缩、多云管理 |
API网关 | Spring Cloud Gateway、Kong | 路由转发、鉴权限流、灰度发布 |
配置中心 | Nacos、Apollo、Consul | 动态配置管理、服务注册发现 |
监控与日志 | Prometheus+Grafana、SkyWalking、ELK | 指标监控、链路追踪、日志分析 |
分布式协调 | ZooKeeper、Etcd | 分布式锁、Leader选举、配置管理 |
服务网格 | Istio、Spring Cloud Alibaba Sentinel | 流量治理、熔断降级、服务安全 |
我这边复习中间件基本都使用虚拟机安装docker,大家可以自己选择方式进行安装:
Kafka是什么?典型应用场景有哪些?
(消息队列、流处理平台;日志收集、实时分析、事件驱动架构等)
Kafka的核心组件有哪些?简要说明其作用。
(Producer、Consumer、Broker、Topic、Partition、ZooKeeper)
Topic和Partition的关系是什么?为什么需要分区?
(Topic是逻辑分类,Partition是物理分片;提升并行度和扩展性)
Kafka的消息保留策略是怎样的?
(基于时间log.retention.hours或大小log.retention.bytes,可配置删除或压缩策略)
如何保证Kafka生产者的消息顺序性?
(单分区内有序,需确保同一Key的消息发送到同一分区)
Consumer Group的作用是什么?Rebalance的触发条件有哪些?
(实现消费者负载均衡;消费者加入/离开、订阅Topic变化等)
Kafka Controller的作用是什么?故障时如何恢复?
(管理分区和副本状态;通过ZooKeeper选举新Controller)
如何设计一个高吞吐、低延迟的Kafka集群?
(合理分区数、副本放置策略、调优batch.size/linger.ms、硬件优化)
如何监控Kafka集群的健康状态?常用工具有哪些?
(JMX指标、Kafka Manager、Prometheus+Grafana、Consumer Lag监控)
设计一个分布式系统:要求全局消息顺序,如何使用Kafka实现?
(单分区全局有序,但会成为瓶颈;或通过业务层二次排序)
Kafka如何保证消息的高可用性?Kafka的ISR机制是什么?如何保证数据一致性?
如何实现Kafka的Exactly-Once语义?
Kafka的Rebalance机制可能引发什么问题?如何优化?
Kafka的Topic分区数如何合理设置?
Producer的acks参数有哪些值?各自含义是什么?Kafka Producer的acks参数对消息可靠性有何影响?
Kafka Consumer的auto.offset.reset参数有哪些配置?适用场景?
如何监控Kafka的Lag(消费延迟)?
Kafka的Log Compaction原理是什么?
Kafka与RocketMQ在事务消息实现上的区别是什么?
如何解决Kafka集群中Broker磁盘IO瓶颈?
如何设计Kafka的高可用跨机房容灾方案?(需要实战,未实战,纯理论)
场景:某电商大促期间Kafka积压百万级消息,消费者处理速度跟不上,如何快速解决?
答案要点:
1. 紧急扩容消费者实例(并行度=分区数)
2. 优化消费者处理逻辑(批量处理+异步化)
3. 临时启用备用消费者组分流
4. 降级非核心业务的消息消费
kafka面试问题跟踪链接
Redis支持哪些数据类型?各适用于什么场景?
Redis为什么采用单线程模型?优势与瓶颈是什么?
RDB和AOF持久化的区别?如何选择?混合持久化如何实现?
Redis缓存穿透、雪崩、击穿的解决方案?
如何用Redis实现分布式锁?RedLock算法的核心思想?Redisson的看门狗机制原理?
Redis内存淘汰策略有哪些?Redis的过期键删除策略?
Redis的Pipeline和Lua脚本适用场景是什么?使用时需要注意什么?
如何利用Redis实现延迟队列?
Redis的发布订阅模型有哪些缺点?
什么是脑裂问题?如何避免?Redis集群主从复制的流程是怎样的?集群如何扩容?数据迁移过程?集群模式下,批量操作(如MSET)需要注意什么?Redis集群的Slot分配机制是什么?如何解决数据倾斜?部署模式有哪些?
Redis Sentinel如何实现高可用?
Redis Cluster的数据分片原理?为什么Redis Cluster不支持跨节点事务?Redis Cluster模式下如何实现跨节点事务?Codis与Redis Cluster的优缺点对比?Redis Cluster节点间通信协议?
Redis的Hot Key自动发现与处理方案?Redis大Key(Big Key)的优化策略?Redis内存碎片率高的原因及解决方案?
如何设计一个二级缓存(Redis+Caffeine)架构?Redis 6.0多线程模型如何工作?
场景:某社交平台Redis集群内存使用率超过90%,部分节点频繁触发OOM,如何紧急处理?
答案要点:
1. 分析内存占用(redis-cli --bigkeys)
2. 清理过期Key(主动扫描+设置TTL)
3. 动态扩缩容(Cluster模式增删节点)
4. 启用内存淘汰策略(volatile-lru/allkeys-lfu)
Elasticsearch 在 Java 中最常用的客户端是什么?如何初始化一个 RestHighLevelClient?如何用 Spring Boot 快速集成 Elasticsearch?Spring Data Elasticsearch 如何定义实体类与索引的映射?
ES的倒排索引和正排索引的区别及适用场景?为什么倒排索引适合全文搜索?
Elasticsearch 分页查询的 from+size
有什么缺陷?如何优化深度分页?比较scroll API与search_after的差异
如何通过 Spring Data Elasticsearch 实现复杂查询(如多条件聚合)?商品搜索场景下,如何设计索引映射?说明字段类型选择依据(text/keyword/nested等)?
Elasticsearch 写入性能优化有哪些常见手段?
如何保证 Kafka 数据实时同步到 Elasticsearch?如何清洗
ES分片(Shard)和副本(Replica)的作用?如何合理分配?
ES的Refresh、Flush、Merge操作对性能的影响?
ES如何实现近实时(NRT)搜索?
ES聚合查询的Terms和Cardinality区别?
如何设计ES的冷热数据分离架构?Elasticsearch 集群如何实现高可用?如何避免脑裂问题?如果出现脑裂如何恢复?
如何通过ES实现SQL风格的查询?
如何设计一个支持千万级数据量的搜索系统(结合 MySQL 和 ES)?ES与关系型数据库(MySQL)数据同步方案?如何保证数据库与Elasticsearch的双写一致性?对比采用事务日志与CDC方案的优劣
Elasticsearch 如何实现跨数据中心的数据同步?
ES 在大查询场景下导致 GC 频繁,如何定位和解决?
慢查询分析,如何通过_profile API分析查询性能瓶颈?解释返回结果中的各阶段耗时含义
集群恢复,当节点离线导致分片状态为UNASSIGNED时,如何进行分片重分配?
当出现Elasticsearch bulk写入性能瓶颈时,可以从哪些方面进行优化
场景:某日志系统ES集群写入性能突然下降,如何定位问题?
答案要点:
1. 检查节点状态(_cat/nodes?v)
2. 监控段合并(Segment Merge)频率
3. 分析磁盘IO和JVM内存压力
4. 调整Refresh间隔和Bulk写入大小
一、基础概念
1. 解释Pod与Deployment的关系,为什么生产环境推荐使用Deployment?
2. 开发时如何通过Service暴露应用?ClusterIP、NodePort和LoadBalancer类型的使用场景分别是什么?
3. 解释ConfigMap和Secret的作用,如何在Pod中挂载环境变量?
二、配置管理
apiVersion: apps/v1
kind: Deployment
spec:
template:
spec:
containers:
- name: app
envFrom:
- configMapRef:
name: app-config
- secretRef:
name: db-credentials
4. 上述配置实现了什么功能?开发时如何创建对应的ConfigMap和Secret?
三、存储管理
5. 解释PV和PVC的关系,开发有状态应用时如何挂载持久化存储?
6. 如何通过emptyDir实现容器间的临时文件共享?
四、开发调试
7. 如何快速查看Pod日志?命令格式是怎样的?
8. 调试时如何进入运行中的容器?kubectl exec命令有哪些常用参数?
五、更新策略
9. 解释滚动更新的过程,如何通过kubectl set image
命令触发更新?
10. 版本回滚的命令是什么?如何查看Deployment的更新历史?
六、健康检查
11. Liveness Probe和Readiness Probe的区别?开发时如何配置HTTP检查端点?
12. 如何设置容器的资源限制(CPU/Memory)?
七、多环境管理
13. 如何通过Namespace隔离开发/测试环境?
14. 使用Kustomize管理不同环境配置的基本目录结构是怎样的?
进阶问题
15. 如何通过Init Container实现应用初始化?
16. 解释Horizontal Pod Autoscaler的工作机制
17. 开发微服务时如何配置网络策略(NetworkPolicy)?
18. 使用StatefulSet的场景有哪些?
mysql 一主多从 k8s实战
Seata的AT、TCC、Saga模式的区别及适用场景?
AT模式下的全局锁冲突如何解决?
如何设计幂等性接口防止Seata事务悬挂?
Seata的TC(事务协调器)高可用如何实现?
Seata如何与Spring Cloud整合?
Seata的事务隔离级别是如何保证的?
如何监控Seata的事务执行状态?
Seata的Undo Log存储机制是什么?
如何处理Seata的长事务超时问题?
Seata与消息队列(如RocketMQ)如何实现最终一致性?
场景:下单服务调用库存服务扣减库存时超时,导致分布式事务回滚,但库存已扣减,如何解决?
答案要点:
1. 引入事务状态补偿表
2. 使用TCC模式手工回滚
3. 通过MQ异步触发库存回补
核心问题
Dubbo的服务暴露(Export)和引用(Refer)过程是怎样的?
Dubbo的SPI机制与Java SPI有何区别?
如何实现Dubbo的集群容错(Failover/Failsafe等)?
Dubbo的负载均衡策略有哪些?如何自定义策略?
Dubbo 3.x的「应用级服务发现」与旧版本「接口级发现」有何优势?
Dubbo的线程模型(Dispatcher)如何配置?
如何通过Telnet/QOS命令动态管理Dubbo服务?
Dubbo的泛化调用(GenericService)使用场景是什么?
如何实现Dubbo的跨语言调用(如gRPC协议)?
Dubbo的Filter和Spring Cloud Gateway的Filter有何异同?
场景:某服务调用Dubbo接口超时,但提供方日志显示已收到请求,如何排查?
解决思路:
1. 检查网络延迟(traceroute/tcpping)
2. 分析消费者线程池是否满(Dubbo线程模型配置)
3. 确认序列化/反序列化性能(Hessian2 vs FastJSON)
4. 提供方执行耗时监控(SkyWalking链路追踪)
核心问题
ShardingSphere的SQL解析引擎如何工作?
如何实现分库分表后的分布式主键(Snowflake/UUID)?
分库分表后如何执行跨库JOIN查询?
ShardingSphere的读写分离如何配置?
如何避免分片键(Sharding Key)热点问题?
ShardingSphere的柔性事务(BASE)如何实现?
如何动态扩容分片集群(如从2库扩展到4库)?
ShardingSphere的DistSQL是什么?如何使用?
ShardingSphere与MyCat的核心区别是什么?
如何通过ShardingSphere实现数据加密(Encrypt)?
场景:分库分表后,某用户查询订单列表(按用户ID分片)出现部分数据丢失,如何解决?
解决思路:
1. 检查分片算法是否均匀(取模/范围分片)
2. 验证SQL是否携带分片键
3. 排查广播表(Broadcast Table)配置
4. 检查分布式事务是否回滚部分操作
核心问题
Spring Cloud Gateway的Filter与WebFlux的关系?
如何实现动态路由配置(如数据库存储路由规则)?
网关如何集成JWT实现鉴权?
如何设计灰度发布(金丝雀发布)策略?
Gateway的熔断降级如何与Sentinel整合?
如何通过Gateway实现请求Body的修改?
Gateway的全局异常处理机制如何实现?
Gateway与Nginx的性能对比及适用场景?
如何监控Gateway的请求流量(Prometheus指标)?
如何实现Gateway的高可用集群?
场景:网关转发请求到下游服务时,部分请求返回504超时,如何优化?
解决思路:
1. 调整Gateway的响应超时时间(response-timeout)
2. 检查下游服务线程池是否阻塞
3. 启用Hystrix或Resilience4j熔断
4. 优化WebFlux的EventLoop配置
核心问题
Nacos的CP(AP)模式如何切换?
Nacos如何实现配置的动态推送?
如何保证Nacos配置的最终一致性?
Nacos的集群部署架构如何设计?
Nacos与Spring Cloud Config的兼容性如何?
如何实现Nacos配置的权限管理(RBAC)?
Nacos的配置版本回滚机制如何操作?
Nacos的服务发现与Eureka有何区别?
如何通过Nacos实现服务权重路由?
Nacos的长轮询机制是如何实现的?
场景:Nacos配置更新后,部分服务未及时生效,如何排查?
解决思路:
1. 检查客户端长轮询连接状态
2. 验证配置DataID和Group是否匹配
3. 查看服务端日志是否有推送失败记录
4. 确认客户端缓存是否被清理
核心问题
Prometheus的拉取(Pull)模型如何工作?
如何定义Prometheus的告警规则(Alertmanager)?
SkyWalking的Trace上下文传递原理是什么?
如何通过SkyWalking定位慢SQL问题?
Prometheus的长期存储方案有哪些?
SkyWalking如何实现跨进程的TraceID传递?
如何自定义Prometheus的Exporter?
SkyWalking的OAP集群如何部署?
如何集成Prometheus与Grafana?
SkyWalking的日志采集(Log4j/Logback)如何配置?
场景:某服务CPU使用率突然飙升,如何通过监控工具快速定位问题?
解决思路:
1. Prometheus查看CPU指标(node_cpu_seconds_total)
2. SkyWalking分析该服务的调用链耗时
3. 结合线程Dump(jstack)查找死锁或无限循环
核心问题
ZooKeeper的ZAB协议与Raft协议的区别?
ZooKeeper的Watch机制如何实现?
如何通过ZooKeeper实现分布式锁?
ZooKeeper的临时节点(Ephemeral Node)适用场景?
ZooKeeper的Leader选举流程是怎样的?
ZooKeeper的ACL权限控制如何配置?
ZooKeeper的脑裂问题如何避免?
ZooKeeper的Session超时机制如何工作?
ZooKeeper与Etcd的核心区别是什么?
如何监控ZooKeeper集群的健康状态?
场景:ZooKeeper集群部分节点无法连接,如何恢复?
解决思路:
1. 检查节点日志(OutOfMemoryError)
2. 验证网络分区(Firewall规则)
3. 重启宕机节点并同步数据
4. 调整JVM堆内存参数
核心问题
Istio的Sidecar注入原理是什么?
如何通过Istio实现流量镜像(Mirroring)?
Istio的mTLS如何配置?
Istio的VirtualService和DestinationRule的作用?
如何通过Istio实现熔断(Circuit Breaking)?
Istio的Telemetry模块如何收集指标?
Istio的Control Plane组件有哪些?
如何实现Istio的多集群管理?
Istio与Spring Cloud的整合方案?
Istio的Envoy Filter如何自定义?
场景:Istio启用mTLS后,部分服务通信失败,如何排查?
解决思路:
1. 检查证书颁发(Citadel日志)
2. 验证PeerAuthentication策略
3. 分析Envoy的访问日志(403 Forbidden)
核心问题
MVCC如何解决脏读、不可重复读问题?
MySQL的Read View生成机制是什么?
Undo Log在MVCC中的作用是什么?
事务隔离级别(RC/RR)对MVCC的影响?
MVCC如何与Next-Key Lock配合防止幻读?
Purge线程如何清理旧版本数据?
长事务对MVCC的影响及优化方案?
如何通过InnoDB的隐藏字段(DB_TRX_ID/DB_ROLL_PTR)追踪版本链?
MVCC在SELECT FOR UPDATE时的行为变化?
MVCC是否支持Serializable隔离级别?
场景:某事务在RR隔离级别下多次查询结果不一致(幻读),如何解决?
解决思路:
1. 检查是否使用快照读(MVCC)或当前读(Locking Read)
2. 添加合适的索引减少锁范围
3. 使用SELECT FOR UPDATE强制加锁
分层递进式学习
基础层:中间件核心概念、架构设计(如Kafka的Broker-分区-副本)
原理层:关键机制源码理解(如Redis的RDB持久化流程)
实战层:故障场景模拟(如ES集群脑裂恢复)
工具链实践
使用Docker搭建中间件集群(如Kafka+ZooKeeper三节点)
通过JMeter模拟高并发场景(如Redis缓存击穿测试)
行业案例研究
学习大厂中间件实践(如阿里双11的RocketMQ优化)
分析开源项目设计(如ShardingSphere的SQL解析引擎)
模拟面试训练
技术深度:回答问题时结合源码(如Dubbo的SPI机制)
横向对比:对比同类中间件差异(如Kafka vs RocketMQ)
架构设计:针对场景设计中间件组合方案(如亿级订单系统架构)