大厂Java面试实录:Spring Boot/Cloud、Redis+Kafka、JVM调优与RAG/Agent(Spring AI)三轮递进问答 大厂Java面试实录Spring Boot/Cloud、RedisKafka、JVM调优、RAG/AgentSpring AI三轮递进拷打角色面试官M语气严肃追问很细。候选人小YY会一点但不多简单题能对答难题开始“玄学输出”。面试场景设定你应聘的是某互联网大厂电商内容社区UGC业务线近期在做AIGC 智能客服知识库问答 工单流转。技术栈以Java/Spring 生态为主服务Spring Boot Spring Cloud OpenFeign Resilience4j数据MySQLJPA/MyBatis Redis Elasticsearch消息Kafka可观测Micrometer Prometheus/Grafana ELK JaegerAISpring AI RAG 向量库Milvus/Redis Agent 工具调用MCP/函数调用风格第一轮基础到上手做一个“订单查询客服入口”服务Q1Spring Boot 基础M你用 Spring Boot 起一个“订单查询”接口怎么做版本管理、依赖管理Maven 里常见的依赖冲突怎么排Y就…spring-boot-starter-web然后写个RestController。依赖冲突的话我一般mvn clean install不行就删.m2目录重来。M沉默两秒…你至少说出了一个“终极大法”。那你知道dependency:tree吗Y知道知道树嘛能看到树。M行先过。Q2JVM/JDK 基础M线上用 Java 8/11/17你能说说它们在 GC 或运行时方面的差异吗YJava 17…更快Java 11…也更快反正越新越好。M表情依旧严肃“越新越好”不算答案。那你至少说说你熟悉的 GCCMS、G1YG1 就是把内存切成很多块然后…按块回收。M这句还算对。继续。Q3数据库连接池与事务M订单查询走 MySQL你用 HikariCP。为什么生产上推荐 HikariCP怎么设置连接池参数YHikari…快。参数就默认吧一般不会出问题。M终于给了点引导默认不一定安全。比如你订单库有慢查询会把连接占住你的池子会被打满。那你知道maximumPoolSize、connectionTimeout这些怎么结合 QPS 算吗Y我一般先配个 200顶不住再加。M点头但不夸至少你知道会“顶不住”。Q4缓存Redis Spring CacheM订单查询要加缓存你会怎么用 Redis怎么避免缓存穿透、击穿、雪崩YRedis 就get/set。穿透就…加缓存击穿就…加锁雪崩就…多加几台 Redis。M第一次夸思路方向对了穿透/击穿/雪崩是三件事。等下我会细问锁怎么加。第二轮进阶到分布式UGC 订单事件流Q1Kafka异步解耦与一致性M下单后要发“订单已创建”事件UGC 社区要展示“我买过这件商品”徽章。你为什么用 Kafka如何保证“订单落库”和“发消息”不丢YKafka 吞吐高。保证不丢就…多发几次或者失败重试。M你说的是“可能重复”但不等于不丢。那你知道 Outbox 模式或事务消息吗Y听过…Outbox 就是…有个 box。M语气仍严肃行至少听过。Q2Spring CloudOpenFeign Resilience4jM订单服务要调库存服务用 OpenFeign。库存服务偶发超时你怎么做超时、重试、熔断、限流YFeign 可以配超时。重试我觉得可以一直重试直到成功。熔断的话…把服务重启。M轻轻叹气一直重试会把下游打死。熔断不是重启。你应该提到 Resilience4j 的 CircuitBreaker/Retry/RateLimiter/Bulkhead。Y对对对就是那个…四件套。Q3分布式追踪与可观测M线上说“下单很慢”你怎么用 Micrometer Prometheus/Grafana ELK Jaeger 排查Y看日志看 Grafana。如果不行就加日志。M终于给了鼓励“加日志”是很多人最后的救命稻草。但大厂更希望你先用指标定位再用 trace 找具体链路最后用日志看细节。Q4数据库索引与分页M订单列表分页查询表很大。你用 MyBatis 或 JPA 都行。怎么做高性能分页Y用limit offset。offset 大了就…加机器。M严肃offset 大了会扫很多行。你应该考虑“基于游标/主键的翻页”seek method和合适的联合索引。Y嗯…游标我在 IDE 里用过。M不是那个游标。第三轮高阶到AI落地AIGC 智能客服RAG Agent 工具调用Q1RAG检索增强生成M智能客服要回答“我这单什么时候发货”大模型不能瞎编。你怎么用 RAG 降低 HallucinationY我让模型“不要瞎编”。提示词写严一点。M冷静提示词只能缓解。你得把“事实”检索出来喂给模型并且让它引用来源。Q2向量化与向量库M企业知识库退换货政策、物流规则、活动规则怎么入库Embedding 模型怎么选向量库选 Milvus/Chroma/Redis 有什么考虑YEmbedding 就…把文字变成数字。向量库我觉得 Redis 最好因为我熟。M熟是优势但要讲清楚规模、召回、延迟、运维成本、过滤能力。Q3Agent工具执行框架与MCP/函数调用M客服不仅要回答还要能“查订单状态、发起退款、创建工单”。你怎么做 Agent 工具调用怎么保证安全与审计Y我给模型一个接口文档它就会调。M严肃追问模型不会“天然守规矩”。你得做工具白名单、参数校验、权限控制OAuth2/JWT/Spring Security、以及完整审计日志。Y对对对我们可以在网关里拦一下。Q4会话内存与多轮对话M用户说“我上次那单怎么还没到”又说“不是这单是上上单”。你怎么做聊天会话内存怎么避免把别人的信息串了Y用一个全局 Map 存起来key 用用户昵称。M终于露出一丝无奈昵称会重复。你需要 userIdsessionId过期策略必要时落 Redis并对敏感信息做脱敏与访问控制。面试收尾M今天先到这里。你基础还行但复杂系统设计和 AI 落地细节需要补强。回去等通知吧我们 HR 这两天联系你。Y好的好的我回去就把…那个 box…补上。题目答案与小白可落地笔记按三轮整理目标把面试问题变成“能在真实业务里写出来/配出来/排查出来”的知识点。第一轮答案订单查询服务Spring Boot MySQL RedisA1 Maven 依赖管理与冲突排查业务点大厂项目模块多、依赖多冲突是常态如 Jackson/Netty/Guava 版本打架。做法使用Spring Boot Parent/BOM统一依赖版本spring-boot-starter-parent或dependencyManagement引入spring-boot-dependencies排查冲突mvn -q dependency:tree -DincludesgroupId:artifactId看是否出现多个版本nearest-wins解决在dependencyManagement锁版本对不需要的传递依赖用exclusionsA2 Java 8/11/17 与GC要点面试常考业务点版本升级通常为了更好吞吐、更低停顿、更强观测能力。要点速记Java 8默认 Parallel GCServer 模式下常用 CMS/G1 需手动CMS 已逐步淘汰。Java 11LTSG1 更成熟JFR、容器支持更完善。Java 17LTSG1 进一步增强ZGC/ Shenandoah 在部分发行版可用整体运行时优化更多。G1 核心思想Region 化内存 预测停顿时间适合大堆、低停顿诉求。排查工具链jcmd/jstack/jmap/jstatGC 日志-Xlog:gc*11A3 HikariCP 为什么常用 参数如何估算业务点高并发下连接池“过大”会压垮 DB“过小”会把应用线程卡死。为什么 HikariCP性能好、实现简洁、延迟低对连接泄漏检测leakDetectionThreshold等支持较好关键参数maximumPoolSize连接池最大连接数minimumIdle最小空闲连接connectionTimeout取连接超时避免线程无限等idleTimeout/maxLifetime连接存活与回收需小于 MySQL wait_timeout粗略估算思路需要连接数 ≈ QPS × 平均SQL耗时(秒) × 安全系数例2000 QPS平均 SQL 10ms2000×0.0120乘 2~3 的安全系数 → 40~60A4 Redis 缓存三大问题与解法业务点订单查询是典型读多写少适合缓存但要扛恶意流量与热点。缓存穿透查不存在的订单号参数校验 布隆过滤器Bloom Filter对“确实不存在”写入空值缓存短 TTL缓存击穿热点 key 过期瞬间互斥锁/单飞singleflight只有一个线程回源逻辑过期value 带过期时间后台异步刷新缓存雪崩大量 key 同时过期/Redis 故障TTL 加随机抖动多级缓存Caffeine 本地 RedisRedis 高可用哨兵/集群 降级策略第二轮答案事件驱动 微服务治理 可观测B1 Kafka 为什么用 “落库发消息不丢”的实现业务点下单完成后要驱动多个下游积分、库存、UGC 徽章、风控同步调用会把链路拉长。Kafka 价值异步解耦、削峰填谷、吞吐高、可回放按 offset不丢消息的经典方案Outbox事务外盒订单服务本地事务写订单表写 outbox 表事件内容、状态后台任务/CDCDebezium读取 outbox投递 KafkaKafka 投递成功后标记 outbox 已发送消费端幂等消费消息带eventId落库去重唯一索引处理失败重试 死信队列DLQB2 OpenFeign Resilience4j 的正确姿势业务点下游偶发超时是常态要“可控失败”。建议组合超时连接超时 读超时别太大重试只对幂等请求重试如 GET 查询库存并设置退避backoff熔断CircuitBreaker失败率阈值、半开探测隔离Bulkhead线程池/信号量隔离防止被拖死限流RateLimiter保护下游与自身降级Fallback返回兜底、提示稍后再试B3 可观测三件套指标、链路、日志业务点“慢”可能来自 DB、下游、GC、网络、锁竞争。排查路径MetricsPrometheus/Grafana MicrometerQPS、P95/P99 延迟、错误率JVM堆、GC 暂停时间、线程数连接池活跃连接、等待时间TracingJaeger/Zipkin还原一次请求的调用链找哪个 span 最慢LoggingELK结合 traceId 检索日志对关键路径打结构化日志JSONB4 大表分页别用深 offset业务点订单列表越翻越慢是必现问题。问题limit offsetoffset 很大时MySQL 仍需扫描大量行再丢弃。解法Seek/游标分页以上一次最后一条记录的(create_time, id)作为游标where (create_time,id) (?,?) order by create_time desc, id desc limit 20配合联合索引(user_id, create_time, id)第三轮答案AIGC 智能客服RAG Agent 安全C1 RAG 如何降低幻觉Hallucination业务点“物流状态、退款规则”必须以真实系统/文档为准。RAG 基本流程用户问题 → 重写/归一化可选向量检索召回相关文档片段TopK将片段作为上下文context喂给 LLM生成回答并引用证据source必要时输出“不确定/需人工”关键策略让模型只基于 context 作答指令约束设定置信度阈值召回不足则转人工输出带引用文档名/段落ID/链接C2 知识库入库Embedding 与向量库选型入库流程文档加载PDF/HTML/Markdown/数据库清洗与切分chunking按段落/标题控制 tokenEmbedding 向量化OpenAI/Ollama 等写入向量库向量 metadata如业务线、版本、生效日期选型考虑Redis 向量检索运维简单、适合中小规模与低延迟场景但在超大规模与复杂检索能力上可能不如专用向量库。Milvus更偏大规模向量检索、索引类型丰富、适合企业级。Chroma更轻量适合原型/中小项目。必须做的工程化metadata 过滤如只查“当前生效版本”增量更新Flyway/Liquibase 管理规则版本或给文档加版本号C3 Agent 工具调用别让模型“想调就调”业务点客服要能执行动作查订单、发起退款、建工单属于高风险操作。推荐架构LLM 只负责“计划/意图识别”工具调用由工具执行框架托管Spring AI function calling / 自研 tool registry工具以白名单注册getOrderStatus(orderId)createTicket(userId, category, content)applyRefund(orderId, reason)安全与审计身份认证JWT/OAuth2Spring Security授权用户只能查自己的订单ABAC/RBAC参数校验Bean Validation 业务校验订单是否属于该用户审计日志记录 toolName、参数、调用人、结果、traceId敏感信息脱敏手机号/地址MCP模型上下文协议类思想落地将“工具描述、参数 schema、返回结构”标准化让工具可扩展、可插拔、可测试C4 会话内存隔离、过期、可追溯业务点多轮对话要“记得住”但不能串用户、不能泄露隐私。实现建议会话 keyuserId sessionId不要用昵称存储短期内存 Redis带 TTL必要时落库记忆分层短期本轮关键信息订单号、意图长期用户偏好需用户授权合规敏感信息加密/脱敏权限校验贯穿工具调用你可以怎么“补强小Y”把Outbox 幂等消费写成一套 demo用 Resilience4j 给 Feign 做一套“超时熔断降级”给订单接口接上 Micrometer 指标 traceId 日志用 Spring AI 做一个最小 RAG文档切分 → 向量库 → 检索 → 引用回答全文完