大厂 Java 面试实战:Spring Boot 微服务 + Redis 缓存 + Kafka 消息 + Kubernetes + RAG(小Y水货翻车记)
场景设定
- 公司:某互联网大厂(内容社区 + UGC + AIGC 辅助创作)
- 岗位:Java 后端开发(微服务方向)
- 角色 :
- 面试官:严肃、追问细节、喜欢用真实业务场景串题
- 小Y:自称"熟练掌握全栈",简单题能答,复杂题开始"云里雾里"
第一轮(基础到进阶):登录与鉴权(Spring Security + JWT + OAuth2)
Q1:你们登录接口在 Spring Boot 里怎么做?密码怎么存?
面试官:我们先从登录开始。你用 Spring Boot 写一个登录接口,密码如何存储?
小Y :登录嘛,就一个 /login,然后查数据库比对密码......密码一般用 MD5 加盐?
面试官(眉头一皱):MD5?
小Y:那......再加几次 MD5?
面试官:你先别急,我们继续。
Q2:Spring Security + JWT 的链路你讲一下,Token 过期怎么办?
面试官:用 JWT 做无状态鉴权,说一下过滤器链路,Token 过期怎么办?
小Y:JWT 就是前端带着 token,后端解析一下,里面有 userId。过期就让用户重新登录。
面试官:能答个大概。那如果是内容社区,用户长时间在线,频繁让重登体验差,怎么优化?
小Y:那就把过期时间设长一点?
面试官(叹气但仍保持礼貌):好,我们往下。
Q3:OAuth2/Keycloak 在企业协同 SaaS 场景里怎么落地?
面试官:如果我们是企业协同 SaaS,要支持企业 SSO,你怎么做?
小Y:OAuth2 不是微信登录那种吗?我们也可以接一下......Keycloak 我听过,应该就是个登录页面?
面试官:嗯,知道它是身份提供方,但细节需要补。
Q4:你怎么防止接口被刷?涉及风控与安全。
面试官:内容社区会有刷评论、刷点赞。你怎么做接口限流和风控?
小Y:限流用网关限一下?比如 Nginx?然后加验证码......
面试官:思路对,但我们后面会把它和微服务熔断一起串起来。
第二轮(业务链路):UGC 发布与审核(MySQL/JPA/MyBatis + Redis + Kafka)
Q1:UGC 发帖写入数据库,如何设计表与事务?
面试官:用户发一篇帖子:正文、图片、标签、可见性。你怎么设计表?事务怎么保证?
小Y :一张 post 表就行,图片用逗号拼接在字段里。事务就 Spring @Transactional。
面试官:能跑,但不够"可维护"。继续。
Q2:为什么连接池常用 HikariCP?它比 Druid/C3P0 强在哪?
面试官:线上高并发写入,为什么 Spring Boot 默认推荐 HikariCP?
小Y:因为快?我记得它名字就很快......
面试官(微微点头):至少你知道它快,但请你别只靠名字。
Q3:缓存怎么设计?Redis、Caffeine、Spring Cache 怎么搭配?
面试官:帖子详情页是热点:读多写少。你会怎么做多级缓存?如何解决缓存一致性?
小Y:用 Redis 缓存帖子详情。更新就把 Redis 删掉。
面试官:那并发下会出现什么问题?
小Y:呃......删掉就会重新查库......应该没问题?
面试官:会有"缓存击穿/穿透/雪崩",我们第三轮会加上监控。
Q4:发帖后要异步做:内容审核、@通知、搜索索引。Kafka 怎么设计?
面试官:发帖后异步任务很多。你如何用 Kafka 设计消息?如何保证不丢不重?
小Y :发一个 topic,比如 post_event。不丢就多发几次......不重就消费端自己判断。
面试官:你这回答很"朴素"。
第三轮(大厂综合):微服务治理 + 可观测性 + AI RAG 企业知识库
Q1:微服务调用链路:OpenFeign + Resilience4j,你怎么做超时、重试、熔断?
面试官:帖子详情页要聚合:用户信息、关注关系、推荐分。用 Feign 调三个服务,怎么保证稳定?
小Y:加超时,然后重试,熔断就返回默认值。
面试官:好,方向正确。你能说说重试带来的副作用吗?
小Y:副作用......就是会多请求几次?
面试官:行。
Q2:Kubernetes 上发布 Spring Boot:滚动更新怎么避免连接被断?
面试官:我们跑在 K8s,滚动发布时如何优雅下线?
小Y:把副本数加大,然后更新就行?
面试官:你忽略了连接与在途请求。
Q3:可观测性:Micrometer + Prometheus + Grafana + Jaeger,怎么排查接口 P99 飙高?
面试官:线上 P99 延迟上升,你怎么定位是 DB、缓存还是下游服务?
小Y:看日志?ELK 搜一下慢日志?
面试官:日志只是其中一环。
Q4:AI:企业文档问答(RAG + 向量库 Milvus/Redis),你怎么做"减少幻觉"?
面试官:我们做 AIGC 辅助创作,有企业内部规范、敏感词、审核规则。要做企业文档问答。RAG 的流程你讲讲,怎么减少幻觉?
小Y:RAG 就是把文档丢给 AI,然后它就会回答。幻觉的话......让它别瞎说?
面试官(沉默两秒):你回去可以好好补补这一块。
面试官收尾
面试官 :整体来看,你对基础框架有概念,能写业务,但在安全、缓存一致性、消息可靠性、可观测性和 AI RAG 落地细节 上还需要系统化理解。今天先到这里,你回去等通知,有结果 HR 会联系你。
题目答案详解(按轮次逐题讲透:业务场景 + 技术点)
下面把每题"标准思路"补齐,尽量用小白也能跟上的方式。
第一轮详解:登录与鉴权
1-1 登录接口怎么做?密码怎么存?
业务场景:内容社区用户量大,必须防撞库与泄露风险。
正确要点:
- 密码存储:不要 MD5(快且易被彩虹表/暴力破解)。
- 用 BCrypt/SCrypt/Argon2 这类专为密码设计的慢哈希。
- Spring Security 中推荐:
BCryptPasswordEncoder。
示例(Spring Security):
java
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
注册时:encode(rawPassword);登录校验:matches(raw, encoded)。
补充安全点:
- 登录失败次数限制(Redis 计数 + 冷却时间)
- 风控(设备指纹/IP 信誉)
- 防止用户枚举(错误提示统一)
1-2 Spring Security + JWT 链路?Token 过期怎么做体验更好?
链路核心:
- 用户登录成功 -> 服务端签发 JWT(包含
sub/userId、exp、roles等) - 客户端请求带
Authorization: Bearer <token> - 服务端过滤器(OncePerRequestFilter)解析 JWT,校验签名与过期
- 校验通过 -> 构建
Authentication放进SecurityContext
Token 过期优化(常见做法):
- Access Token 短期 + Refresh Token 长期 :
- Access 15min
- Refresh 7~30天(存 Redis/DB,可失效、可踢下线)
- 续签策略:快过期时刷新 Access token
为什么 Refresh Token 不能完全无状态:
- 需要支持注销/封禁/踢下线,就必须能让 Refresh Token 失效(存储可控)。
1-3 OAuth2/Keycloak 如何用于 SaaS SSO?
业务场景:企业协同 SaaS,客户希望"用公司账号登录",统一权限管理。
落地方案:
- Keycloak 作为 Identity Provider(IdP):用户、组织、角色管理
- SaaS 系统作为 OAuth2 Client 或 Resource Server
- 常用模式:
- Web 端:Authorization Code + PKCE
- 服务间:Client Credentials
关键点:
- Keycloak 下发 JWT,你的服务验证签名(JWK)
- 多租户(tenantId/realm)隔离
- RBAC:角色->权限->资源
1-4 防刷:限流与风控怎么做?
业务场景:刷评论、刷赞、接口爬虫。
技术组合:
- 网关限流(Spring Cloud Gateway / Nginx):按 IP、用户、路径
- Redis 滑动窗口/令牌桶:精细化到用户维度
- 验证码/行为验证:风险升高时触发
- 黑名单/灰度策略:异常账号隔离
- 与 Resilience4j RateLimiter 配合:应用内限流
第二轮详解:UGC 发布链路(DB + 缓存 + MQ)
2-1 表怎么设计?事务如何保证?
推荐拆分:
post:主体(id、author_id、status、visibility、created_at)post_content:长文本(可单独表或 ES/对象存储)post_image:多图(1:N)post_tag、tag:多对多
事务:
- 单库写入:
@Transactional保证原子 - 跨服务(比如发帖+积分+审核):用 事件驱动(Outbox/事务消息)避免分布式事务硬扛
2-2 为什么 HikariCP 常用?
结论:HikariCP 更轻量,性能与稳定性在高并发下表现好。
要点:
- 代码路径短、锁竞争少
- 连接获取/归还开销低
- 与 Spring Boot 集成成熟(默认)
对比:C3P0 偏老、性能一般;Druid 功能丰富(监控强)但更重。
2-3 多级缓存怎么做?如何一致性?
业务场景:帖子详情热点、读多写少。
多级缓存:
- 本地缓存:Caffeine(极快,适合热点 key,容量小)
- 分布式缓存:Redis(跨实例共享)
- 配合:Spring Cache 抽象(注解化)
一致性常用策略:
- Cache Aside(旁路缓存) :
- 读:先查缓存,miss 再查 DB 回填
- 写:先写 DB,再删除缓存(或更新缓存)
- 解决并发问题:
- 缓存击穿(热点 key 失效瞬间大量打 DB):互斥锁/逻辑过期/单飞
- 缓存穿透(查不存在的 key):布隆过滤器 / 空值缓存
- 缓存雪崩(大量 key 同时过期):过期时间加随机值、分批失效
推荐组合:
- 热点 key:逻辑过期 + 后台异步刷新
- 非热点:常规 TTL
2-4 Kafka 怎么保证不丢不重?
业务场景:发帖后异步:审核、通知、索引。
不丢(At-least-once):
- Producer:
acks=all、enable.idempotence=true - Broker:合理的 replication factor
- Consumer:手动提交 offset(处理成功后再 commit)
不重(Exactly-once 的工程化做法):
- Kafka EOS 在特定链路可做,但业务上更常见:
- 消费端幂等 :
- 用业务唯一键(postId + eventType)
- DB/Redis 记录"已处理事件"
- 或使用 事务 Outbox :
- 同一事务写业务表 + outbox 表
- CDC/任务把 outbox 投递到 Kafka
- 消费端幂等 :
消息模型建议:
- Topic 按域拆:
post-created、post-updated - Key 用
postId保证同帖事件有序
第三轮详解:微服务治理 + K8s + 可观测性 + RAG
3-1 Feign + Resilience4j:超时、重试、熔断怎么配?
目标:下游慢/挂时,避免"级联故障"。
关键配置:
- 超时:连接超时 + 读超时
- 重试:只对幂等请求(GET)谨慎使用
- 熔断:错误率/慢调用达到阈值打开
- 降级:返回兜底数据(默认头像、空推荐)
重试副作用:
- 放大流量,雪上加霜
- 非幂等请求(POST)会造成重复写
3-2 K8s 滚动更新如何优雅下线?
目标:发布时不丢请求。
要点:
readinessProbe:未就绪不接流量preStop+terminationGracePeriodSeconds:- 收到 SIGTERM 后:停止接新请求、等待在途请求完成
- Spring Boot:
- 开启优雅停机(2.3+):
server.shutdown=graceful spring.lifecycle.timeout-per-shutdown-phase
- 开启优雅停机(2.3+):
3-3 Micrometer/Prometheus/Grafana/Jaeger:如何定位 P99 飙高?
分层定位法:
- 指标(Metrics) :
- QPS、P50/P95/P99、错误率、线程池、GC、连接池
- 日志(Logs) :
- 慢 SQL、异常堆栈、关键业务埋点(traceId)
- 链路追踪(Tracing) :
- Jaeger/Zipkin 看每个 span 耗时:
- DB 查询慢?
- Redis 超时?
- 下游服务慢?
- Jaeger/Zipkin 看每个 span 耗时:
落地建议:
- OpenTelemetry/Brave + Micrometer Tracing
- 统一 traceId 注入日志(ELK 可按 traceId 串起来)
3-4 RAG:企业文档问答怎么做?如何减少幻觉?
业务场景:企业内部规范、敏感词、审核规则,要求"回答必须依据文档"。
RAG 基本流程:
- 文档加载:PDF/Word/网页 -> 分段(chunk)
- 向量化:Embedding 模型把 chunk -> 向量
- 向量库:Milvus/Chroma/Redis Vector 存储与相似度检索
- 检索:问题 -> 向量 -> 找 topK 相关 chunk
- 生成:把检索结果 + 问题 拼接进 Prompt,让 LLM 基于证据回答
减少幻觉的工程手段:
- 强约束 Prompt:要求"只依据引用内容回答,不知道就说不知道"
- 引用与可追溯:输出附带引用段落/文档链接
- 检索质量 :
- 合理 chunk 大小(如 300~800 tokens)
- 混合检索(BM25 + 向量)
- rerank(重排序模型)
- 置信度阈值:相似度低则拒答/转人工
- 安全与权限:多租户隔离、文档 ACL,防止越权检索
与 Spring AI/MCP/Agent 的关系(概念落地):
- Spring AI:封装 ChatModel、Embedding、VectorStore、DocumentLoader
- MCP:把"工具调用"标准化,让 Agent 可调用检索、审批、工单等工具
- Agentic RAG:多步工作流(先检索规范 -> 再生成草稿 -> 再自检/敏感词过滤)
你可以怎么复盘(给小白的学习路径)
- 先把 Spring Security + JWT + Refresh Token 打通
- 做一套 Redis 缓存三件套:击穿/穿透/雪崩
- Kafka 学会:幂等、手动提交、Outbox
- 上线必备:Micrometer 指标 + Trace
- 最后再学:RAG(向量库 + 检索质量 + 幻觉控制)
完