大厂Java面试实录:Spring Boot + JVM + Redis/Kafka + 微服务治理 + Spring AI/RAG 一条龙
大厂Java面试实录Spring Boot JVM Redis/Kafka 微服务治理 Spring AI/RAG 一条龙场景某互联网大厂【电商内容社区 UGC AIGC 智能客服】团队面试。角色面试官严肃、节奏快喜欢追问落地细节。小Y水货但嘴硬简单题能答出来复杂题开始“嗯…大概…应该…”。第一轮基础到中阶单体服务扛得住吗业务背景电商APP首页有“内容社区/UGC种草”信息流后端是 Spring Boot 单体起步。大促时 QPS 暴涨出现接口超时、CPU飙高。Q1JVM 里对象创建很频繁为什么会导致 GC 抖动你会怎么排查面试官大促期间你们信息流接口GET /feed超时CPU 90%你怀疑是 GC。说说对象创建频繁为什么会导致 GC 抖动如何排查小YGC 抖动嘛…就是一直 GC。对象太多就会…回收不过来。排查的话我一般jps看一下然后jstat看一眼……面试官jstat只是开始。你至少得讲出Young GC 频率、晋升失败、Old GC、停顿时间以及如何用堆转储定位热点对象。小Y嗯对对对…可以 dump 一下…然后用 MAT 分析……面试官还行方向对。继续。Q2Java 并发下为什么用线程池而不是每次 new Thread线程池参数如何按接口类型设置面试官信息流接口做了并行聚合商品、库存、推荐、广告。你用线程池还是new Thread线程池参数怎么拍小Y肯定线程池啊不然线程太多。参数嘛…核心线程数就 CPU 核数最大线程数再大一点。队列随便用个 LinkedBlockingQueue。面试官随便那你就等着 OOM。你得区分 IO 密集 vs CPU 密集还要说明拒绝策略、队列长度、线程命名、可观测性。小Y嗯…是是是…我回去再细化一下。Q3Spring Boot 中 HikariCP 为什么快连接池你会怎么避免连接泄漏面试官你们用 MySQL连接池从 C3P0 换到 HikariCP说说为什么快怎么防止连接泄漏小YHikariCP 就是轻量…快。泄漏的话…用完 close面试官回答太“水”。不过你至少知道 close。再补点超时、检测、监控指标。小Y嗯…可以设置leakDetectionThreshold面试官这句终于像干过活的。Q4Redis 做缓存如何解决缓存穿透、击穿、雪崩并结合“UGC内容详情”场景说一下。面试官UGC内容详情GET /note/{id}热点内容被刷爆。缓存三大问题怎么解小Y穿透就…布隆过滤器击穿就加锁。雪崩就加随机过期。面试官不错这题答得干净。可以继续深入了。第二轮进阶微服务化后怎么不翻车业务背景单体拆成微服务内容服务、推荐服务、订单服务、用户服务。开始上 Spring Cloud/OpenFeign消息用 Kafka。大促时出现调用链很长、超时叠加、偶发雪崩。Q1OpenFeign 调用为什么会“越调越慢”你怎么做超时与重试的治理面试官内容服务调推荐服务偶发 RT 3s 变 10s。Feign 为什么越调越慢治理怎么做小Y可能网络慢…或者对方慢…我们把超时调大点面试官调大点是等死。要讲超时分层、重试幂等、隔离与熔断。小Y嗯…可以用 Resilience4j 熔断限流面试官终于提到关键组件了。Q2Kafka 在“订单创建事件”场景如何保证不丢消息、不重复消费面试官下单成功后发OrderCreated事件给推荐和营销。Kafka 怎么做到不丢不重复小Y不丢就…acks-1不重复…消费者自己去重面试官能说出来 acks 还行。去重怎么做小Y用数据库唯一键或者 Redis set大概是这样。面试官OK算及格。Q3链路追踪怎么落地Micrometer Prometheus Grafana Jaeger/Zipkin 你会怎么选面试官大促你怎么快速定位“慢在哪里”讲讲指标、日志、链路三件套。小Y日志用 ELK指标用 Prometheus链路用 Jaeger面试官选型没问题。关键是你怎么把 traceId 串起来怎么把慢 SQL、线程池队列长度都指标化。小Y嗯…用 MDC然后埋点…Micrometer面试官可以再往下。Q4Kubernetes 上灰度发布怎么做CI/CD 用 Jenkins/GitLab CI 你怎么设计流水线面试官你们上了 K8s。新版本推荐服务想灰度怎么做流水线怎么配小YJenkins 打包 Docker 镜像推镜像仓库然后 kubectl apply。灰度…可以搞两个 deployment面试官太粗糙。至少得讲 RollingUpdate、金丝雀、流量分配、回滚与健康检查。小Y嗯…回滚就是把镜像 tag 改回去……面试官回去好好补补。第三轮高阶加分AIGC 智能客服怎么接入又不“胡说八道”业务背景你们要做【电商智能客服 企业知识库问答】。需求用户问“怎么退货/发票/物流异常”模型回答要基于企业文档不能瞎编Hallucination要支持复杂流程查订单、查物流、创建工单Q1用 Spring AI 做 RAG你的链路设计是什么需要哪些组件面试官RAG 说说链路别背概念。给我一条从“用户提问”到“答案返回”的工程流程。小Y就是…先把问题丢给大模型然后它会回答…RAG 就是再查一下资料面试官你这叫“祈祷式AI”。你要讲文档加载、切分、向量化、向量库检索、提示填充、引用来源。小Y嗯…向量库可以用 Milvus 或者 RedisEmbedding 用 OpenAI 或 Ollama面试官这句可以加分。Q2怎么降低 AI 幻觉以及如何让答案“可追溯可解释”面试官客服最怕胡说。你怎么降低幻觉怎么让答案可解释小Y在 prompt 里让它不要胡说面试官不够。还要检索约束、引用片段、置信度阈值、拒答策略、敏感词与合规。小Y拒答…就是让它回答“我不知道”面试官以及转人工。Q3Agent智能代理在“查订单改地址触发退款”这种复杂工作流怎么做工具执行框架如何设计面试官用户说“把昨天订单的收货地址改成公司并把发票抬头改成xx”。你如何用 Agent 调用内部服务小YAgent 就是…它自己会调用我们给它一些接口就行。面试官接口怎么标准化参数怎么校验怎么做权限怎么防止它乱调小Y呃…加鉴权JWT面试官你开始飘了。说点工程化工具注册、schema、审批、沙箱、幂等。小Y嗯…我知道 MCP 是模型上下文协议…可以用来做工具调用标准化面试官行至少没完全跟不上。Q4聊天会话内存怎么做短期记忆、长期记忆分别放哪面试官客服是多轮对话。会话内存怎么设计小Y存在 Redis面试官Redis 适合短期。长期呢小Y存数据库或者向量库面试官可以。关键是隐私、过期、召回策略。面试收尾面试官整体看你基础题还行缓存那块答得不错。但微服务治理、K8s 发布、以及 AI 工程化你还需要系统补一补。面试官今天先到这回去等通知。有结果我们 HR 会联系你。小Y好的好的谢谢老师小声回去我就把 Resilience4j 和 Spring AI 速成一遍…面试题答案详解按业务场景讲清楚目标让小白能把每个点落到“为什么怎么做怎么验证”。第一轮详解单体服务性能与稳定性1对象创建频繁为何导致 GC 抖动如何排查现象接口 RT 抖动、吞吐下降、CPU 升高GC 日志显示频繁 Young GC甚至 Full GC。原因链路请求高峰产生大量短生命周期对象DTO、临时集合、字符串拼接、Jackson反序列化中间对象。Eden 很快被填满 →频繁 Minor GC。如果对象“活过一次 GC”比如被缓存、被线程池任务引用、或存活时间略长会进入 Survivor/Old。Old 区增长过快或发生晋升失败/碎片化→ 触发 Full GC停顿更长。排查步骤Java 8/11/17通用思路先证据开启/收集 GC 日志Java 11-Xlog:gc*Java 8-XX:PrintGCDetails等。运行态观察jstat -gcutil pid 1s 20看 YGC/FGC 次数与耗时。jcmd pid VM.native_memory summary11看本地内存。堆转储jcmd pid GC.heap_dump /path/heap.hprof。MAT/YourKit 分析找 Top Dominators是否存在大集合、缓存不当、重复字符串、巨型 byte[]。代码层优化减少临时对象复用对象/缓冲区注意线程安全。避免无意义的new ArrayList()/String 使用 StringBuilder。Jackson 反序列化优化字段裁剪、避免深层嵌套。验证对比 GC 次数、P99 RT、吞吐QPS、CPU 使用率。2为什么用线程池参数如何设置为什么不用new Thread线程创建/销毁成本高。无上限会导致线程爆炸 → 上下文切换过多 → 吞吐下降甚至 OOMunable to create new native thread。线程池参数按任务类型估算CPU 密集计算、压缩、加密线程数≈CPU核数或核数1。IO 密集HTTP/RPC/DB线程数可大于核数粗略Nthreads ≈ Ncpu * (1 Wait/Compute)。队列与拒绝策略LinkedBlockingQueue默认可“无限长”→ 高峰堆积任务导致内存膨胀危险。建议明确队列长度如 1000/5000用ArrayBlockingQueue。拒绝策略CallerRunsPolicy降速保护系统常用。AbortPolicy快速失败需要上层兜底。工程化建议线程命名便于排查ThreadFactory。指标化活跃线程数、队列长度、拒绝次数Micrometer。3HikariCP 为什么快如何防止连接泄漏快的原因核心点设计极简减少锁竞争高性能的连接管理。更少的内部对象与逻辑路径延迟更低。防泄漏措施确保try-with-resources正确关闭Connection/Statement/ResultSet。Hikari 参数leakDetectionThreshold超过阈值未归还连接会打印堆栈。maxLifetime、idleTimeout、connectionTimeout防止僵尸连接。监控连接池使用率、等待时间Micrometer 自带 binder。4Redis 缓存穿透/击穿/雪崩UGC详情以GET /note/{id}为例穿透大量请求不存在的 id布隆过滤器Bloom Filter拦截。对空值缓存短 TTL防止重复打 DB。击穿某热点 key 过期瞬间互斥锁Redis setnx或 singleflight只有一个请求回源。逻辑过期缓存值带过期时间后台异步刷新。雪崩大量 key 同时过期TTL 加随机抖动。分批预热、热点隔离、限流降级。第二轮详解微服务治理、消息与可观测性1Feign 为什么越调越慢如何治理超时/重试常见根因下游变慢导致上游线程池/连接池耗尽级联放大。不合理重试在已慢的情况下重试叠加雪上加霜。超时配置不分层连接超时、读超时、整体超时混乱。治理套路超时设置合理 connect/read timeout并在网关/调用方设全局 deadline。重试只对幂等接口GET/可安全重放的请求重试限制次数并加退避。隔离线程池隔离/舱壁Resilience4j Bulkhead。熔断/限流Resilience4j CircuitBreaker RateLimiter。降级返回兜底数据或“稍后重试”保护核心链路。2Kafka 如何保证不丢与去重不丢生产端acksall等 ISR 确认 合理retries。开启幂等生产者enable.idempotencetrue减少重复。不丢消费端手动提交 offset处理成功再 commit。失败重试进入重试队列/死信队列业务层设计。不重复业务语义Kafka 只能做到“至少一次/至多一次/接近恰好一次”业务通常要幂等消费数据库唯一键orderId eventTypeRedis 去重 key带 TTL3指标日志链路怎么落地指标PrometheusGrafanaHTTP 请求 QPS、P95/P99、错误率线程池 active/queue/rejectHikari 连接池 active/pending日志ELKJSON 日志结构化关键字段traceId、userId、orderId使用 SLF4J Logback/Log4j2MDC 注入 traceId链路Jaeger/Zipkin OpenTelemetry统一 traceId 贯穿网关→服务→DB→MQ关键 spanFeign 调用、SQL、Kafka produce/consume4K8s 灰度发布与 CI/CD灰度/发布策略RollingUpdate逐步替换 pod配 readiness/liveness。金丝雀Canary两套版本并存按流量比例或按用户标签导流配合网关/Service Mesh。回滚保留历史 ReplicaSet/镜像 tag失败自动回滚。流水线Jenkins/GitLab CI单测JUnit5 Mockito构建Maven/Gradle安全扫描/制品归档Docker build push部署到测试环境Helm/Kustomize自动化回归/冒烟灰度到生产 监控验收第三轮详解Spring AI / RAG / Agent 工程化1Spring AI 做 RAG 的工程链路离线知识入库文档加载PDF/HTML/Confluence/数据库Document Loaders文本切分chunking带重叠向量化EmbeddingOpenAI/Ollama写入向量数据库Milvus/Chroma/Redis Vector在线问答用户问题 → embedding向量库相似度检索 topK语义检索将检索片段 业务约束不确定就拒答做提示填充调用大模型生成回答带引用来源返回答案 引用文档/片段 id可追溯2降低幻觉与可追溯检索约束只允许基于检索内容回答未检索到足够证据则拒答。引用输出要求模型输出sources[]文档ID/段落。阈值策略相似度低于阈值 → “转人工/创建工单”。提示模板明确格式、禁止编造。合规敏感信息脱敏、权限校验不同用户可见知识不同。3Agent 工作流与工具执行框架核心思想模型负责“决定调用哪个工具”系统负责“安全地执行工具”。工程要点工具注册每个工具有名称、描述、入参 schema、出参 schema。标准化调用可借鉴 MCP/Function Calling 思路让调用可解析可验证。权限与审计JWT/OAuth2 校验用户身份记录每次工具调用。幂等退款/改地址必须有幂等 key防止重复执行。沙箱与护栏限制可调用工具集合、调用次数、参数范围高风险操作需二次确认。4会话内存短期 vs 长期短期记忆本次会话上下文、最近N轮对话Redis/内存缓存带 TTL长期记忆用户偏好、历史工单摘要、可检索的历史对话结构化数据MySQL/PostgreSQL语义召回向量库对摘要做 embedding注意隐私合规、过期策略、可删除Right to be forgotten。