互联网大厂 Java 面试实录:JVM、Spring Boot、MyBatis、Redis、Kafka、Spring AI、K8s 全链路追问小Y
场景:某互联网大厂在面试「智能客服 + 电商订单系统」后端 Java 岗位。
角色:严肃面试官 / 搞笑的水货程序员小Y。
目标:从基础到业务落地,再到云原生和 AI 升级,看看小Y到底是真会还是"会一点点"。
第一轮:先看基础功底
Q1 面试官 :Java 8、11、17,你线上最常用哪版?为什么大厂更喜欢 17?
小Y :我个人最熟 8,11 也没问题。17 是 LTS,语法更现代,像 record、sealed class 这些能少写很多样板代码。
面试官:不错,至少不是"版本越新越危险"的那种人。
Q2 面试官 :一个多模块订单项目,Maven / Gradle 你怎么组织?
小Y :父工程管版本,子模块按领域拆分,比如 order、payment、user、ai-service。公共依赖放 dependencyManagement,插件放 pluginManagement,避免每个模块各写各的。
面试官:这句"避免各写各的"很像干过项目。
Q3 面试官 :Spring Boot 为什么能这么快启动?和传统 Jakarta EE、Struts 比有什么差别?
小Y :Spring Boot 通过 starter 和自动装配把常用配置都预置好了,@SpringBootApplication 本质上是组合注解。传统 Jakarta EE / Struts 更偏手工配置,Boot 适合快速迭代。
面试官:说得还行,继续。
Q4 面试官 :那 Spring MVC 的请求链路你说一下,顺便把 JUnit 5 + Mockito 单测也带上。
小Y :请求先到 DispatcherServlet,再经过 HandlerMapping 找到控制器,HandlerAdapter 执行方法,最后由 ViewResolver 或消息转换器返回结果。单测里我会用 @ExtendWith(MockitoExtension.class)、@Mock、@InjectMocks,配合 AssertJ 验证返回值。
面试官:可以,至少测试不是靠"点点点"。
第二轮:开始问业务落地
故事背景:智能客服 + 电商订单系统。用户下单、支付回调、库存扣减、优惠券发放、消息通知,全都要稳定、可追踪、可回滚。
Q1 面试官 :用户重复点"提交订单",你怎么保证接口幂等?
小Y :可以先给前端一个一次性 token,后端校验后放行,再配合数据库唯一索引和订单状态机;支付回调也要按业务单号去重。
面试官:不错,幂等不是"多试几次总会成功"。
Q2 面试官 :订单明细查询又复杂又频繁,MyBatis、Hibernate、JPA 你怎么选?HikariCP、Flyway 又怎么用?
小Y :复杂联表和动态 SQL 我会优先 MyBatis;简单 CRUD、领域模型清晰的部分可以用 JPA / Hibernate。HikariCP 作为连接池性能好、延迟低;Flyway 或 Liquibase 负责数据库版本升级,避免手工改表。
面试官:这个回答是像在做项目,不像在背词。
Q3 面试官 :商品详情页每天几百万次访问,Redis 怎么防穿透、击穿、雪崩?本地缓存呢?
小Y :缓存模式可以用 Cache-Aside;穿透用布隆过滤器或者缓存空值;击穿用互斥锁或逻辑过期;雪崩就给不同 key 加随机过期时间。热点数据可用 Caffeine / Ehcache 做本地缓存,减少 Redis 压力。
面试官:行,起码你知道不是"Redis 一把梭"。
Q4 面试官 :订单支付成功后,要发优惠券、发短信、更新积分,你会用 Kafka 还是 RabbitMQ?怎么保证消息不丢、不错发?
小Y :如果强调高吞吐和日志式事件流,我会偏 Kafka;如果更强调灵活路由和业务队列,RabbitMQ 也行。可靠性上可以用本地消息表 / Outbox、消息确认、失败重试、死信队列、消费者幂等。最终一致性比"强行一步到位"更现实。
面试官:这句还不错,能看出来你被线上事故教育过。
Q5 面试官 :登录和支付都很敏感,Spring Security、JWT、OAuth2、Keycloak 你怎么配合?
小Y :统一身份认证交给 Keycloak 或自建 OAuth2 服务器签发 Token,前端拿 JWT 访问网关;网关和资源服务通过 Spring Security 校验签名、过期时间和权限范围。细粒度权限可以按角色、租户、scope 控制。
面试官:嗯,至少不是"前端传个用户 id 就行"。
第三轮:上云、上量、上 AI
故事继续:客服系统要接入企业知识库,支持流式问答、工作流审批、监控告警和灰度发布。面试官的语气也开始更像线上事故复盘会。
Q1 面试官 :现在服务拆成多个微服务了,Spring Cloud、Consul、OpenFeign、Resilience4j 你怎么串起来?
小Y :Consul 做注册发现,OpenFeign 负责声明式调用,Resilience4j 做熔断、限流、重试和隔离。老项目里如果还在用 Eureka / Zuul 也能平滑过渡,但新项目更倾向网关 + 统一治理。
面试官:回答开始像"正经微服务"了。
Q2 面试官 :AI 客服要边生成边输出,WebFlux、WebSocket、R2DBC 有什么价值?
小Y :WebFlux 适合高并发、I/O 密集型的流式接口,底层是非阻塞模型;WebSocket 用于前后端实时推送;R2DBC 可以让数据库访问也尽量非阻塞,适合聊天会话和消息流场景。
面试官:这题你答得有点悬,但方向对了。
Q3 面试官 :企业文档问答怎么做,才能尽量少胡说?Spring AI、RAG、向量库、Agentic RAG 你怎么理解?
小Y :先把制度、FAQ、工单、合同等文档加载并切分,再做 Embedding 向量化,存到 Milvus、Chroma 或 Redis 向量库里;用户提问后先做语义检索,把最相关片段召回,再交给大模型回答。为了降低幻觉,要让模型"只基于检索内容作答",必要时再加工具调用、引用来源、重排和人工兜底。Agentic RAG 则是让 Agent 按步骤调用搜索、数据库、工单系统等工具,处理复杂工作流。
面试官:嗯......你说得像懂,但我还想看源码。
Q4 面试官 :最后一个,怎么把整个系统从开发到上线管起来?Docker、Kubernetes、Jenkins、Prometheus、Grafana、Micrometer、ELK、Jaeger / Zipkin 怎么串?
小Y :CI / CD 里 Jenkins 或 GitHub Actions 先跑测试、打包、构建镜像,再推到镜像仓库,Kubernetes 负责部署、滚动更新、健康检查和弹性伸缩。Micrometer 统一暴露指标给 Prometheus,Grafana 做图表,ELK 负责日志检索,Jaeger / Zipkin 看链路追踪;出问题时可以先看指标再看日志,再看 trace。
面试官:这回终于有点"大厂味儿"了。
Q5 面试官 :那如果我要你给这个客服系统做一个大数据分析,Hadoop、Spark、Flink、Cassandra、Elasticsearch 怎么选?
小Y :离线报表和历史分析偏 Hadoop / Spark;实时风控、实时推荐、实时看板偏 Flink;搜索和日志检索常用 Elasticsearch;海量写入和特定时序场景可以考虑 Cassandra。不同技术不是越多越好,关键是按时效性、成本和团队能力来选。
面试官:最后这个还算落地,不全是嘴炮。
面试官总结
面试官合上笔记本,沉默了几秒:
"基础不是完全不行,业务理解也有一点,微服务和 AI 方向你也碰过。只是很多细节还不够扎实,尤其是分布式一致性、RAG 落地、云原生治理这些地方,还是需要继续打磨。今天先到这里,你回去等通知吧。"
小Y点点头,心里想:
"虽然我答得像会一点,但至少今天没有把
HashMap说成HashMap的兄弟姐妹。"
文末详解:给小白的 13 个答案
1)Java 8 / 11 / 17 为什么都有人用?
业务场景 :老系统稳定运行在 Java 8,新系统为了长期维护和性能优化会直接上 17。
技术点:
- Java 8:Lambda、Stream、Optional 很经典,生态兼容最好。
- Java 11:依然是 LTS,适合平滑升级。
- Java 17 :LTS 更现代,
record、sealed class、更好的 GC 和语言特性,让 DTO、领域模型更清晰。
面试思路:不要只说"版本新",要说"稳定性、生态、语法、团队迁移成本"。
2)Maven / Gradle 多模块怎么管理?
业务场景 :电商系统一般会拆成 order、payment、inventory、notify、ai-service 等模块。
技术点:
parent pom/build.gradle统一版本。dependencyManagement/platform统一依赖版本,避免冲突。pluginManagement统一编译、打包、测试插件。- 用 profile 区分 dev / test / prod。
面试思路:能讲出"版本统一"和"模块解耦",比只会说"父子工程"更好。
3)Spring Boot 为什么快?和 Jakarta EE / Struts 有什么差别?
业务场景 :互联网项目最怕慢,需求一天一个变,必须快速起服务、快速发版。
技术点:
- Boot 通过 starter + 自动装配降低配置成本。
@SpringBootApplication=@SpringBootConfiguration+@EnableAutoConfiguration+@ComponentScan。- 传统 Jakarta EE / Struts 偏 XML 或手工配置,学习成本和维护成本更高。
面试思路:回答时要强调"迭代速度"和"约定优于配置"。
4)Spring MVC 请求链路和 JUnit 5 + Mockito 怎么用?
业务场景 :下单接口、查询接口、导出接口都需要统一入口和可测性。
技术点:
- 请求先到
DispatcherServlet。 HandlerMapping找控制器,HandlerAdapter执行,HttpMessageConverter处理 JSON。- 单测推荐:
@ExtendWith(MockitoExtension.class)、@Mock、@InjectMocks、AssertJ。 - 复杂场景可补充 TestNG、PowerMock(老项目)、JUnit Pioneer(增强测试)。
面试思路:说清楚"链路"和"怎么测",面试官才相信你写过代码。
5)接口幂等怎么做?
业务场景 :用户重复点击提交、网络重试、支付回调重复通知,都可能造成重复下单或重复扣款。
技术点:
- 前端一次性 token / nonce。
- 数据库唯一索引(如订单号、支付流水号)。
- 业务状态机控制状态流转。
- Redis 去重、布隆过滤器、幂等日志表。
面试思路:幂等不是"多执行几次没事",而是"结果只发生一次"。
6)MyBatis、JPA、Hibernate、HikariCP、Flyway / Liquibase 怎么选?
业务场景 :订单详情页查询复杂,会员资料更新又比较标准化。
技术点:
- MyBatis:SQL 可控,适合复杂查询、报表、动态 SQL。
- JPA / Hibernate:适合标准 CRUD、领域模型较清晰的业务。
- HikariCP:轻量、高性能、低延迟,互联网项目常用。
- Flyway / Liquibase :管理数据库版本,避免手工改表。
面试思路:不是二选一,而是"按业务选择组合拳"。
7)Redis 缓存怎么防穿透、击穿、雪崩?
业务场景 :商品详情、活动页、首页 banner 都是高并发热点。
技术点:
- Cache-Aside:先查缓存,未命中再查数据库。
- 穿透:布隆过滤器 / 缓存空值。
- 击穿:互斥锁、逻辑过期、热点预热。
- 雪崩:过期时间加随机值、分批失效、多级缓存。
- 本地缓存 :Caffeine / Ehcache,减少远程访问。
面试思路:要结合"热点商品""秒杀活动"这类高并发场景说。
8)Kafka / RabbitMQ / JMS 怎么做消息可靠?
业务场景 :支付成功后要发券、发短信、记积分、同步订单状态。
技术点:
- Kafka:吞吐高,适合事件流、埋点、日志、异步解耦。
- RabbitMQ:路由灵活,适合业务队列、延迟队列、复杂路由。
- JMS / ActiveMQ:偏传统企业系统。
- 可靠性:Producer ack、重试、补偿、本地消息表 / Outbox、消费者幂等、死信队列。
- 顺序性:按业务 key 分区或单线程消费关键流。
面试思路:不要说"发消息就完了",要说"失败了怎么办"。
9)Spring Security、JWT、OAuth2、Keycloak 怎么配合?
业务场景 :企业协同、SaaS、金融后台都需要统一登录、统一权限、统一审计。
技术点:
- Keycloak 可做统一身份认证和 SSO。
- OAuth2 负责授权流程,JWT 用于携带身份和权限信息。
- Spring Security 在网关或资源服务侧做鉴权。
- 权限模型可按角色、租户、scope、菜单、接口粒度细分。
- 需要更强加密或签名时可结合 Bouncy Castle。
面试思路:一定要分清"认证"和"授权"。
10)Spring Cloud、Consul、Feign、Resilience4j 怎么做微服务治理?
业务场景 :下单服务、库存服务、支付服务、客服服务彼此依赖,任何一个慢了都可能拖垮全链路。
技术点:
- Consul / Eureka:服务发现。
- OpenFeign:声明式远程调用。
- Resilience4j:熔断、限流、重试、隔离、舱壁。
- 老系统可能还会见到 Zuul,新系统更多是统一网关 + 服务治理。
- 内部高性能 RPC 也可能用 Dubbo / gRPC / Apache Thrift 。
面试思路:要说清楚"谁负责发现、谁负责调用、谁负责兜底"。
11)WebFlux、WebSocket、R2DBC 适合什么场景?
业务场景 :AI 聊天、实时通知、消息流式输出、客服在线会话。
技术点:
- WebFlux:非阻塞、响应式,适合高并发 I/O 场景。
- WebSocket:服务端主动推送,适合在线聊天和实时状态。
- R2DBC :响应式数据库访问,避免阻塞线程。
面试思路:不是所有项目都要上响应式,只有 I/O 压力大、链路长、实时性强时才值得。
12)Spring AI、RAG、Agent、MCP、A2A 怎么理解?
业务场景 :企业知识库问答、智能客服、工单助手、复杂审批流。
技术点:
- Spring AI:Java 侧接大模型、向量库、Prompt、工具调用的统一入口。
- RAG:先检索,再生成,减少幻觉。
- 文档加载:把 PDF、Word、网页、Wiki、FAQ 切块、清洗、向量化。
- 向量数据库:Milvus / Chroma / Redis 向量检索。
- Embedding 模型:OpenAI / Ollama 等,把文本转成向量。
- Agent:让模型能调用工具,处理复杂工作流。
- MCP:把工具调用标准化,方便模型接外部系统。
- Google A2A:更适合多个 Agent 之间协作。
- 聊天会话内存 :保留上下文,避免每轮都"失忆"。
面试思路:关键不是"会不会聊 AI",而是"能不能把 AI 接到真实业务里"。
13)Docker、Kubernetes、Jenkins、Prometheus、Grafana、ELK、Jaeger 怎么串起来?
业务场景 :项目上生产后,必须能持续交付、快速回滚、实时观测。
技术点:
- Jenkins / GitHub Actions / GitLab CI:拉代码、跑测试、构建镜像、部署。
- Docker:统一运行环境。
- Kubernetes:部署、弹性伸缩、滚动更新、健康检查。
- Micrometer + Prometheus:采集指标。
- Grafana:展示指标和告警面板。
- ELK Stack:日志收集、检索、分析。
- Jaeger / Zipkin:链路追踪,定位慢请求。
- 监控顺序 :先看指标,再看日志,最后看 trace。
面试思路:回答要落到"上线、监控、回滚、定位问题"上。
补充:常见工具库和序列化选择
- Lombok:减少 getter / setter / builder 样板代码。
- MapStruct:DTO、VO、Entity 转换更清晰。
- Apache Commons / Guava:字符串、集合、缓存、并发工具补齐。
- JSch:远程 SSH / 文件传输。
- POI:Excel / Word 报表导出。
- Jackson / Gson / Protobuf / Avro:对外接口常用 JSON(Jackson),内部高性能调用常用 Protobuf / Avro。
如果你把上面 13 个问题都能讲清楚,面试官大概率不会再把你当"小Y",而是会开始认真追问你的项目细节。