Java 17 + Spring Boot + Kafka + Redis:互联网大厂面试中的水货程序员燕双非闯关记
\n场景设定:互联网大厂 Java 岗位面试,面试官严肃认真,候选人燕双非外号“水货程序员”,嘴上很会,手上有点飘。简单问题能答上来,答好了面试官会点头夸赞并继续追问;复杂问题则开始含糊其辞,试图用术语把自己包装得像个高手。
\n\n
第一轮:基础能力与项目入口
\n面试官:先说说你们项目为什么从 Java 11 升级到 Java 17?
\n燕双非:主要是为了吃上新特性,比如更简洁的语法、record、更好的switch表达式,还有长期支持版本更稳,线上维护成本也更低。我们做的是电商订单系统,升级后代码可读性和工程稳定性都提升了。
面试官:可以,说明你不是只会背版本号。那你说说 Spring Boot 启动时自动配置是怎么工作的?
\n燕双非:嗯……它主要是通过一些自动装配机制,根据类路径下有没有某些依赖,再结合配置文件和条件注解,自动把 bean 装配好。比如我们引入了 Web、Redis、Kafka 之后,它就会帮我们把很多默认组件配置出来。
\n面试官:回答方向对,继续说,为什么大厂项目里很看重自动配置和条件装配?
\n燕双非:因为业务线多,如果每个团队都手写一套基础设施配置,维护会很乱。自动配置能把公共能力标准化,降低接入成本,减少样板代码。
\n面试官:这个理解不错。那你在项目里怎么区分 Controller、Service、Repository 这些层次?
\n燕双非:Controller 负责接收请求和参数校验,Service 处理业务逻辑和事务,Repository 或 Mapper 负责数据访问。比如订单创建时,Controller 只管收参,真正的库存校验、优惠计算、落库都放在 Service 里。
\n\n第二轮:高并发订单与消息链路
\n面试官:现在假设你负责一个秒杀订单场景,为什么要引入 Kafka,而不是直接同步调用库存服务?
\n燕双非:因为同步调用会把链路拉长,容易把下游打挂。Kafka 可以先把请求削峰,订单服务先把消息写进去,后面库存、积分、通知服务异步消费,整体吞吐更高。
\n面试官:不错。那消息重复消费怎么处理?
\n燕双非:这个……一般会做幂等。比如订单号做唯一键,消费端先查一下有没有处理过,或者用数据库唯一索引、Redis 标记、状态机来保证重复消息不会重复落库。
\n面试官:幂等思路是对的。那你们 Redis 在这个链路里怎么用?
\n燕双非:我们会用 Redis 做热点商品库存预扣、用户限流、分布式锁,还有缓存订单详情。比如商品详情页访问量大,就先查缓存,缓存没有再回源数据库。
\n面试官:很好。那缓存失效后会不会有穿透、击穿、雪崩?
\n燕双非:会。穿透就是查不存在的数据,可以用布隆过滤器或者缓存空值;击穿是热点 key 失效,可以加互斥锁或者逻辑过期;雪崩是大量 key 同时过期,可以设置随机过期时间、分批预热、限流降级。
\n面试官:说得挺完整。那你们服务之间怎么做鉴权?
\n燕双非:前台请求我们一般会用 Spring Security + JWT,登录后签发 token,网关和服务端都能验签。内部服务也会配合白名单、签名或者 mTLS,防止非法调用。
\n\n第三轮:微服务治理、可观测性与 AI 场景
\n面试官:如果订单链路里要接入推荐和智能客服,你会怎么设计 AI 能力?
\n燕双非:可以把 AI 能力做成独立服务。客服场景先做文档加载,把 FAQ、售后政策、订单规则做向量化,存到向量数据库里。用户提问后先语义检索,再把检索结果拼进 prompt,让大模型回答。这样比纯生成更稳。
\n面试官:你提到了 RAG,继续说说为什么企业里更适合 Agentic RAG 而不是纯聊天机器人?
\n燕双非:因为企业问题往往不只是“回答”,还要“执行”。比如查订单、改地址、发工单,这些需要工具调用。Agent 可以根据用户意图决定调用哪个工具,先检索知识,再调用订单接口或工单接口,形成复杂工作流。
\n面试官:那怎么避免 AI 幻觉?
\n燕双非:要做检索增强、严格提示词约束、答案引用来源、工具调用结果校验,还要把高风险操作交给规则系统兜底。比如退款这种操作,不能让模型直接拍脑袋决定,必须经过业务规则和权限校验。
\n面试官:最后一个问题,微服务上线后,你会用哪些指标和链路工具看问题?
\n燕双非:会看 Prometheus + Grafana 的 QPS、延迟、错误率,再结合 Micrometer 打业务埋点。链路追踪上用 Jaeger 或 Zipkin 看订单从网关到库存、支付、通知的耗时分布,日志则配合 SLF4J + Logback 或 Log4j2,必要时接 ELK 做检索分析。
\n面试官:整体回答还行,既有基础也有场景。那今天先到这儿,你回去等通知吧。
\n\n
面试题详细解析
\n1. 为什么从 Java 11 升级到 Java 17
\n在大厂项目中,JDK 升级通常不是为了“追新”,而是为了稳定性、长期支持和语言能力提升。Java 17 是 LTS 版本,适合生产环境长期运行。升级后可以使用record简化 DTO 建模,用更现代的switch表达式提升可读性,同时受益于 JVM 的性能优化。
业务上,像订单、用户、商品等领域对象经常只承载数据,record能减少大量样板代码。对于高并发系统,JVM 和 GC 的改进也有助于降低停顿时间,提升系统稳定性。
2. Spring Boot 自动配置的意义
\nSpring Boot 的自动配置本质上是“