「本地生活+AI内容社区」实战:从 Java 基础到 Spring Cloud & RAG 智能客服的大厂面试故事

场景:互联网大厂,本地生活服务 + 内容社区 + AIGC 推荐中台部门,Java 开发工程师面试。

角色:

  • 面试官(I):严肃、逻辑清晰、喜欢追问细节。
  • 候选人小 Y(Y):搞笑水货程序员,基础还行,复杂问题就开始模糊带过。

业务背景:做「本地生活服务 + UGC 内容社区 + AI 智能客服」的一体化平台,支持外卖团购、商家店铺、短视频笔记、AI 问答与导购推荐,支撑千万级用户日活。


第一轮:Java 基础 & Spring Boot 入门——从点餐到下单

Q1:接口幂等性与下单去重

I: 我们做本地生活服务,用户点外卖时,可能会因为网络卡顿多次点击「立即下单」按钮。后端是 Java + Spring Boot。你怎么保证「创建订单接口」幂等性

Y: 哦这个简单,我就用个分布式锁,Redis SETNX 一锁,就能保证不会重复下单了嘛……

I: 分布式锁可以用,但你说细一点:

  • 锁的 key 怎么设计?
  • 如果请求超时了,锁没释放怎么办?
  • 幂等一定要靠锁吗?

Y: 诶,这个嘛……就……key 里带一下用户 ID,订单 ID 啊,然后超时时间设置长一点,一般也没事……幂等……也可以靠前端按钮置灰……

I: (点头又摇头)前端置灰只能减少问题,不能作为幂等的核心方案。后面我在讲解区给你补一下。


Q2:JVM 内存与高并发下单

I: 我们这套下单服务是 Spring Boot,部署在 K8s 上,每个 Pod 内存 4G,Java 17,订单高峰期 QPS 2000,你如何配置 JVM 内存,以及怎么排查一次 Full GC 导致接口 RT 抖动的问题?

Y: 哦这个,我一般就 -Xms2g -Xmx2g,然后用 G1 收集器,然后看一下 GC 日志,如果 Full GC 多,我就把内存调大点。

I:

  • 4G 容器只给 2G Heap?
  • 非 Heap 你怎么考虑?
  • G1 你知道哪些关键参数吗?

Y: 啊,这个……G1 就是挺智能的嘛,我觉得不用怎么配……

I: 好,那这块你回去再系统补一下 GC 和 JVM 调优。等会在答案区我给一套参考配置和分析步骤。


Q3:Maven 多模块与业务拆分

I: 我们是微服务架构,但每个服务内部也会做 Maven multi-module 拆分。比如:order-service 会包含:order-apiorder-serviceorder-dao。你是怎么管理这些模块依赖的?Parent POM 通常会放什么?

Y: 嗯……我一般就是一个 parent,里面放 <dependencyManagement>,然后子模块继承它,这样版本就统一了,具体的我都是直接 copy 公司脚手架的。

I: 你知道 dependencyManagement 和 dependencies 的区别吗?

Y: 嗯……好像,dependencyManagement 只是声明版本,不会真的引入?

I: 嗯,这点答得还可以,思路对的。细节我在后面补充。


Q4:Spring MVC vs Spring WebFlux

I: 本地生活有很多 内容流(Feed 流),比如猜你喜欢、短视频流,这类接口经常要聚合多方数据。你觉得在这些场景里:

  • Spring MVC(Servlet 阻塞模型)
  • Spring WebFlux(响应式非阻塞)

应该怎么选?什么情况下你会考虑 WebFlux?

Y: 哦 WebFlux 就是更快嘛,能扛更多并发,我觉得以后都用 WebFlux 就好了……

I: 如果都用 WebFlux,那你们团队大多数人不会响应式编程怎么办?排查问题成本呢?

Y: 呃……那就先用 MVC,以后再改?

I: 选择技术要有场景意识,后面我会用一张对比表帮你理一下。


第二轮:微服务、数据库与缓存——订单、支付与内容推荐

Q5:订单微服务拆分与 Spring Cloud 组件

I: 我们做本地生活,订单相关服务主要包括:

  • 订单服务(order)
  • 支付服务(payment)
  • 库存服务(inventory)
  • 营销优惠服务(promotion)

现在用 Spring Cloud + OpenFeign + Nacos/Consul 注册中心。说说:

  1. 服务间调用为什么建议用 OpenFeign,而不是自己写 RestTemplate?
  2. 调用链路如何做熔断与限流?

Y: Feign 写起来更优雅一些嘛,有接口就可以调用,还能配置日志。熔断限流嘛,我一般就上 Sentinel 或者 Resilience4j,配个线程池隔离,失败就降级。

I: 线程池隔离说细一点?

Y: 就是……不同接口用不同线程池?防止互相影响?

I: 好,有点感觉,但还比较模糊。待会我用一个“支付依赖第三方风控”的例子给你讲清楚。


Q6:数据库、连接池与事务隔离

I: 订单库使用 MySQL + HikariCP,读写分离。下单流程会涉及:

  • 插入订单表
  • 扣减库存
  • 冻结优惠券

在 Spring 事务里:

  1. 你会选择什么 事务传播级别
  2. 数据库事务隔离级别一般用哪种?为什么?

Y: 嗯,这个一般就 @Transactional 默认的,传播是 REQUIRED,隔离就是数据库默认的 REPEATABLE_READ

I: 如果库存服务在另一个微服务里,用本地事务还能保证一致性吗?

Y: 呃……那就用分布式事务?比如 Seata?

I: 分布式事务不是银弹,成本很高。我们常用的还有最终一致性方案,后面我在答案区帮你展开。


Q7:Redis 缓存与缓存一致性

I: 在「内容社区 + 本地生活」里,我们会缓存很多热点数据,比如:

  • 商家店铺详情
  • 爆款团购活动
  • 推荐视频列表

用 Redis + Spring Cache 或自己封装。你会怎么设计缓存策略,以避免:

  • 缓存雪崩
  • 缓存击穿
  • 缓存穿透

Y: 啊这个我知道:

  • 雪崩就随机过期时间
  • 击穿就加锁或者用互斥锁
  • 穿透就加布隆过滤器

I: 嗯,这块你答得比较完整,还不错。但要注意具体到「商家详情」这样的场景,细节会有区别。


Q8:Kafka 订单事件与 Elasticsearch 搜索

I: 我们会把订单、用户评价、商家更新等事件通过 Kafka 投递,落到 Elasticsearch 里做搜索和 BI 分析。请你设计:

  • Kafka Topic 的简单划分方案
  • 消费端如何保证「至少一次」语义下,避免消息重复消费导致 ES 数据重复?

Y: Topic 就按业务来分,比如 order-topicshop-topic。重复消费的话,我一般就写个幂等逻辑,比如先查一下再写?

I: 查一下再写,单机还行,高并发怎么做?

Y: 嗯……这个就,用文档 ID 做幂等?

I: 对,这个方向就对了,可以再系统化一点。


第三轮:AI 智能客服、RAG、链路追踪与 DevOps

业务背景补充

平台最近上线了一个「智能客服 + 内容问答 + 营销导购」系统,支持:

  • 用户问:「附近好评高的日料店?」
  • 智能客服给出:地图列表 + UGC 笔记摘要 + 实时优惠券

底层使用:

  • Spring Boot + Spring Cloud
  • Spring AI + RAG(检索增强生成)
  • 向量数据库:Milvus
  • Embedding 模型:OpenAI / 自建 Ollama

Q9:RAG 检索增强生成架构

I: 说一下你理解的 RAG(检索增强生成)流程。如果让你在 Java 侧用 Spring AI 做一个简单的「本地生活问答」,整体架构会怎么画?

Y: 嗯……RAG 就是,先检索再生成。用户问题来了,我就去搜索一下知识库,然后把结果和问题一起丢给大模型,让它回答……Spring AI 我还没怎么用,但是我感觉就是封装一下 HTTP 调用?

I:

  • 文档向量化在哪一步?
  • 向量库用什么?Milvus/Redis/Chroma 怎么选?
  • 如何控制 AI 不乱说(降低幻觉)?

Y: 嗯……这个就,离线的时候先向量化嘛,存起来,查询的时候做相似度搜索。幻觉就让它别瞎编……

I: 说得太抽象了,稍后我会给你画一条完整链路,带上 Spring AI、向量库、业务限权。


Q10:微服务调用链追踪与故障排查

I: 智能客服调用链比较长:

  1. API 网关
  2. 用户画像服务
  3. 内容检索服务(ES + 向量库)
  4. 推荐排序服务(Flink 实时特征)
  5. LLM 网关(Spring AI)

我们使用 Spring Cloud Sleuth / Micrometer + Zipkin/Jaeger 做链路追踪。一次故障中,用户反馈「智能客服很慢」。你会如何利用链路追踪来定位问题?

Y: 就,看一下链路图嘛,看哪个服务慢,就去优化那个服务?

I: 你会关注哪些指标?

Y: RT、QPS、错误率?

I: 嗯,有点概念,但排查步骤要更细,否则线上一着急就乱看。我待会写一套排查清单。


Q11:CI/CD、灰度发布与配置管理

I: 我们是 GitLab CI + Jenkins + Kubernetes 部署,Spring Cloud Config 做配置中心。智能客服这一块经常调模型参数和提示词(Prompt)。

  1. 你如何设计 灰度发布,只让 10% 流量先走新版本?
  2. 模型参数(比如 temperature、top_p)和 Prompt 模板放哪里更合适?

Y: 灰度嘛,我一般就用两个 Deployment,一个新版本,一个旧版本,然后 K8s Service 按比例分发?参数和 Prompt 我就放配置中心,改起来方便。

I: K8s Service 本身不支持权重路由,你说的是 Istio 之类的 Service Mesh 吧?

Y: 哦对对对,就是那个……我名字记不太清。

I: 嗯,思路方向对,但概念需要更严谨。


Q12:安全与风控(JWT & OAuth2)

I: 我们平台有:

  • 用户端 App / 小程序
  • 商家管理后台
  • 平台运营后台

登录认证用 OAuth2.1 + JWT,部分对接三方平台(支付、地图)用到了 Keycloak。你能说说:

  1. JWT 的优点和常见缺点?
  2. 如何在网关层做统一鉴权和权限校验?

Y: JWT 就是不用查数据库,信息都在 token 里,性能好。缺点就是太长,还有泄露就麻烦。鉴权就网关解析一下 token,然后看看权限。

I: 权限细粒度怎么做?比如商家只能看自己的店铺数据?

Y: 就在 token 里带店铺 ID?

I: 也可以,不过还需要结合后端再做一次资源级校验。好,这一轮先到这儿。


面试结束

I: 好的,小 Y,今天先聊到这。整体感觉是:

  • Java 基础和常见中间件,你有一定使用经验;
  • 在复杂场景上,很多时候只能说个大概。

我们内部会再综合评估,你先回去等通知,有结果 HR 会联系你。

Y: 好的好的,那我等你们好消息!


答案与详细讲解(给小白看的部分)

下面是对上面所有问题的系统讲解,按主题整理,适合新手系统自学。可以当作「本地生活 + AI 内容社区」技术栈速成笔记。


一、接口幂等性与高并发下单

1. 创建订单接口的幂等性设计

典型场景:用户点击「立即下单」多次,后端必须保证:

  • 至多生成一个有效订单
  • 支付金额、库存扣减不能重复

常见设计方案:

  1. 业务幂等键(更推荐)

    • 前端在下单前,先向后端申请一个 requestIdbizId(比如 order_token)。
    • 下单请求必须携带这个 bizId,数据库中为此 bizId 建唯一索引。
    • 后端逻辑:
      • 收到请求时,先尝试插入一条订单记录,主键或唯一索引包含 bizId
      • 如果插入成功:说明是第一次请求。
      • 如果报唯一键冲突:说明是重复请求,直接查询已有订单返回。
  2. 幂等表 / 去重表

    • 单独搞一张 idempotent_request 表,记录处理过的 requestId,状态(处理中/成功/失败)。
    • 每次请求先尝试插入 requestId
      • 插入成功:继续业务处理;
      • 插入失败:查历史处理结果,直接返回。
  3. 分布式锁(Redis/Redisson)

    • 适合作为补充手段,而不是唯一方案。
    • 缺点:
      • 锁粒度不好控制
      • 需要考虑锁失效、锁续期
      • 与业务数据库仍需配合唯一约束
  4. 为什么不能只靠前端按钮置灰?

    • 前端可以被绕过(F12、抓包重放)。
    • 网络抖动、重试机制仍然可能重复发请求。

总结:数据库唯一键 + 业务幂等 ID 是最稳妥的方案,分布式锁只是「辅助控并发」,不能取代幂等设计。


2. JVM 内存配置与 GC 调优

在 K8s 容器中,假设每个 Pod 限制 4G 内存:

  1. Heap 不要占满容器内存

    • 需要预留:
      • Metaspace
      • 线程栈
      • DirectBuffer / NIO
      • JVM 自身、C 库
    • 一般经验:-Xmx 设置为容器内存的 50%~70%。
  2. 示例配置(G1)

    -Xms2g -Xmx2g \
    -XX:+UseG1GC \
    -XX:MaxGCPauseMillis=200 \
    -XX:+UseStringDeduplication \
    -XX:+ParallelRefProcEnabled \
    -XX:InitiatingHeapOccupancyPercent=45 \
    -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/logs/gc.log
    
  3. 如何排查 Full GC 导致 RT 抖动?

    • 第一步:通过 Prometheus + Grafana / APM(如 New Relic)观察:
      • JVM Heap 使用率
      • GC 次数、GC 耗时
    • 第二步:结合 GC 日志分析:
      • 是否频繁 Full GC
      • 哪一代回收时间长(老年代 / humongous 对象)
    • 第三步:代码层检查:
      • 大对象频繁创建(比如 JSON 大实体、Byte[])
      • 热点接口对象池化、复用
      • 使用 -XX:+HeapDumpOnOutOfMemoryError 捕获堆快照,用 MAT / VisualVM 分析内存泄漏

小白记忆口诀:Heap 不要配满容器、监控 GC 曲线、发现 Full GC 先看内存分配和大对象。


二、Maven 多模块与 Spring MVC / WebFlux 选型

1. Maven multi-module 典型结构

order-parent
 ├── order-api       # 对外暴露的接口定义(DTO、Feign 接口)
 ├── order-service   # 业务逻辑(Controller、Service)
 └── order-dao       # DAO、Repository、MyBatis Mapper
``

`parent` POM 一般放:
- 通用依赖版本管理(`<dependencyManagement>`)
- 统一插件版本(编译插件、打包插件、代码检查插件)
- Java 版本、编码格式等配置

`dependencyManagement` 的关键点:
- **只声明版本,不真正引入依赖**。
- 子模块需要时写 `<dependency>`,无需再写 `<version>`。

### 2. Spring MVC vs Spring WebFlux

对比维度:

| 维度                | Spring MVC                           | Spring WebFlux                            |
|---------------------|--------------------------------------|-------------------------------------------|
| IO 模型             | 同步阻塞(Servlet)                  | 异步非阻塞(Reactor)                     |
| 编程复杂度          | 低,大家都熟                         | 高,响应式流式 API,debug 较难           |
| 适用场景            | 大多数常规业务、管理后台             | 大量 IO 等待(网关、聚合、多下游调用)    |
| 生态                | 成熟丰富                             | 在增长,但学习成本高                     |

在「本地生活+内容社区」里:
- 下单、支付、商家后台:**Spring MVC 足够**。
- API 网关、聚合多下游(推荐服务调用多个后端):**可以考虑 WebFlux**,但要评估团队能力。

> 选型原则:**优先保证团队可维护性,而不是盲目追求“高并发技术光环”。**

---

## 三、微服务调用、事务与缓存

### 1. Spring Cloud + OpenFeign + Resilience4j

典型调用链:`order-service` → `inventory-service` → `promotion-service`。

**为什么建议用 OpenFeign?**
- 声明式 REST 客户端:接口 + 注解 = HTTP 调用
- 与 Spring Cloud 生态(LoadBalancer、Config)整合好
- 支持日志、拦截器、编码器/解码器扩展

**熔断与限流(以 Resilience4j 为例)**
- 熔断:访问下游失败率超过阈值,短时间「熔断」请求,避免雪崩。
- 隔离:比如「支付风控服务」慢时,不影响其他接口,可用:
  - 线程池隔离:不同下游使用不同线程池,避免全部线程被卡死。
  - 信号量隔离:限制同时并发请求数。

示意:
```java
@FeignClient(name = "payment-service")
public interface PaymentClient {
    @GetMapping("/pay")
    PaymentResult pay(@RequestParam("orderId") Long orderId);
}

@CircuitBreaker(name = "payment", fallbackMethod = "payFallback")
public PaymentResult invokePay(Long orderId) {
    return paymentClient.pay(orderId);
}

小白理解:Feign 负责优雅调用,下游出问题时,用 Resilience4j 帮你「断路、限流、降级」,防止整个系统被拖垮。


2. 事务传播与分布式一致性

本地事务中:

  • Spring 默认传播级别 REQUIRED:有事务就加入,没有就新建
  • 数据库隔离级别 MySQL 默认 REPEATABLE_READ:避免幻读(InnoDB 特性)

在「下单(订单+库存+优惠券)」里:

  • 单库单服务:本地事务就能搞定。
  • 多微服务:本地事务无法跨服务,需要:
    1. 两阶段提交 / 分布式事务(Seata、XA)
      • 一致性高,但实现复杂、性能损耗大。
    2. 最终一致性(更常用)
      • 下单核心流程只保证「订单主状态 + 支付状态」强一致。
      • 库存、优惠券等通过消息(Kafka/RabbitMQ)异步调整。
      • 引入「补偿机制」与「对账任务」。

大厂普遍:对钱和订单强一致,对周边状态走「至少一次 + 幂等 + 补偿」的最终一致性。


3. Redis 缓存三兄弟:雪崩、击穿、穿透

以「商家详情」为例:

  1. 缓存雪崩

    • 问题:大量 Key 在同一时间失效,瞬间打爆数据库。
    • 方案:
      • 过期时间加随机值,比如 600s + random(0, 60)
      • 对核心数据增强多层缓存(本地 Caffeine + Redis)
  2. 缓存击穿

    • 问题:单个热点 Key 失效时,大量请求同时打 DB。
    • 方案:
      • 互斥锁(mutex):一个线程负责回源,其余等待。
      • 提前主动刷新:监控访问量,对热点 Key 做「快过期前续命」。
  3. 缓存穿透

    • 问题:请求大量不存在的数据,缓存查不到,DB 也查不到。
    • 方案:
      • 布隆过滤器:提前把所有合法 ID 放入过滤器
      • 对不存在的结果也进行短期缓存(缓存 Null)

小白口诀:雪崩看「一片失效时间」;击穿看「某个热点 key」;穿透看「大量非法 key」。


4. Kafka + Elasticsearch 幂等消费

  • Topic 划分建议:按「业务 + 场景」划分,如:order-created, order-paid, shop-updated, ugc-published
  • 为避免 ES 中数据重复:
    1. 使用 业务主键作为 ES 文档 ID
      • 比如订单文档 ID 使用 orderId
      • 再消费同一条消息,只会覆盖更新,不会插入新文档
    2. 消费幂等:
      • 为每条消息包含 eventId,在存储层做去重(比如 Redis set / DB 表)

实战常用策略:用业务 ID 当 ES docId,保证「幂等更新」;再结合消息 offset 提交策略与消费重试机制。


四、AI 智能客服与 RAG 架构

1. RAG 流程总览

以「附近好评高的日料店?」为例:

  1. 离线阶段

    • 收集:商家信息、用户评价、UGC 笔记、攻略文章
    • 文档切分:按段落/句子进行切分
    • 向量化:调用 Embedding 模型(OpenAI / 自建 Ollama Embedding)
    • 存储:向量写入向量数据库(Milvus/Chroma/Redis-Search),同时保留原文引用
  2. 在线问答阶段

    • 用户提问 → API 网关 → 智能客服服务
    • 智能客服服务:
      1. 对用户问题做向量化
      2. 在向量库中做相似度搜索,检索 Top-K 片段
      3. 将问题 + 相关片段 + 系统提示词(Prompt)组装成上下文
      4. 调用大模型(通过 Spring AI 封装的客户端)
    • 返回答案 + 相关店铺卡片

2. Spring AI 在 Java 中的角色

Spring AI 帮你做:

  • 模型客户端封装(OpenAI / Azure / 自建模型网关)
  • Prompt 模板化(提示填充)
  • 工具调用(函数调用、工具执行框架)
  • 会话内存(Conversation Memory)

示意伪代码:

ChatClient chatClient = ...; // Spring AI 提供

String prompt = template.render(Map.of(
    "question", userQuestion,
    "documents", retrievedDocs
));

ChatResponse response = chatClient.call(prompt);
String answer = response.getResult();

3. 减少 AI 幻觉的关键手段

  1. 检索质量:

    • 向量库召回要准确,避免拿到不相关文本
    • 可以结合「向量检索 + 关键字检索」混合检索
  2. 强约束 Prompt:

    • 明确要求模型「只根据给定文档回答」
    • 不知道就说不知道,不要编造
  3. 输出后验证:

    • 对某些关键字段(比如价格、地址)在业务端二次校验
    • 不可信的内容不给出具体信息,改为引导用户点击「查看详情」

小白理解:RAG = 搜索 + GPT。搜索负责「找到相关内容」,GPT 负责「生成自然语言答案」,两者结合,才适合企业业务场景。


五、链路追踪、监控与故障排查

1. 调用链:智能客服为什么慢?

链路:网关 → 画像 → 内容检索 → 推荐 → LLM 网关 → 大模型

使用 Zipkin/Jaeger 可以看到:

  • 每个服务的 span 耗时
  • 请求在每个服务的时间分布

排查步骤:

  1. 看哪一段耗时最长:是 ES 查询慢?向量库检索慢?还是 LLM 返回慢?
  2. 再深入到具体服务:
    • 看接口级别 RT、QPS、错误率
    • 对照最近发布记录和配置变更
  3. 协同查看:
    • Prometheus(CPU、内存、线程池)
    • 日志系统(ELK / Loki)

要形成「排查 SOP」:先看整体链路 → 定位慢点 → 再看该服务内部监控和日志。


六、CI/CD、灰度与配置管理

1. 灰度发布常见实现

在 K8s 环境下:

  1. 基于 Service Mesh(Istio 等):

    • VirtualService 中配置流量权重:
    route:
      - destination:
          host: ai-service
          subset: v1
        weight: 90
      - destination:
          host: ai-service
          subset: v2
        weight: 10
    
  2. 基于网关或自研路由:

    • 通过用户 ID、AB 实验配置,将部分用户打到新版本

2. 模型参数与 Prompt 配置化

  • 不要把 temperature、top_p、Prompt 模板写死在代码中
  • 推荐:Spring Cloud Config / Nacos 配置中心
  • 需要注意权限控制,防止误操作大面积影响线上

小白记忆:代码里埋「key」,配置里调「味道」。


七、安全与风控:JWT、OAuth2、Keycloak

1. JWT 优缺点

优点:

  • 无状态:服务端不需要保存 Session,适合微服务
  • 携带信息多:用户 ID、角色、过期时间等

缺点:

  • 一旦签发,短期内无法「单点作废」(除非黑名单方案)
  • 过长,Header 会变大
  • 泄露风险:谁拿到 token 都能冒充用户

2. 网关统一鉴权

流程:

  1. API Gateway 拦截请求,提取 Authorization Header(Bearer token)
  2. 使用公钥验证 JWT 签名、过期时间
  3. 从 token 中解析出:用户 ID、角色、租户、店铺 ID 等
  4. 将这些信息放入请求头 / 上下文,传给后端服务

后端服务再次做「资源级权限校验」,比如:

  • 查询商家订单时,判断 token.shopId == path.shopId

Keycloak 可以统一管理:

  • 客户端(前端应用、第三方服务)
  • 角色与权限
  • 单点登录与第三方登录(OAuth2)

总结:面试故事背后的技术地图

通过这场「本地生活 + 内容社区 + AI 智能客服」的大厂 Java 面试,我们实际上串了一整套技术地图:

  • Java 基础与 JVM:内存、GC、GC 调优
  • Spring 全家桶:Spring Boot、Spring MVC/WebFlux、Spring Cloud、OpenFeign、Spring Security
  • 数据库与中间件:MySQL + HikariCP、Redis、Kafka、Elasticsearch
  • 微服务治理:熔断、限流、链路追踪(Micrometer + Zipkin/Jaeger)
  • DevOps:Jenkins/GitLab CI + Docker + Kubernetes + 灰度发布
  • AI 能力:Spring AI、RAG、向量数据库(Milvus/Redis/Chroma)、Embedding 模型

如果你是小白,可以按这个顺序学习:

  1. 先打 Java SE + JVM 基础
  2. 再学 Spring Boot + Spring MVC + MyBatis/JPA 做简单业务
  3. 然后上手 Spring Cloud + 中间件(Redis/Kafka/ES) 做电商/本地生活小项目
  4. 最后引入 Spring AI + RAG,做一个「智能客服 + 导购问答」的完整 Demo

等你把这些串起来,再去大厂面试时,就不会像小 Y 那样一到复杂问题就开始糊弄,而是能从「业务场景 → 技术方案 → 取舍理由」完整讲清楚。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐