大厂Java面试实录:Spring Boot/Cloud + Redis + Kafka + JVM + RAG(Spring AI)三轮追问(小Y翻车版)

大厂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 审核和消息通知怎么做?

面试官:用户发帖后要:

  1. 写库
  2. 触发审核(可能耗时)
  3. 通知粉丝 你会怎么拆?

小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 变慢:定位方法论(指标 → 链路 → 画像)

业务场景:电商商品详情聚合接口通常会:查商品、价格、库存、营销、评价、推荐等多个下游。

排查步骤(由外到内)

  1. 看全局指标(Micrometer → Prometheus/Grafana)
    • QPS、平均 RT、P95/P99、错误率
    • JVM:堆使用、GC 次数/耗时、线程数
    • Tomcat:线程池忙碌数、队列堆积
  2. 看链路追踪(Jaeger/Zipkin)
    • 找出慢在:DB、Redis、MQ、下游 HTTP/gRPC
    • 关注 span:哪个子调用耗时最长
  3. 看日志(ELK)
    • 结构化日志:traceId、userId、商品Id、耗时
  4. 看 JVM 与系统
    • CPU 飙升:热点方法、锁竞争(jstack)
    • 内存抖动:频繁 Full GC(GC log)
    • 线程阻塞:IO/锁/下游超时
  5. 看 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 请求链路(能说出关键组件)

  1. 请求进入 Tomcat(或 Undertow)
  2. 交给 DispatcherServlet
  3. DispatcherServlet 根据 HandlerMapping 找到对应 Controller 方法
  4. 通过 HandlerAdapter 调用方法
  5. 参数解析:HandlerMethodArgumentResolver
  6. 返回值处理:HandlerMethodReturnValueHandler
  7. 视图/序列化: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):定位慢点

定位慢请求的标准动作:

  1. Grafana 看 P99 与错误率
  2. Jaeger 看最长 span
  3. ELK 按 traceId 还原上下文

第三轮答案:RAG、向量检索、Agent 工具调用、K8s 发布

1)为什么要 RAG;怎么降低幻觉

业务场景:客服回答必须以"企业真实知识/订单数据/规则"为准。

RAG 核心

  • 先从知识库中检索相关内容(语义检索)
  • 再把检索结果作为上下文喂给 LLM 生成答案

降低幻觉的手段

  • 高质量知识库(版本、来源可追溯)
  • 提示词约束:必须引用资料、没有依据就说"不确定"
  • 检索质量:分段(chunking)、重排(rerank)
  • 输出校验:规则校验/敏感词/事实校验

2)Spring AI 落地:文档加载 → 向量化 → 向量库 → 检索 → 生成

链路

  1. 文档加载:PDF/网页/数据库(企业 FAQ、售后政策)
  2. 分段:按语义切块,保留标题/来源元数据
  3. Embedding 向量化:用 OpenAI/Ollama 等 embedding 模型把文本转成向量
  4. 写入向量数据库:Milvus/Chroma/Redis Vector
  5. 查询时:用户问题向量化 → 向量相似度检索 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 更稳

小白学习路线(按这场面试补齐能力)

  1. Java/JVM:线程、锁、GC、profiling
  2. Spring Boot:MVC、参数解析、异常体系、Actuator/Micrometer
  3. 数据层:MyBatis/JPA、索引、事务、连接池
  4. 中间件:Redis 缓存治理、Kafka/RabbitMQ 消息可靠性
  5. 微服务:OpenFeign + Resilience4j、配置中心、服务发现
  6. 可观测性:Prometheus+Grafana、ELK、Jaeger
  7. AI 工程化:Spring AI、RAG、向量库、Agent 工具调用、幻觉治理
相关推荐
JAVA面经实录9171 小时前
Java 并发工具类
java·大数据·开发语言
驭渊的小故事1 小时前
Java数据结构集合框架(顺序表(ArrayList)的详细解析)(两千字详细解析)
java·开发语言
weixin_444012931 小时前
Go语言怎么防SQL注入_Go语言SQL注入防护教程【深入】
jvm·数据库·python
luck_bor1 小时前
File 类核心笔记
java·前端·算法
ZC跨境爬虫1 小时前
模块化烹饪小程序开发日记 Day2:全局配置与 tabBar 实现
java·前端·javascript·微信小程序·html·notepad++
m0_470857641 小时前
C#怎么实现蓝牙设备搜索_C#如何开发Bluetooth应用【指南】
jvm·数据库·python
victory04311 小时前
找实习也是在找自己
java·服务器·前端
2303_821287382 小时前
在 Go 中声明包级全局 Map 的正确方法
jvm·数据库·python
老纪2 小时前
CSS移动端如何实现平滑滚动效果_设置scroll-behavior smooth属性.txt
jvm·数据库·python