高并发电商与 AI 智能客服场景下的 Java 面试实战:Spring Boot、微服务、Redis、Kafka、RAG 一网打尽
一、面试故事背景
场景:某头部互联网大厂,核心业务为电商 + 智能客服 + 广告推荐。
角色:
- 面试官:风格严肃、技术全面、善于追问业务细节和系统瓶颈。
- 小 Y:嘴上说"5 年经验",实际上"1 年经验用 5 年",简单问题还能答出来,复杂一点就开始打太极、含糊其辞,偶尔还会说点搞笑的话。
面试岗位:Java 后端工程师,主要做电商订单 + 用户画像 + AI 智能客服 / RAG 问答机器人相关的业务。
下面的内容分两部分:
- 故事对话:3 轮面试对话,每轮 3~5 个问题,业务和技术循序渐进。
- 详细解析:把所有问题的标准思路和技术点,系统地讲清楚,方便小白学习。
二、第一轮:基础服务 & API 设计(从下单到订单查询)
场景设定
业务场景:
- 用户在电商 App 上创建订单、查询订单、取消订单。
- 你负责订单服务的后端开发,需要设计接口、选型框架,并考虑基础性能问题。
第一轮对话(基础 + 入门实战)
Q1:订单服务的整体技术栈怎么选?
面试官:
我们有个订单服务,主要负责下单、订单查询、取消订单这些基础能力。你来从 0 搭建,会选哪些 Java 技术栈?简单说一下整体方案和理由。
小 Y(比较自信):
这个简单,我会用 Spring Boot 搭建基础应用,用 Spring MVC 暴露 REST 接口;
持久层用 MyBatis 或 JPA,连接池用 HikariCP,数据库肯定是 MySQL 啊;
构建工具用 Maven;配置用 YAML;日志用 SLF4J + Logback;
返回数据用 Jackson 做 JSON 序列化,文档就用 Swagger / OpenAPI;
部署的话上 Docker 就行,CI/CD 用 Jenkins 或 GitHub Actions 都可以。
面试官:
还不错,至少常用组件都能说出来,说明写过项目。那我们继续。
Q2:RESTful API 设计 & Spring MVC / WebFlux 如何选择?
面试官:
订单服务的 REST API,你会怎么设计?比如下单、查询订单。
另外我们内部有些服务考虑用 Spring WebFlux 做响应式,你觉得订单查询是否适合用 WebFlux?为什么?
小 Y:
REST API 一般就
/api/orders这种风格嘛:
POST /api/orders创建订单GET /api/orders/{id}查询订单详情DELETE /api/orders/{id}取消订单WebFlux 呢......呃,如果并发很高就可以用 WebFlux?它是响应式的嘛,性能比较好......具体怎么好......反正就是更快一点?
面试官:
你说的这个"更快一点"就比较虚了,等会解析部分我会专门讲清楚 WebFlux 适合的场景。
Q3:事务与并发:防止超卖怎么做?
面试官:
假设你们做的是"电商大促场景",库存紧张,很容易超卖。
你用 Java + MySQL + MyBatis,怎么保证一个商品不会被超卖?说一下思路和关键技术点。
小 Y:
防超卖嘛,可以用事务呀,加个
for update锁一下行;或者 Redis 也能搞个分布式锁?再不行就用消息队列串行处理,呃......大致是这样,反正就不能同时卖出去太多......
面试官:
思路都有沾上边,但说得比较散,后面我会帮你整理一下几个常见方案的优缺点。
Q4:如何做接口文档与测试?
面试官:
订单接口需要给前端和移动端同学用,你怎么管理 API 文档?
另外你会怎么用 JUnit / Mockito 之类的做测试?
小 Y:
文档用 Swagger 呀,就是 SpringDoc OpenAPI 那套,写注解就生成接口文档,还能在线调试;
测试就写点 JUnit 单元测试,用 Mockito mock 掉 Service 或 DAO,然后断言一下返回值对不对......嗯,大致是这样。
面试官:
这个回答还可以。说明你平时有写测试,不错。
Q5:基础监控与日志
面试官:
上线之后,订单服务出现超时、报错,你怎么排查?需要提前埋哪些日志和监控?
小 Y:
日志用 Logback,配合 SLF4J;如果是分布式可以加 TraceId;
监控的话可以用 Prometheus + Grafana,看看 QPS、RT、错误率这些;
也可以上 ELK,Kibana 查日志;
链路追踪可以用 Zipkin 或 Jaeger......具体图长啥样,嗯,我之前看过......
面试官:
至少知道主流方案,算合格。下一轮我们开始聊微服务和高并发问题。
三、第二轮:微服务、高并发、缓存与消息队列(大促场景)
场景设定
业务升级:
- 日活几千万,做大促 + 秒杀 + 推荐,订单服务只是其中一个微服务。
- 架构从单体升级为Spring Cloud 微服务 ,引入Redis、Kafka、ElasticSearch 等组件。
第二轮对话(微服务 + 缓存 + MQ)
Q1:微服务拆分与服务发现
面试官:
现在系统拆成多个微服务:订单、商品、用户、库存、支付等等。
你会怎么用 Spring Cloud 做服务治理?服务注册发现、配置中心、负载均衡这些,说一下你的经验。
小 Y:
嗯......老三件:Eureka + Ribbon + Feign......现在好像是 OpenFeign 加上 Spring Cloud LoadBalancer;
配置中心可以用 Spring Cloud Config 或 Nacos;
网关可以用 Spring Cloud Gateway,限流熔断可以上 Resilience4j;
注册中心也可以用 Consul......反正就是一堆东西连起来。
面试官:
名字都挺熟,就是缺一点系统性。待会我会用一个订单调用链帮你串起来。
Q2:Redis 缓存策略与一致性问题
面试官:
商品详情和库存经常被访问,直接打数据库会扛不住。
你会怎么使用 Redis 做缓存?
同时,如果数据库更新了,Redis 里的数据怎么保证不脏,不严重不一致?
小 Y:
用 Redis 做热点数据缓存呀,比如商品详情放 Redis,设置个过期时间;
一致性的话......可以先更新数据库,再删缓存;
或者是先删缓存再更新数据库?具体哪个顺序要看情况......反正要避免脏数据,呃。
面试官:
你这个回答有点危险,顺序不对会有严重问题,等会解析部分我会画出时间线来讲。
Q3:Redis 选型:单机、主从、哨兵、Cluster?
面试官:
Redis 的部署你会怎么选?单机肯定不行,我们是大促场景。
说说你对 Redis 主从、哨兵、Cluster 模式的理解,以及在电商场景的差异。
小 Y:
主从就一主多从,只写主读从;
哨兵是用来做主从的高可用,主挂了自动切换;
Cluster 是分片,解决容量和性能问题......
至于在电商里怎么选......那肯定 Cluster 更高级一点嘛......
面试官:
说得不算错,但"更高级一点"这个说法就比较业余。我后面会补充生产上常见搭配和坑点。
Q4:Kafka 在订单系统中的作用
面试官:
订单服务接入了 Kafka,你觉得它在整个链路里主要用来做什么?
请给出 3 个实际业务场景。
小 Y:
嗯......
- 下单成功后发消息给库存服务减库存;
- 发消息给消息中心发站内信 or 短信通知;
- 还可以把订单数据发到大数据平台做实时统计和推荐,比如 Flink 消费这些数据......
Kafka 就是解耦加异步,扛高并发嘛。
面试官:
这块回答得还可以,有场景、有技术点。
Q5:ES 搜索 & 日志分析
面试官:
用户会在前台做订单搜索,比如按时间、状态、商品关键词搜索订单。
你会怎么使用 ElasticSearch 来支持这个功能?
小 Y:
嗯......应该是订单数据写 MySQL 的时候,同步一份到 ES;
检索的时候查 ES,这样关键词搜索会快一点;
具体 mapping 怎么建我有点不太记得了,大概就那样......
面试官:
好,理解方向对。下一轮我们聊 AI 智能客服和 RAG。
四、第三轮:AI 智能客服、RAG 问答与安全体系
场景设定
业务继续升级:
- 接入了AI 智能客服系统 ,支持自然语言问答、订单状态查询、推荐与投诉处理。
- 使用 Spring AI / RAG / 向量数据库 实现企业文档问答。
- 需要保证安全与风控,避免越权查询敏感订单和用户隐私数据。
第三轮对话(AI + RAG + 安全)
Q1:如何实现一个 AI 智能客服查询订单?
面试官:
用户在聊天窗口里直接打字:"帮我查一下我昨天买的手机订单有没有发货?"
你会怎么用 Java + Spring Boot + Spring AI 来实现这个功能?
小 Y:
呃......
首先得接入大模型,比如 OpenAI 或者公司自研模型,通过 Spring AI 的客户端发送用户问题;
然后模型......就会帮我们理解问题?
至于怎么查订单,我感觉可以让模型直接调我们后端暴露的接口?
具体怎么调我还没研究那么细,不过大概是 Agent 之类的东西......
面试官:
大方向没错,但你这里几乎没落地细节,稍后我会讲一个标准的"工具调用 + RAG"流程。
Q2:什么是 RAG?为什么不直接让大模型"胡编"订单?
面试官:
你刚刚提到让模型直接回答,如果订单没查到怎么办?
在企业里我们更推崇 RAG,你能解释一下:
- RAG 是什么?
- 它如何减少 AI 幻觉(胡编乱造)?
小 Y:
RAG 好像叫"检索增强生成",就是先去检索一下资料,再让大模型根据资料回答;
这样就不会乱说?至少有点依据;
至于向量、Embedding 这些,我印象是把文本变成向量扔到向量数据库里,比如 Redis、Milvus 之类的,检索的时候算相似度;
细节我......大体知道个方向。
面试官:
至少能把关键词说出来,算"有听过"。我们后面会完整串一下一个企业 RAG 的标准架构。
Q3:AI 工具调用、Agent 和工作流
面试官:
AI 智能客服不只是查订单,还要:
- 识别用户意图
- 决定要不要调用"订单查询接口"、"退款接口"、"投诉接口"
- 可能要走一串工作流
你理解的 Agent、工具调用、工作流是什么?Java 服务在里面做什么?
小 Y:
Agent 听起来就像一个"会自己想"的机器人;
工具调用就是给模型一堆可以用的 API,让它自己选?
工作流嘛......比如先查订单,再判断是否符合退款条件,再调用退款......
Java 这边应该负责提供这些工具接口,保证权限校验啥的;
具体怎么让模型"自动决定",这个我了解得不是特别深入,感觉还是 prompt 那块比较玄学。
面试官:
至少方向对:Java 负责"可靠工具 + 权限",大模型负责"决策和自然语言"。
Q4:AI 场景下的权限控制与安全
面试官:
智能客服可以帮用户查订单,但不能查别人的订单;
你会怎么设计鉴权体系?Java 这边用什么技术?
小 Y:
这个可以用 Spring Security + JWT 啊;
用户登录后拿一个 Token,里面有用户 ID 和权限信息;
模型调用后端工具接口时,也要带上这个 Token 或者用户 ID,我们在接口里校验一下当前用户是不是订单的 owner;
要是越权就直接拒绝,返回错误给模型。
面试官:
这块答得挺清楚,说明安全这块你做过一点东西。
Q5:AI 日志、审计与风控
面试官:
最后一个问题:AI 智能客服回答错了、乱给退款、乱查隐私数据,怎么追踪?
你会记录哪些日志?用什么技术手段做审计和风控?
小 Y:
呃......
日志至少要记录:
- 用户问题
- 模型的回复
- 模型调用了哪些工具,参数是什么
这些可以打到 ELK 或者 ClickHouse 之类的日志系统;
风控的话,可以在 Java 这边加一些规则,比如对高风险操作要二次确认,不允许模型直接执行;
嗯,差不多这样吧......
面试官:
好,今天就问到这。你整体基础还行,但是对复杂场景和 AI 这块还需要多系统学习。
我们回去会综合评估,你回去等通知吧。
五、所有问题的系统解析(小白可按图索骥学习)
下面把上面所有问题做一个系统性拆解,小白可以按这几个方向逐步补齐知识。
1. 订单服务的基础技术栈设计
推荐技术栈:
- 核心:Java 11/17 + Spring Boot
- Web:Spring MVC(同步阻塞模型)
- ORM / 数据访问:
- MyBatis(SQL 可控,适合订单这类强业务系统)
- 或 JPA + Spring Data(更抽象)
- 连接池:HikariCP(性能好,Spring Boot 默认)
- 构建:Maven(主流)/ Gradle
- 日志:SLF4J + Logback / Log4j2
- 文档:SpringDoc OpenAPI / Swagger
- 测试:JUnit 5 + Mockito + AssertJ
- 部署:Docker,CI/CD(Jenkins / GitHub Actions / GitLab CI)
API 示例:
http
POST /api/orders # 创建订单
GET /api/orders/{id} # 查询订单详情
GET /api/orders # 按条件分页查询
DELETE /api/orders/{id} # 取消订单
2. Spring MVC vs Spring WebFlux 该怎么选?
Spring MVC(Servlet 模型):
- 优点:生态成熟、绝大多数三方库兼容;开发思维简单(同步调用)。
- 适合场景:绝大部分业务型系统,如订单、支付、后台管理等。
Spring WebFlux(响应式):
- 基于 Reactor(Mono/Flux),非阻塞 IO。
- 优点:在 IO 密集、长连接、高并发场景下更节省线程和资源,例如:
- 大量 WebSocket 长连接
- 需要同时调用多个下游服务、充分利用异步 IO
- 缺点:学习曲线高,生态不完全齐,团队不熟更容易写出"同步风格的异步垃圾代码"。
订单查询适不适合 WebFlux?
- 如果只是普通订单查询,大部分时间是数据库 IO,并发规模在常规范围内,用 Spring MVC 够了。
- 如果你要做类似"聚合多个下游服务、超高并发、微服务调用树很复杂"的场景,WebFlux 才更有优势。
面试时可以回答:
默认用 Spring MVC,除非遇到明显的高并发 IO 场景或已有成熟的响应式技术栈,才会考虑 WebFlux。
3. 防止超卖:事务、锁与 MQ
典型技术方案(可组合使用):
-
数据库行锁(悲观锁)
- SQL:
SELECT stock FROM product WHERE id = ? FOR UPDATE; - 在同一个事务内减库存。
- 优点:简单可靠。
- 缺点:并发高时锁竞争严重,吞吐量有限。
- SQL:
-
乐观锁(版本号 / CAS)
- 表结构加
version字段或使用stock > 0条件更新:
sqlUPDATE product SET stock = stock - 1 WHERE id = ? AND stock > 0;- 返回更新行数,0 行表示没抢到。
- 优点:无长时间锁,适合高并发。
- 表结构加
-
Redis + 预减库存
- 把库存放到 Redis,先对 Redis 做预减:
- 预减成功再异步写数据库/发送 MQ。
- 要配合消息队列和最终一致性。
-
消息队列串行化
- 用户请求先写入 MQ(Kafka / RabbitMQ),后端消费队列按顺序处理减库存。
- 类似"排队下单",核心是把请求排队控制并发。
面试时要有对比、权衡:
小规模用行锁 / 乐观锁,大促场景要结合 Redis 预减 + MQ + 最终一致性。
4. API 文档与测试实践
文档:Swagger / OpenAPI
java
@Operation(summary = "创建订单")
@PostMapping("/api/orders")
public OrderDTO createOrder(@RequestBody CreateOrderRequest req) {}
- 使用 SpringDoc OpenAPI 自动生成
/swagger-ui.html。
测试:JUnit 5 + Mockito
- 单元测试:mock 掉 DAO 或外部服务,只测试业务逻辑。
- 集成测试:使用
@SpringBootTest+ H2/测试环境,验证完整流程。
5. 日志与监控:排查线上问题
- 日志框架:Logback / Log4j2 + SLF4J 接口。
- 日志聚合:ELK(ElasticSearch + Logstash + Kibana)。
- 监控指标:Micrometer + Prometheus + Grafana。
- QPS、响应时间(P95/P99)、错误率、线程池状态、JVM 内存等。
- 链路追踪:Spring Cloud Sleuth(旧)/ Micrometer Tracing + Zipkin / Jaeger。
排查流程:
- 先看监控图:某接口 RT / 错误率异常?
- 再查日志:按 TraceId 关联上下游链路。
- 若是数据库慢,进一步看 SQL 慢查询和索引。
6. 微服务拆分与 Spring Cloud 组件
典型拆分:
- 用户服务、商品服务、订单服务、库存服务、支付服务、客服服务、推荐服务等。
Spring Cloud 生态(简版):
- 注册中心:Eureka / Consul / Nacos
- 配置中心:Spring Cloud Config / Nacos Config
- 网关:Spring Cloud Gateway
- 客户端调用:OpenFeign(HTTP 客户端),结合 Spring Cloud LoadBalancer
- 限流熔断:Resilience4j(替代 Hystrix)
调用链举例:
App → API Gateway → 订单服务 → 商品服务 + 用户服务 + 库存服务 → 支付服务
要明确:
- 注册中心用于服务发现。
- 网关做统一入口(鉴权、限流、路由)。
- 微服务内部通过 OpenFeign 调用彼此。
7. Redis 缓存:策略与一致性
典型缓存模式:
-
旁路缓存(Cache Aside):
- 先查缓存,没有就查数据库,然后写入缓存。
- 写操作:更新 DB + 删除缓存。
-
读写穿透问题:
- 穿透:访问大量不存在的 key,打爆数据库。
- 方案:对不存在的数据也写个短 TTL 的缓存;加布隆过滤器。
更新顺序为什么是"先更新 DB,再删缓存"?
-
如果是"先删缓存,再更新 DB",高并发下可能发生:
- 线程1 删缓存;
- 线程2 请求过来,缓存 miss;
- 线程2 查 DB,读到旧数据,写回缓存;
- 线程1 更新 DB; → 缓存是旧数据,数据库是新数据,出现脏数据。
-
"先更新 DB,再删缓存",结合短 TTL、重试机制,一致性会好一些。
8. Redis 部署模式选型
-
主从复制:一主多从,读写分离。
- 单点写风险仍在,主挂了需要切换。
-
哨兵(Sentinel):监控主从,主挂了自动故障转移。
- 解决了高可用问题。
-
Cluster(分片集群):数据根据 slot 分布在多个节点,支持水平扩展。
- 解决容量和并发瓶颈。
电商中常见:
- 核心缓存(商品详情、购物车、热点订单)→ Redis Cluster + 多副本 + 哨兵监控。
- 也可引入本地缓存(Caffeine/Ehcache)做两级缓存。
9. Kafka 在订单系统中的典型用法
场景示例:
-
订单创建 → 减库存
- 订单服务写入订单后,发送
ORDER_CREATED事件到 Kafka。 - 库存服务消费,减库存,失败时可重试 / 补偿。
- 订单服务写入订单后,发送
-
订单状态通知
- 发通知(短信、站内信、Push)通过独立的"消息中心"服务来做,解耦。
-
实时数据分析 / 推荐 / 风控
- 将关键行为(浏览、点击、下单、支付)写入 Kafka。
- Flink / Spark Streaming 实时消费做实时推荐、人群分析、风控。
优点:
- 解耦、异步、削峰。
10. ElasticSearch 在订单搜索与日志分析中的应用
订单搜索:
-
在订单写 MySQL 时,通过:
- 同步调用、或
- MQ 异步消费 将订单索引写入 ES。
-
搜索时:
- 关键词搜索(商品名、收件人)
- 过滤条件(时间范围、状态)
日志分析:
- 应用日志通过 Filebeat / Logstash 输送到 ES。
- 用 Kibana 做可视化、检索、告警。
11. AI 智能客服整体架构(Java 视角)
目标:用户用自然语言提问,系统能:
- 识别意图
- 调用业务 API(订单查询、退款、投诉)
- 结合企业文档做解释
一个典型架构:
-
对话入口层
- Web / App / 微信公众号 / 小程序 / 企业微信 等。
-
会话层(Chat Session + Memory)
- 负责管理会话上下文、历史消息。
- 可以存在 Redis / DB 中。
-
LLM 代理层(Agent)
- 使用 Spring AI 等框架调用大模型(OpenAI / 自研模型 / 其他供应商)。
- 定义工具(Tool):订单查询、退款、知识库查询等。
-
Java 工具服务层
- 订单服务、用户服务、支付服务等仍然是传统 Spring Boot 微服务。
- 对 Agent 暴露一层"工具 API",并做严格权限校验与参数校验。
-
RAG 知识库层
- 文档加载:客服 FAQ、售后政策、产品说明书、内部 SOP。
- 向量化:使用 Embedding 模型(OpenAI / Ollama / 本地向量模型)转换为向量。
- 存储:Milvus / Chroma / Redis Search / 向量 DB。
- 检索:语义检索 + rerank。
-
监控 & 审计 & 风控
- 日志记录每次问答、工具调用、错误信息。
- 配合 ELK、Prometheus、Grafana 做监控。
- 风控规则:高风险操作要求人工确认,模型只能给建议。
12. RAG(检索增强生成)的关键步骤
-
文档切分
- 把长文档切成小片段(例如 200~500 token),便于向量化和检索。
-
向量化(Embedding)
- 使用 Embedding 模型把文本转成向量:
- 可以用 OpenAI、Ollama、本地模型等。
-
向量数据库存储
- Milvus / Chroma / Redis Vector / Pinecone 等。
-
查询流程:
- 用户提问 → 生成问题向量;
- 相似度检索,取 Top N 相关文档片段;
- 把这些文档作为上下文,和用户问题一起发给大模型;
- 大模型在"看过这些文档"的情况下生成回答。
优势:
- 不依赖模型"记住你公司业务";
- 可以随时更新文档,无需重新训练模型;
- 减少幻觉:回答更多基于检索到的真实数据。
13. 工具调用、Agent 与工作流(在 Java 里的落地)
工具调用(Tool Calling):
-
给模型一个"工具列表",包括:
get_order_detail(orderId)refund_order(orderId, reason)search_knowledge_base(query)等。
-
模型根据用户问题,选择要不要调用某个工具,并给出参数。
-
Java 负责真实执行工具逻辑,并把结果返回给模型。
Agent:
- 一种具备"思考 + 规划 + 工具调用"的智能体。
- 可以多轮调用工具:
- 先查订单
- 再判断是否可退
- 再发起退款
工作流:
- 对复杂场景,可以显式建模一个流程: -如:工单创建 → 分配客服 → 查订单 → 升级人工 → 结束。
- Java 可以用工作流引擎(如 Camunda、Flowable)或自定义状态机来实现;
- 模型主要负责决策和自然语言交互,不直接控制关键交易逻辑。
14. AI 场景下的权限控制与安全
基本原则:
- 模型不可信,不能直接给它数据库账号、支付权限。
- 所有敏感操作必须由 Java 服务做权限检查。
典型方案:
- 用户登录 → 颁发 JWT / Session。
- 每次聊天请求携带用户身份(Token)。
- 当模型要调用"查订单/退款"等工具时,Java 工具服务从 Token 中解析出 userId / 角色 / 权限。
- 工具逻辑检查:
- 当前用户是否有权限查这个订单?
- 是否有退款权限?金额是否超限?
- 不通过则拒绝,并给模型一个"权限不足"的错误,让模型用自然语言说明原因给用户。
技术选型:
- Spring Security + JWT / OAuth2
- 或者 Keycloak 做统一身份认证,Java 微服务通过 OIDC / JWT 验证。
15. AI 日志、审计与风控
需要记录的内容:
- 用户问题原文
- 模型回复
- 所有工具调用:名称、参数、返回结果、耗时
- 错误信息 & 异常堆栈
用途:
- 事后审计:查某次错误退款是怎么发生的,是模型理解错,还是规则缺失。
- 标注与训练:把错误问答标注后,用于后续优化提示词或检索策略。
- 风控:基于日志分析异常模式(频繁查他人订单、批量敏感操作)。
技术组合:
- 日志:Logback / Log4j2 → ELK / ClickHouse
- 指标:Prometheus + Grafana(监控模型调用 QPS、RT、错误率)
- 链路:Jaeger / Zipkin(串起"用户 → LLM → 工具调用 → DB"全链路)。
六、总结:面试怎么从"听过"升级到"能落地"?
从上面的对话你可以看到:
- 小 Y 知道一堆名词,但缺乏系统性和落地细节。
- 面试官更看重你是否能把技术放到具体业务场景里 :
- 订单业务如何设计 API、事务和防超卖?
- 高并发时如何做缓存、消息队列、搜索?
- 接入 AI 时如何用 RAG、向量数据库和工具调用,又如何保证安全?
如果你是小白,可以按下面路径学习:
- 先搞懂 Spring Boot + MyBatis/JPA,能完整写一个订单服务。
- 再学习 Redis、Kafka、ElasticSearch,把订单系统"拉高一个量级"。
- 然后了解 Spring Cloud / 微服务,理解服务发现、网关、熔断限流。
- 最后再看 Spring AI、RAG、向量 DB,把 AI 能力接入业务,并做权限与审计。
只要你能把这些内容真正做过一遍,从"知道"变成"做过",面对类似的大厂 Java 面试,会坦然得多。