大厂Java面试实录:Spring Boot/Cloud + Redis + Kafka + JVM + RAG(Spring AI)三轮追问(小Y翻车版)
故事背景
小Y(自称"资深全栈架构师",实际水货选手)去面某互联网大厂,岗位是电商内容社区(UGC)+ AIGC 智能客服方向的 Java 后端。
面试官(严肃脸):"我们从业务场景出发,三轮。每轮 3~5 个问题,逐步深入。"
小Y(小声):"好嘞,我最擅长从宏观上把控细节。"
第一轮:内容社区 + 电商商品详情(基础到进阶)
Q1:商品详情页很慢,你会怎么定位?(从 JVM 到应用到 DB)
面试官:商品详情接口 P99 从 120ms 飙到 1.5s,你怎么排查?
小Y:先......重启一下服务?一般重启就好了。
面试官(沉默 1 秒):"说说你会看哪些指标、怎么定位链路。"
小Y:那我会看 CPU、内存,然后......如果不行就加机器。
面试官:行,基本方向是对的,但要能落到工具和方法。
Q2:Java 8/11/17 在并发和 GC 上你常用哪些特性?
面试官:你项目用 Java 11/17 的话,为什么?
小Y:因为新版本......更快?
面试官:那具体呢?
小Y:比如 var?啊不对那是 Java 10。反正......升级总没错。
Q3:Spring Boot 中一次 HTTP 请求是怎么走到 Controller 的?
面试官:从 Tomcat/Netty 到 Spring MVC 的 DispatcherServlet,你能说个大概吗?
小Y:请求进来之后,Spring 会自动帮我们处理,然后就到 Controller 了。
面试官:基础概念可以,但我们需要你能解释"为什么能路由到这个方法"。
Q4:MyBatis/JPA 怎么选?连接池为什么大厂都爱 HikariCP?
面试官:商品详情需要 join、也有复杂动态 SQL,你倾向 MyBatis 还是 JPA?
小Y:我一般都选"随缘"。哪个团队用哪个。
面试官:那连接池呢?
小Y:连接池就是......复用连接,HikariCP 听说很快。
面试官:复用连接说对了,继续保持。
第二轮:UGC 流量高峰 + 缓存/消息队列/微服务治理
Q1:UGC 评论区热点内容,缓存怎么设计防止穿透/击穿/雪崩?
面试官:某明星塌房,评论区瞬间爆了,读请求暴涨。你怎么用 Redis 抗住?
小Y:加缓存就行,Redis 顶得住。
面试官:那缓存空值、布隆过滤器、互斥锁、逻辑过期这些,你怎么选?
小Y:我一般选......加大 Redis 内存。
面试官(语气稍缓):"至少你知道 Redis 会爆内存。我们继续。"
Q2:Kafka/RabbitMQ 你怎么选?UGC 审核和消息通知怎么做?
面试官:用户发帖后要:
- 写库
- 触发审核(可能耗时)
- 通知粉丝 你会怎么拆?
小Y:我会写一个大接口都做完,简单。
面试官:大接口会拖慢响应。你会用 MQ 吗?
小Y:会会会,发个消息就好了。至于是 Kafka 还是 RabbitMQ......看心情。
Q3:Spring Cloud 里你怎么做服务间调用和容错?
面试官:你用 OpenFeign 调用"用户服务",怎么做超时、重试、熔断?
小Y:一般不会超时的,我们网络很好。
面试官:如果对方服务抖动呢?
小Y:那就......多试几次?
面试官:至少说到了重试,但需要有策略和边界。
Q4:可观测性怎么做?Prometheus/Grafana/ELK/Jaeger 你怎么串起来?
面试官:线上慢,是 DB 慢、下游慢、GC 慢还是锁竞争?你如何用监控定位?
小Y:看日志。
面试官:日志只是其中一环。链路追踪和指标呢?
小Y:指标就是......QPS、RT?
面试官:对,继续。
第三轮:AIGC 智能客服(RAG/向量库/Agent)+ 云原生
Q1:智能客服为什么需要 RAG?怎么减少幻觉(Hallucination)?
面试官:我们要做"订单问题智能客服"。模型经常瞎编,你怎么解决?
小Y:那就换个更大的模型。
面试官:大模型也会幻觉。RAG 的核心是什么?
小Y:RAG 就是......把资料给它看?
面试官:方向对了。
Q2:Spring AI + 向量数据库(Milvus/Chroma/Redis)怎么落地?
面试官:你说"把资料给它看",那"资料"怎么变成可检索的?
小Y:存到数据库里,然后 like 查询?
面试官:语义检索不是 like。向量化/Embedding 呢?
小Y:Embedding......就是把文字变成数字?
面试官:很好,至少这句是对的。
Q3:Agent(智能代理)怎么做工具调用?MCP/Google A2A 的价值是什么?
面试官:客服不只回答,还要"查订单、改地址、发优惠券"。怎么让模型安全地调用工具?
小Y:让模型直接连数据库查。
面试官(严肃):"这是事故级回答。"
小Y:那......加个 try-catch?
面试官:......我们换个问法。你知道工具调用标准化吗?比如 MCP。
小Y:MCP 我知道,Minecraft Protocol。
面试官(深呼吸):"模型上下文协议。"
Q4:Kubernetes 上的 Java 服务,发布和回滚你怎么做?
面试官:你们 CI/CD 用 Jenkins/GitLab CI,部署到 K8s,怎么做灰度、回滚、探活?
小Y :我一般用 kubectl apply,不行就 kubectl delete。
面试官:行,至少你真干过。
面试收尾
面试官:今天先到这里。你回去等通知,我们 HR 会联系你。
小Y:好的好的(内心:今晚连夜补 RAG 和熔断)。
面试问题详细答案与学习笔记(按业务场景串讲)
下面把每轮问题的"标准化回答思路"补齐,让小白能跟着学。
第一轮答案:商品详情慢如何定位、Java/JVM、Spring MVC、ORM 与连接池
1)商品详情 P99 变慢:定位方法论(指标 → 链路 → 画像)
业务场景:电商商品详情聚合接口通常会:查商品、价格、库存、营销、评价、推荐等多个下游。
排查步骤(由外到内):
- 看全局指标(Micrometer → Prometheus/Grafana)
- QPS、平均 RT、P95/P99、错误率
- JVM:堆使用、GC 次数/耗时、线程数
- Tomcat:线程池忙碌数、队列堆积
- 看链路追踪(Jaeger/Zipkin)
- 找出慢在:DB、Redis、MQ、下游 HTTP/gRPC
- 关注 span:哪个子调用耗时最长
- 看日志(ELK)
- 结构化日志:traceId、userId、商品Id、耗时
- 看 JVM 与系统
- CPU 飙升:热点方法、锁竞争(jstack)
- 内存抖动:频繁 Full GC(GC log)
- 线程阻塞:IO/锁/下游超时
- 看 DB
- 慢查询、索引命中率、锁等待
- 连接池是否耗尽(Hikari 指标)
结论形式:要能说清"慢在谁、为什么慢、怎么修、如何验证"。
2)Java 8/11/17:并发与 GC 常见点
- Java 8:Lambda、Stream、CompletableFuture(异步编排常用)
- Java 11:LTS,HTTP Client(但后端常用 OkHttp/Apache HC)
- Java 17:LTS,性能与 GC 改进;语法特性(sealed、pattern matching 等,视项目而定)
GC:
- 常见组合:Java 8 用 G1;Java 11/17 默认也常用 G1
- 关注:STW、Full GC、老年代增长速度
- 手段:开启 GC log,结合 Prometheus 指标分析
3)Spring MVC 请求链路(能说出关键组件)
- 请求进入 Tomcat(或 Undertow)
- 交给 DispatcherServlet
- DispatcherServlet 根据 HandlerMapping 找到对应 Controller 方法
- 通过 HandlerAdapter 调用方法
- 参数解析:HandlerMethodArgumentResolver
- 返回值处理:HandlerMethodReturnValueHandler
- 视图/序列化:Jackson(JSON)
为什么能路由 :因为启动时扫描 @RequestMapping/@GetMapping 等注解,注册映射。
4)MyBatis vs JPA 怎么选;HikariCP 为什么常用
MyBatis:适合复杂 SQL、动态 SQL、性能可控、DB 特性强依赖。
JPA/Hibernate:适合领域模型清晰、CRUD 多、需要二级缓存/实体关系。
连接池 HikariCP:
- 性能好、实现简洁
- 监控指标丰富(active/idle/pending)
- 与 Spring Boot 默认集成好
Flyway/Liquibase:用于数据库版本管理(迁移脚本可追溯、可回滚策略)。
第二轮答案:Redis 缓存、MQ 选型、微服务治理、可观测性
1)缓存穿透/击穿/雪崩:UGC 热点读场景
穿透(查不存在的 key):
- 布隆过滤器(Bloom Filter)
- 缓存空值(短 TTL)
击穿(热点 key 过期瞬间大量并发打 DB):
- 互斥锁(Redis setnx)
- 逻辑过期(后台异步刷新)
- 热点 key 永不过期 + 版本号更新
雪崩(大量 key 同时过期/Redis 故障):
- TTL 加随机抖动
- 多级缓存(Caffeine 本地 + Redis)
- 限流/降级(Resilience4j)
Spring Cache 可用于统一缓存抽象;热点场景常配合 Caffeine。
2)Kafka vs RabbitMQ:UGC 审核与通知链路
业务拆分建议:
- 发帖接口:写库成功后快速返回
- 异步流程:
- 内容审核(可能调用风控/审核服务)
- 粉丝通知(推送/站内信)
- 搜索索引更新(Elasticsearch)
选型要点:
- Kafka:吞吐高、顺序分区、日志型存储,适合埋点、流式处理、事件总线
- RabbitMQ:路由能力强(topic/direct)、延迟队列、死信等更方便
可靠性关键点:
- 生产端:ack、重试、幂等(Kafka 幂等 producer)
- 消费端:
- 幂等消费(去重表/业务唯一键)
- 重试与死信队列
3)OpenFeign + Resilience4j:超时/重试/熔断/隔离
超时:必须配置(连接超时、读超时)。
重试:只对"幂等请求"或可安全重试的场景;设置最大次数与退避。
熔断:下游故障时快速失败,保护线程资源。
隔离:线程池/信号量隔离,防止级联故障。
降级:返回兜底数据(例如"评价模块暂不可用")。
4)可观测性:指标 + 日志 + 链路
- 指标(Prometheus/Grafana, Micrometer) :
- 业务:下单成功率、审核耗时、队列堆积
- 系统:CPU、load、GC、线程、连接池
- 日志(ELK):结构化日志 + traceId
- 链路(Jaeger/Zipkin + OpenTelemetry):定位慢点
定位慢请求的标准动作:
- Grafana 看 P99 与错误率
- Jaeger 看最长 span
- ELK 按 traceId 还原上下文
第三轮答案:RAG、向量检索、Agent 工具调用、K8s 发布
1)为什么要 RAG;怎么降低幻觉
业务场景:客服回答必须以"企业真实知识/订单数据/规则"为准。
RAG 核心:
- 先从知识库中检索相关内容(语义检索)
- 再把检索结果作为上下文喂给 LLM 生成答案
降低幻觉的手段:
- 高质量知识库(版本、来源可追溯)
- 提示词约束:必须引用资料、没有依据就说"不确定"
- 检索质量:分段(chunking)、重排(rerank)
- 输出校验:规则校验/敏感词/事实校验
2)Spring AI 落地:文档加载 → 向量化 → 向量库 → 检索 → 生成
链路:
- 文档加载:PDF/网页/数据库(企业 FAQ、售后政策)
- 分段:按语义切块,保留标题/来源元数据
- Embedding 向量化:用 OpenAI/Ollama 等 embedding 模型把文本转成向量
- 写入向量数据库:Milvus/Chroma/Redis Vector
- 查询时:用户问题向量化 → 向量相似度检索 topK → 拼接上下文 → LLM 生成
为什么不用 like:语义相似不等于关键词包含。
3)Agent 工具调用;MCP/Google A2A 的价值
正确做法:LLM 不直接连数据库。
Agent 模式:
- LLM 负责"规划":判断要不要调用工具
- 工具(Tool)由后端提供:查订单、改地址、发券(有鉴权、限流、审计)
- 执行结果再反馈给 LLM 组织最终回答
MCP(模型上下文协议):
- 统一"模型 ↔ 工具/资源"的对接方式
- 让工具调用更标准化、可扩展、可治理
A2A(Agent-to-Agent):
- 多个 Agent 协作:客服 Agent 调用订单 Agent、风控 Agent
安全治理:
- OAuth2/JWT 鉴权
- 操作审计日志
- 权限最小化
- 防提示注入(Prompt Injection)与工具参数校验
4)Kubernetes 上 Java 服务的发布/灰度/回滚
- CI:Jenkins/GitLab CI 构建 → Docker 镜像 → 推镜像仓库
- CD:
- 使用 Deployment 滚动更新(RollingUpdate)
- 探活:liveness/readiness/startup probes
- 灰度:
- 金丝雀发布(多版本并存,小流量)
- 或服务网格/Ingress 按比例路由
- 回滚:
kubectl rollout undo deployment/xxx- 版本化 Helm/Argo CD 更稳
小白学习路线(按这场面试补齐能力)
- Java/JVM:线程、锁、GC、profiling
- Spring Boot:MVC、参数解析、异常体系、Actuator/Micrometer
- 数据层:MyBatis/JPA、索引、事务、连接池
- 中间件:Redis 缓存治理、Kafka/RabbitMQ 消息可靠性
- 微服务:OpenFeign + Resilience4j、配置中心、服务发现
- 可观测性:Prometheus+Grafana、ELK、Jaeger
- AI 工程化:Spring AI、RAG、向量库、Agent 工具调用、幻觉治理