面试官与搞笑候选人小Y:从单体到微服务再到 AI RAG 的 Java 实战面试全解析

场景:某互联网大厂在线教育事业部,招聘 Java 开发工程师。

业务方向:在线教育 + 内容社区 + AI 辅助学习搜索。

人物:

  • 面试官(I):业务技术双栈,语气严肃,追问很细。
  • 候选人小Y(Y):典型“面试造火箭,入职拧螺丝”型,简单题还能答,复杂题就开始打太极和扯淡。

一、第一轮:从单体 Spring Boot 到基础持久化

背景:团队有一套老的在线课程系统,之前是一个 Spring Boot 单体应用,主要功能是课程管理、用户注册登录、下单支付。准备重构前,先考考小Y对单体应用与基础 Java 技术栈的掌握情况。

1.1 Java 基础与 JVM

I1: 你之前做在线教育或电商类似项目时,后端主要用的是哪个 Java 版本?为什么?

Y: 一般都是 Java 8 吧,比较稳…有时候也会用 11,那个,性能更好一点,嗯,社区也比较活跃…反正公司用啥我就用啥。

I 点评: Java 版本能说出 8/11 的理由是基本要求,最好能提到 LTS 版本新特性(如 Stream、Optional、var)以及 JVM 调优经验


I2: 线上单体项目内存频繁飙高,你会怎么排查?从 JVM 角度简单说说思路和涉及哪些工具?

Y: 这个…一般就是先重启一下…呃不是,我是说先看监控,看看堆是不是满了,然后用 jmap 之类的,dump 一下,看有没有内存泄漏吧。然后…再调一调 JVM 参数。

I 点评: 思路是有一点,但明显不扎实,也没提到 JVM 内存结构、GC 日志分析、工具链(jmap/jstack/VisualVM/Arthas)。后面解析里会补全。


1.2 Spring Boot + Web 层

I3: 现在这个在线教育单体系统,用 Spring Boot + Spring MVC 提供课程查询接口。你会怎么设计一个课程详情的 REST API?大致讲讲 URL 设计、返回结构以及如何使用 Swagger/OpenAPI。

Y: 课程详情就 GET /courses/{id} 呗,返回个 JSON,里面有标题、价格啥的。Swagger 就加个注解,那个 @ApiOperation 啥的,扫一下包就出来文档了。

I 点评: 基本没问题,但比较浅。可以进一步谈 统一响应结构、错误码设计、接口幂等性、Swagger/OpenAPI3 配置等


1.3 数据库与 ORM

I4: 课程信息存 MySQL,用 Spring Data JPAMyBatis 都可以。你之前更习惯哪个?在在线教育这种场景下会怎么建课程表?说几个关键字段。

Y: 我一般用 MyBatis,写 SQL 比较自由。课程表嘛,有 id、name、price、teacher_id、status 这些。再加个创建时间更新时间,差不多。

I 点评: 方向对,但没提到 索引设计逻辑删除多维度查询字段(类目、标签、难度等级) 等。


1.4 测试与基础 DevOps

I5: 你会怎么给 GET /courses/{id} 这个接口写自动化测试?用什么测试框架比较多?

Y: 就用 JUnit 5 吧,或者 TestNG 也行。Spring Boot 有那个 MockMvc,可以造个请求,测一下返回是不是 200,body 里是不是有数据。

I 点评: 基础测试意识 OK,但没提到 单元测试 vs 集成测试 的区分、Mockito/AssertJ 等工具链。


二、第二轮:从单体拆到微服务 + 消息队列 + 缓存

背景:业务发展很快,在线教育平台要扩展出:

  • 内容社区与 UGC(用户发帖、评论、点赞);
  • 支付与订单独立结算;
  • 后续还会接入本地生活、线下课程和共享教室等服务。

团队决定把单体拆成若干 Spring Cloud 微服务

  • 用户服务、课程服务、订单服务、支付服务、内容社区服务等;
  • 使用 Spring Cloud + OpenFeign + Eureka/Consul + Gateway
  • 消息队列引入 Kafka,缓存用 Redis

2.1 微服务拆分与调用

I6: 如果我们把课程服务、订单服务、用户服务拆成三个微服务,你会怎么用 Spring Cloud 或其他框架实现它们之间的调用和注册发现?

Y: 嗯…Spring Cloud 一般就 Eureka 啊,或者 Consul,服务启动的时候注册一下。服务间调用就用 OpenFeign,写个接口,加个 @FeignClient,然后像本地方法一样调就好了。

I 点评: 这是合格答案的“骨架”,还可以进一步谈:

  • 配置中心(Spring Cloud Config 或 Nacos);
  • 网关(Spring Cloud Gateway)做统一入口;
  • 服务发现的健康检查与熔断。

2.2 消息队列:Kafka 场景

I7: 现在用户下单购买课程后,需要:

  • 生成订单记录;
  • 通知支付服务;
  • 同时给用户发送站内信和短信;
  • 内容社区那边需要记录“学习动态”。

如果用 Kafka,你会怎么设计 Topic?在 Java 里使用 Kafka 的生产者与消费者时要注意什么?

Y: Topic 就一个订单主题?比如 order-events,然后里面发下单、支付成功这些消息。Java 生产者就是用 KafkaTemplate 发消息,消费者就 @KafkaListener 收一下。注意…注意别丢消息吧。

I 点评: 回答明显过于含糊,没有提到:

  • 事件类型与 Topic/Partition 规划;
  • 消息有序性、幂等消费;
  • 消费失败重试与死信队列;
  • Spring Kafka 的 offset 提交策略等。

2.3 Redis 缓存与热点课程

I8: 平台有热门课程,经常被反复访问。你会如何用 Redis 做缓存?

涉及:

  • Key 设计;
  • 缓存雪崩、击穿、穿透的处理;
  • 在 Java 里如何集成(Spring Cache 或 Redisson 等)。

Y: 嗯,热门课程就放 Redis 呗,key 可以叫 course:{id},设置个过期时间。雪崩就是别一起过期,击穿就是加个锁,穿透就缓存空值…大概这样吧。

I 点评: 这是经典八股文,但没谈到:

  • 具体用哪些 Redis 数据结构;
  • 热点 Key 的预热与异步刷新;
  • 实现分布式锁的细节(原子性、续约)。

2.4 链路追踪与日志

I9: 微服务拆分之后,一个用户下单请求会经过:网关 → 用户服务 → 课程服务 → 订单服务 → 支付服务 → 消息队列 → 通知服务。你会如何用 日志和链路追踪来排查一次请求的完整链路?

可选技术栈:SLF4J + Logback/Log4j2、ELK、Jaeger、Zipkin、Micrometer、Prometheus、Grafana

Y: 呃…这个就用 TraceId 啊,在日志里打出来。然后…ELK 可以搜日志,Zipkin 可以看调用链路吧。Prometheus 和 Grafana 画个监控图呗。

I 点评: 只说到了名字,没讲出体系化做法,比如:

  • Sleuth 或 Micrometer Tracing 集成;
  • 日志规范(日志级别、字段);
  • 延迟报警与错误告警策略。

2.5 安全与认证

I10: 用户登录之后,需要访问课程与订单服务。我们计划使用 JWT + Spring Security 做统一认证。你会怎么设计登录与鉴权流程?

Y: 登录的时候,校验用户名密码,生成一个 JWT,客户端带着这个 token 调接口。Spring Security 里面写个过滤器,把 token 解析一下,就知道用户是谁,可以放行或者拦截。

I 点评: 方向对,但没提到:

  • Token 过期与刷新机制;
  • 如何避免 JWT 被盗用(https、签名算法、黑名单);
  • 权限粒度设计(接口级、数据级)。

三、第三轮:AI 搜索、RAG 与智能客服

背景:在线教育平台为了提升用户体验,要做:

  • AI 智能问答:用户用自然语言提问,例如“我想系统学 Java 微服务,从入门到精通推荐课程”;
  • 语义搜索:根据用户问题检索课程、文章、UGC 内容;
  • 智能客服:处理退款、课程权限、发票等问题。

技术方向:RAG(检索增强生成)、向量数据库、Spring AI、Agentic RAG、企业文档问答。

3.1 AI 语义检索基本方案

I11: 如果我们要实现一个“智能课程搜索”,用户可以用自然语言搜索,比如“想学 Spring Cloud 微服务”的时候,不只是关键词匹配,而是语义理解。你会怎么设计?简单讲讲 RAG 的思路

Y: RAG…就是先检索再生成吧。那个,先把课程简介都向量化,存到向量库,然后用户的问题也向量化,算相似度,找几个相关的课程,再丢给大模型总结一下就完了。

I 点评: 这属于面试八股水平:

  • 知道“检索 + 大模型生成”的基本套路,但没说清楚 向量库选型、Embedding 模型、召回策略 等。

3.2 向量数据库与 Embedding

I12: 在我们的系统中,如果选用 Milvus 或 Redis 向量数据库 来存储课程与 UGC 文本的向量,你觉得在 Java 里如何落地?涉及哪些组件?

Y: 这个…Java 里就调它们的客户端 SDK 吧。Embedding 模型可以用 OpenAI 的,也可以自己部署个啥的。然后算完向量就写到 Milvus 里面…大概是这样?

I 点评: 回答非常模糊,没有提:

  • Milvus/Redis 的索引与分片;
  • 批量写入、更新策略;
  • 向量维度、模型版本管理等工程问题。

3.3 Spring AI 与 Agentic RAG

I13: 我们打算在 Java 侧使用 Spring AI,并构建一个简单的 Agent,可以:

  • 接入多个工具(课程检索、订单查询、退款规则文档加载);
  • 根据用户会话上下文进行多轮对话;
  • 尽量减少 AI 幻觉。

你觉得整体架构上,Java 服务要做哪些事?

Y: 呃…Spring AI 就封装了一些大模型接口吧,可以写个 Agent,然后…工具的话,用 RAG 去查文档,再把结果给模型。为了减少幻觉,可以多让它引用文档原文?然后…会话内存…就把上下文带上。

I 点评: 概念堆得挺多,但结构不清晰:

  • 没有说明工具执行框架、对话记忆的实现方式;
  • 没有提到模型调用限流与监控;
  • 对 Agentic RAG 的“任务分解、工具选择”没讲清。

3.4 AI 幻觉与企业风控

I14: 在智能客服场景中,如果 AI 回答了错误的退款规则信息,可能造成经济损失。你认为如何在 工程层面降低 AI 幻觉带来的风险?

Y: 这个…就加个免责声明?咳咳…我是说可以做检索增强,尽量让它只根据文档回答。还有就是,重要问题让人工审核一下。再不行,就把模型调得稳一点?

I 点评: 方向没错,但还是太泛:

  • 可以做 答案来源展示、置信度阈值、关键流程人工兜底 等更具体办法;
  • 接入安全风控系统,记录每次 AI 响应的审计日志。

3.5 复杂工作流与企业集成

I15: 假设我们要做一个“从用户发起退款 → AI 智能判断 → 自动创建工单 → 推送到客服系统 → 通知用户”的复杂工作流。后端 Java 系统要串联:

  • 订单服务;
  • AI 服务(RAG/Agent);
  • 工单系统(可能是 SaaS,如企业协同平台);
  • 消息通知服务(短信/站内信/邮件)。

你会选择什么样的技术栈和架构来实现?

Y: 这个…可以用个工作流引擎吧,比如…呃,Activiti 或者 Flowable?或者用 Spring Cloud 事件驱动一下,反正就是微服务之间发消息。AI 那边就是一个独立服务,订单啥的就用 Feign 调一下。工单系统…看它有没有 API,有就调用,没有就…想办法。

I 点评: 回答有点“嘴上架构师”的味道:

  • 没有给出清晰的事件流与状态机;
  • 没有提幂等性、重试、失败补偿等关键点。

四、面试结束

I: 好,今天就先到这里。你基础还可以,但经验有些零碎。我们会综合考虑,回去等通知吧。

Y: 啊?那能不能先给个答复…好吧,那我先回去再把 Spring AI 和微服务那块好好补一补…


五、详细解析:业务场景 + 技术点一网打尽(含小白向讲解)

下面是按三个阶段,把上面问到的技术点系统梳理一遍,方便你按图索骥去学习。


5.1 阶段一:单体 Spring Boot 在线教育系统

5.1.1 Java 版本与 JVM 基础
  • Java 8:目前很多大厂仍在大量使用。
    • 核心特性:Lambda、Stream、Optional、日期时间 API、默认接口方法等。
    • 丰富的生态支持(大部分框架首选)。
  • Java 11/17(LTS)
    • var 局部变量类型推断、性能与 GC 优化、更长的 LTS 支持周期。

JVM 排查内存问题的一般步骤:

  1. 观察指标:堆内存、GC 次数和耗时、Full GC 频率。
  2. 工具链:
    • jmap:导出堆 dump。
    • jstack:查看线程堆栈,排查死锁、卡顿。
    • VisualVM / JMC / Arthas:交互式分析热点对象、方法、线程状态。
  3. 分析:
    • 判断是否内存泄漏(某类对象数量持续增长);
    • 检查缓存/集合是否无限膨胀;
    • 优化代码或调整 JVM 参数(堆大小、GC 算法等)。

5.1.2 Spring Boot + Spring MVC 设计 REST API

以“课程详情接口”为例:

  • URL 设计
    • GET /api/v1/courses/{courseId}:查询课程详情。
    • 建议使用版本号 /api/v1/ 方便灰度与升级。
  • 返回结构(统一响应)
    {
      "code": 0,
      "message": "success",
      "data": {
        "id": 1001,
        "title": "Java 微服务实战",
        "price": 199,
        "teacherName": "张三",
        "status": "ON_SHELF"
      }
    }
    
  • Swagger / OpenAPI 集成
    • 使用 springdoc-openapi 或 Swagger 3;
    • 在 Controller 上添加注解:
      @Operation(summary = "获取课程详情")
      @GetMapping("/courses/{id}")
      public ApiResponse<CourseDto> getCourse(@PathVariable Long id) { ... }
      
    • 启动后自动生成交互式 API 文档(/swagger-ui.html 或 /swagger-ui/index.html)。

5.1.3 数据库与 ORM:MyBatis / JPA

1)表结构设计示例(课程表):

CREATE TABLE course (
  id BIGINT PRIMARY KEY AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  sub_title VARCHAR(255),
  category_id BIGINT NOT NULL,
  level TINYINT NOT NULL COMMENT '难度:1-入门 2-中级 3-高级',
  price DECIMAL(10,2) NOT NULL,
  teacher_id BIGINT NOT NULL,
  status TINYINT NOT NULL COMMENT '0-下架 1-上架',
  is_deleted TINYINT NOT NULL DEFAULT 0,
  created_at DATETIME NOT NULL,
  updated_at DATETIME NOT NULL,
  KEY idx_category_level (category_id, level),
  KEY idx_teacher (teacher_id)
);
  • 注意:
    • 逻辑删除字段 is_deleted,避免直接物理删除影响统计;
    • 针对查询频繁的字段建索引;
    • 记录创建与更新时间,方便审计与排序。

2)ORM 选择:

  • MyBatis:适合复杂 SQL、多表联查、灵活控制性能。
  • JPA/Hibernate/Spring Data JPA:开发效率高,适合 CRUD 场景。

5.1.4 测试:JUnit 5 + Mockito + Spring Boot Test
  • 单元测试
    • 只测 Service、工具类等,不依赖外部资源(数据库、MQ);
    • 使用 Mockito 模拟依赖,AssertJ 断言。
  • 集成测试
    • 使用 @SpringBootTest 启动部分或完整 Spring 上下文;
    • 用 MockMvc 或 TestRestTemplate 调用 HTTP 接口;
    • 可以连接测试库或使用内存数据库(H2)。

示例:

@SpringBootTest
@AutoConfigureMockMvc
class CourseControllerTest {

  @Autowired
  private MockMvc mockMvc;

  @Test
  void testGetCourse() throws Exception {
    mockMvc.perform(get("/api/v1/courses/1001"))
        .andExpect(status().isOk())
        .andExpect(jsonPath("$.code").value(0));
  }
}

5.2 阶段二:微服务、消息队列与缓存

5.2.1 微服务拆分与 Spring Cloud 体系

典型拆分:

  • 用户服务(user-service);
  • 课程服务(course-service);
  • 订单服务(order-service);
  • 支付服务(payment-service);
  • 内容社区服务(ugc-service);
  • 网关服务(api-gateway)。

技术栈:

  • 服务注册发现:Eureka / Consul / Nacos;
  • 配置中心:Spring Cloud Config / Nacos Config;
  • 服务调用:OpenFeign / gRPC;
  • 网关:Spring Cloud Gateway / Nginx + 自研网关;
  • 熔断限流:Resilience4j / Sentinel。

调用示意:

  1. 客户端请求 → 网关 → 订单服务;
  2. 订单服务通过 Feign 调用课程服务查询课程信息;
  3. 订单服务调用用户服务查询优惠与用户身份;
  4. 订单创建成功后发送消息到 Kafka 通知支付与其他异步流程。

5.2.2 Kafka 在订单与通知场景中的用法

1)Topic 设计:

  • order-events:订单相关事件(创建、支付成功、取消)。
    • key:orderId,便于同一订单的消息落在同一 partition,保证顺序;
    • value:JSON 或 Avro,包含订单状态、时间等。
  • user-notifications:用户通知事件。

2)事件驱动流程:

  1. 订单服务创建订单 → 发送 OrderCreated 事件到 order-events
  2. 支付服务消费 OrderCreated,生成支付二维码或链接;
  3. 支付成功回调 → 支付服务发送 OrderPaid 事件;
  4. 通知服务消费 OrderPaid,给用户发短信/站内信;
  5. UGC 服务消费 OrderPaid,记录“加入课程”动态。

3)Java 使用 Kafka 注意点(以 Spring Kafka 为例):

  • 生产者:
    kafkaTemplate.send("order-events", orderId, eventJson);
    
    • 配置重试、超时、消息大小限制;
  • 消费者:
    @KafkaListener(topics = "order-events", groupId = "payment-service")
    public void onMessage(ConsumerRecord<String, String> record) { ... }
    
    • 手动提交 offset:避免未处理成功就提交;
    • 幂等性:为每条消息加唯一 ID,在数据库中记录处理状态。

5.2.3 Redis 缓存与热点课程

1)Key 设计:

  • 单个课程详情:course:detail:{id}
  • 课程列表缓存:course:list:category:{categoryId}:page:{pageNo}
  • 热门课程排行榜:使用 zset,如 course:hot:rank,按访问量/购买量排序。

2)缓存问题与解决:

  • 缓存雪崩:大量 key 同时过期导致后端被打崩。
    • 解决:给过期时间加随机值、热门数据永不过期+后台刷新、分片过期等。
  • 缓存击穿:某个热点 key 过期瞬间大量请求同时打到 DB。
    • 解决:互斥锁(如 Redisson 分布式锁)、“永不过期+异步更新”。
  • 缓存穿透:大量请求访问不存在的数据(恶意攻击或脏数据)。
    • 解决:缓存空值(短 TTL)、参数校验、布隆过滤器。

3)Spring Cache 简单用法:

@Cacheable(cacheNames = "course", key = "#id")
public CourseDto getCourseById(Long id) { ... }

5.2.4 日志、监控与链路追踪

1)日志框架:

  • SLF4J + Logback/Log4j2:统一日志接口与实现;
  • 规范日志格式:时间、TraceId、SpanId、服务名、方法、耗时、错误堆栈。

2)链路追踪:

  • 使用 Spring Cloud Sleuth 或 Micrometer Tracing:
    • 自动在请求链路中传递 TraceId/SpanId;
    • 集成 Zipkin/Jaeger 可视化调用链;
  • 通过过滤器/拦截器在入站请求时生成 TraceId 或从上游传入。

3)指标与监控:

  • Micrometer 把应用指标(QPS、RT、错误率、JVM 状态)上报到 Prometheus;
  • Grafana 对指标做可视化与告警:
    • 如订单服务 5 分钟错误率 > 5% 时报警。

5.2.5 安全:Spring Security + JWT + OAuth2/Keycloak

1)登录与认证流程:

  1. 用户调用 /auth/login,提交用户名和密码;
  2. 后端验证通过后生成 JWT,写入响应;
  3. 客户端后续调用接口时,把 JWT 放在 Authorization: Bearer xxx 头里;
  4. 网关或服务端过滤器解析 JWT,校验签名与过期时间;
  5. 把用户信息(UserDetails)写到 SecurityContext,用于后续权限判断。

2)关键点:

  • 使用非对称加密(如 RSA)签名,私钥在认证中心,公钥在各服务;
  • 短有效期 + 刷新 token;
  • 敏感操作(支付、提现)可以附加二次校验。

3)高级玩法:

  • 使用 OAuth2.1 / Keycloak 做统一认证中心;
  • 支持 SSO、多端登录、企业身份(企业协同/SaaS 场景)。

5.3 阶段三:AI 语义搜索、RAG 与智能客服

5.3.1 从关键词匹配到语义检索

传统搜索:

  • 基于 MySQL LIKE 或 Elasticsearch 关键词匹配;
  • 无法理解“学微服务”与“Spring Cloud 课程”之间的语义关系。

语义检索核心:

  • Embedding 模型 将文本(课程标题、简介、UGC)转换为向量;
  • 查询问题也向量化,计算相似度(如余弦相似度);
  • 使用向量数据库(Milvus、Redis、Chroma)存储与高效检索。

RAG(Retrieval-Augmented Generation)的流程:

  1. 用户提问:
    • “我想从零开始学 Java 微服务,有没有系统课程推荐?”
  2. 检索阶段:
    • 使用 Embedding 模型(如 OpenAI、Ollama)把问题转成向量;
    • 在向量库中检索最相近的课程、文章、UGC;
  3. 生成阶段:
    • 把检索到的内容作为“知识上下文”拼接到 Prompt 中;
    • 调用大模型生成回答(推荐课程清单+学习路径);
  4. 返回结果时可附带来源链接,提升可信度。

5.3.2 向量数据库实战:Milvus / Redis

1)Milvus:

  • 优点:为向量搜索优化,支持大规模、高维向量,索引类型丰富(IVF、HNSW 等)。
  • Java 集成:
    • 使用官方 Java SDK(gRPC);
    • 设计 collection(类似表):字段包括 idvectortitletags 等;
    • 定义索引类型、分片策略;
    • 支持批量插入、删除、更新。

2)Redis 向量索引(Redis Stack):

  • 利用 VECTOR 类型 + RediSearch 实现向量检索;
  • 优点:与现有 Redis 集群融合,降低运维复杂度;
  • 适合向量规模相对较小、实时性要求高的场景。

3)工程实践:

  • 向量维度与模型版本要记录下来:
    • 否则升级 Embedding 模型后维度不一致会导致检索报错;
  • 定期重建索引与清理数据;
  • 对向量库访问做限流与缓存,避免直接被高并发打崩。

5.3.3 Spring AI 与 Agent 架构

Spring AI 的定位:

  • 类似 Spring Data、Spring Cloud,对于 AI 模型访问做“统一抽象”;
  • 支持多家模型提供商(OpenAI、Azure、Ollama 等);
  • 提供统一接口调用、Prompt 模板、对话管理等能力。

一个简单的 Agentic RAG 架构:

  1. 对话入口服务(Java + Spring Boot + Spring AI):
    • 接收用户请求(聊天、搜索、客服问题);
    • 管理会话上下文(聊天会话内存,可用 Redis/H2 存储历史消息);
  2. 工具执行框架
    • 定义多个工具(Tool):
      • 课程检索工具:调用向量库 + 课程服务;
      • 订单查询工具:调用订单微服务或 Dubbo 接口;
      • 退款规则工具:加载企业内部文档(Doc Loader + RAG);
    • Agent 根据模型输出或预设策略选择调用哪个工具;
  3. RAG 管道
    • 文档加载:课程大纲、帮助中心、退款规则等;
    • 向量化:使用 Embedding 模型;
    • 存储:Milvus/Chroma/Redis;
    • 检索:根据用户问题召回相关片段;
  4. 生成与响应
    • 将检索结果 + 用户问题 + 会话历史 拼接成 Prompt;
    • 调用大模型生成答案;
    • 记录日志与审计信息(问题、检索结果、回答、模型版本)。

5.3.4 减少 AI 幻觉与风控

在企业场景(尤其是退款、金融、医疗等高风险领域)下,AI 的策略:

  1. 答案来源展示
    • 在回答中附带引用的文档片段和链接;
    • 明确哪些内容是依据文档,哪些是模型推理。
  2. 置信度阈值
    • 如果检索结果的相似度/覆盖度过低,则:
      • 提示“目前没有足够信息”;
      • 或强制转人工客服。
  3. 规则和模板约束
    • 对于重要流程,采用“强模板化”回答:
      • 如退款条件、额度、时间,固定文案字段;
    • 大模型只负责选择模板、填入参数,不自由发挥。
  4. 人工审核与兜底
    • 复杂或金额较大的请求需要人工确认;
    • 支持“AI 草稿 + 人工编辑后发送”。
  5. 安全与审计日志
    • 每次 AI 回复都记录问题、检索内容、回答、模型 ID;
    • 便于出现问题时追踪和追责。

5.3.5 复杂工作流与微服务编排

“退款流程”的通用设计思路:

  1. 状态机
    • 状态:用户发起 → AI 预审 → 人工审核 → 退款执行 → 完成/拒绝;
  2. 工作流引擎
    • 使用 Activiti/Flowable/Camunda/Temporal 等;
    • 每个节点对应一个 Service 调用或消息处理;
  3. 事件驱动
    • 每个状态变化发送事件到 MQ(Kafka/RabbitMQ);
    • 下游服务(财务系统、通知服务)订阅对应事件;
  4. 幂等与补偿
    • 每次执行前检查当前状态,防止重复执行;
    • 失败时通过补偿动作(如退款失败回滚订单状态)恢复一致性。

5.4 小白学习路线建议

结合本文场景,如果你是 Java 初中级,可以按下面顺序学习:

  1. Java 核心与 JVM
    • Java 8/11 特性、集合、多线程;
    • JVM 内存结构、GC、基本调优;
  2. Spring Boot + Web 开发
    • REST API、参数校验、全局异常处理;
    • Swagger/OpenAPI 文档;
  3. 数据库与 ORM
    • MySQL 基础、索引;
    • MyBatis / JPA / Spring Data;
  4. 测试与工程实践
    • JUnit 5、Mockito、集成测试;
    • Git、Maven、Gradle;
  5. 微服务与中间件
    • Spring Cloud、OpenFeign、Eureka/Consul;
    • Kafka/RabbitMQ、Redis 缓存;
    • 日志、链路追踪(ELK、Zipkin、Jaeger)、监控(Prometheus+Grafana);
  6. 安全与认证
    • Spring Security、JWT、OAuth2/Keycloak;
  7. AI 与 RAG 实战
    • Embedding、向量数据库(Milvus/Chroma/Redis);
    • Spring AI、RAG 管道、Agent 工具调用框架;
    • 企业文档问答、智能客服系统。

掌握这些内容后,再回过头看本文的面试场景,你就能比小Y回答得更扎实、更体系化——从单体 CRUD 程序员,逐步成长为真正能顶住大厂后端生产环境的工程师。

更多推荐