大厂 Java 面试实战:Spring Boot 微服务 + Redis 缓存 + Kafka 消息 + Kubernetes + RAG(小Y水货翻车记)

大厂 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 登录接口怎么做?密码怎么存?

业务场景:内容社区用户量大,必须防撞库与泄露风险。

正确要点

  1. 密码存储:不要 MD5(快且易被彩虹表/暴力破解)。
  2. BCrypt/SCrypt/Argon2 这类专为密码设计的慢哈希。
  3. 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 过期怎么做体验更好?

链路核心

  1. 用户登录成功 -> 服务端签发 JWT(包含 sub/userIdexproles 等)
  2. 客户端请求带 Authorization: Bearer <token>
  3. 服务端过滤器(OncePerRequestFilter)解析 JWT,校验签名与过期
  4. 校验通过 -> 构建 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 ClientResource 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_tagtag:多对多

事务

  • 单库写入:@Transactional 保证原子
  • 跨服务(比如发帖+积分+审核):用 事件驱动(Outbox/事务消息)避免分布式事务硬扛

2-2 为什么 HikariCP 常用?

结论:HikariCP 更轻量,性能与稳定性在高并发下表现好。

要点

  • 代码路径短、锁竞争少
  • 连接获取/归还开销低
  • 与 Spring Boot 集成成熟(默认)

对比:C3P0 偏老、性能一般;Druid 功能丰富(监控强)但更重。


2-3 多级缓存怎么做?如何一致性?

业务场景:帖子详情热点、读多写少。

多级缓存

  • 本地缓存:Caffeine(极快,适合热点 key,容量小)
  • 分布式缓存:Redis(跨实例共享)
  • 配合:Spring Cache 抽象(注解化)

一致性常用策略

  1. Cache Aside(旁路缓存)
    • 读:先查缓存,miss 再查 DB 回填
    • 写:先写 DB,再删除缓存(或更新缓存)
  2. 解决并发问题:
    • 缓存击穿(热点 key 失效瞬间大量打 DB):互斥锁/逻辑过期/单飞
    • 缓存穿透(查不存在的 key):布隆过滤器 / 空值缓存
    • 缓存雪崩(大量 key 同时过期):过期时间加随机值、分批失效

推荐组合

  • 热点 key:逻辑过期 + 后台异步刷新
  • 非热点:常规 TTL

2-4 Kafka 怎么保证不丢不重?

业务场景:发帖后异步:审核、通知、索引。

不丢(At-least-once)

  • Producer:acks=allenable.idempotence=true
  • Broker:合理的 replication factor
  • Consumer:手动提交 offset(处理成功后再 commit)

不重(Exactly-once 的工程化做法)

  • Kafka EOS 在特定链路可做,但业务上更常见:
    • 消费端幂等
      • 用业务唯一键(postId + eventType)
      • DB/Redis 记录"已处理事件"
    • 或使用 事务 Outbox
      • 同一事务写业务表 + outbox 表
      • CDC/任务把 outbox 投递到 Kafka

消息模型建议

  • Topic 按域拆:post-createdpost-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

3-3 Micrometer/Prometheus/Grafana/Jaeger:如何定位 P99 飙高?

分层定位法

  1. 指标(Metrics)
    • QPS、P50/P95/P99、错误率、线程池、GC、连接池
  2. 日志(Logs)
    • 慢 SQL、异常堆栈、关键业务埋点(traceId)
  3. 链路追踪(Tracing)
    • Jaeger/Zipkin 看每个 span 耗时:
      • DB 查询慢?
      • Redis 超时?
      • 下游服务慢?

落地建议

  • OpenTelemetry/Brave + Micrometer Tracing
  • 统一 traceId 注入日志(ELK 可按 traceId 串起来)

3-4 RAG:企业文档问答怎么做?如何减少幻觉?

业务场景:企业内部规范、敏感词、审核规则,要求"回答必须依据文档"。

RAG 基本流程

  1. 文档加载:PDF/Word/网页 -> 分段(chunk)
  2. 向量化:Embedding 模型把 chunk -> 向量
  3. 向量库:Milvus/Chroma/Redis Vector 存储与相似度检索
  4. 检索:问题 -> 向量 -> 找 topK 相关 chunk
  5. 生成:把检索结果 + 问题 拼接进 Prompt,让 LLM 基于证据回答

减少幻觉的工程手段

  • 强约束 Prompt:要求"只依据引用内容回答,不知道就说不知道"
  • 引用与可追溯:输出附带引用段落/文档链接
  • 检索质量
    • 合理 chunk 大小(如 300~800 tokens)
    • 混合检索(BM25 + 向量)
    • rerank(重排序模型)
  • 置信度阈值:相似度低则拒答/转人工
  • 安全与权限:多租户隔离、文档 ACL,防止越权检索

与 Spring AI/MCP/Agent 的关系(概念落地)

  • Spring AI:封装 ChatModel、Embedding、VectorStore、DocumentLoader
  • MCP:把"工具调用"标准化,让 Agent 可调用检索、审批、工单等工具
  • Agentic RAG:多步工作流(先检索规范 -> 再生成草稿 -> 再自检/敏感词过滤)

你可以怎么复盘(给小白的学习路径)

  1. 先把 Spring Security + JWT + Refresh Token 打通
  2. 做一套 Redis 缓存三件套:击穿/穿透/雪崩
  3. Kafka 学会:幂等、手动提交、Outbox
  4. 上线必备:Micrometer 指标 + Trace
  5. 最后再学:RAG(向量库 + 检索质量 + 幻觉控制)

相关推荐
白露与泡影2 小时前
从零学习Kafka:ZooKeeper vs KRaft
学习·zookeeper·kafka
朱一头zcy2 小时前
设计模式入门:简单认识单例模式、模板方法、工厂模式、装饰模式、动态代理
java·设计模式
tmacfrank2 小时前
Kotlin 协程十一 —— 协作、互斥锁与共享变量
java·开发语言·kotlin
笨手笨脚の2 小时前
云原生部署常见服务
redis·docker·云原生·kubernetes·redis-cluster
小江的记录本2 小时前
【分布式】分布式核心组件——分布式限流:固定窗口、滑动窗口、漏桶、令牌桶算法,网关层/服务层限流实现
java·分布式·后端·python·算法·安全·面试
Hanson,2 小时前
SpringBoot前后端分离框架中,在请求头加入签名
java·spring boot·后端
不懂的浪漫2 小时前
一次设备映射缓存设计:用多索引 Map 把高频查询从遍历变成直接命中
java·算法·spring·缓存
九转成圣2 小时前
Spring Boot 导出 Excel 最佳实践:从 POI 函数式封装到 EasyExcel 的“降维打击”
spring boot·后端·excel