第一轮:基础构建与Spring Boot核心

面试官:谢飞机,我们先从简单的问题开始。你在项目中用过Spring Boot吗?它相比传统Spring有什么优势?

谢飞机:当然用过!Spring Boot最大的好处就是“开箱即用”,自动配置、内嵌Tomcat、起步依赖,省去了大量XML配置。

面试官:很好。那你知道自动配置的原理是什么吗?

谢飞机:呃……应该是通过@EnableAutoConfiguration注解,扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件加载配置类吧?

面试官:不错,那如果我想自定义一个Starter,该怎么做?

谢飞机:嗯……建个Maven工程,写个配置类,再注册到spring.factories?名字好像改了?我最近没搞这个……

第二轮:微服务架构与容错设计

面试官:假设我们现在做一个电商系统,订单服务要调用库存服务,你如何保证调用的稳定性?

谢飞机:可以用OpenFeign做声明式调用,加上Hystrix或Resilience4j做熔断降级。

面试官:Hystrix已经停更了,为什么我们推荐用Resilience4j?

谢飞机:因为……轻量?函数式编程?响应式支持?哦对,它是基于Vavr的,资源占用少。

面试官:很好。如果库存服务返回慢,你想加个超时和重试机制,怎么配?

谢飞机:在application.yml里配feign.client.config.default.connectTimeout就行……重试的话,实现Retryer接口?具体参数我记不太清了……

第三轮:分布式事务与数据一致性

面试官:订单扣库存成功,但支付失败了,怎么处理?

谢飞机:加个回滚?消息队列发个补偿消息?

面试官:这是最终一致性方案。如果要用Seata的AT模式,流程是怎样的?

谢飞机:呃……TM、RM、TC?先注册分支事务,然后全局提交……undo_log表?我只看过demo,没在生产用过……

面试官:最后一个问题:如果Redis缓存和数据库不一致,你怎么解决?

谢飞机:先更新数据库,再删缓存?延迟双删?Cache Aside Pattern?不过并发高了还是会出问题……有没有完美的办法?

面试结束

面试官:今天就到这里,你的基础还可以,但深度有待加强。回去等通知吧。

附录:详细解析(小白也能学会)

1. Spring Boot 自动配置原理

  • 业务场景:快速搭建微服务模块,避免重复配置数据源、WebMvc、日志等。
  • 技术点:
    - @SpringBootApplication = @SpringBootConfiguration + @EnableAutoConfiguration + @ComponentScan
    - 自动配置类位于JAR包中的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(Spring Boot 3.x)
    - 条件装配:@ConditionalOnClass、@ConditionalOnMissingBean等
  • 自定义Starter步骤:
    ① 创建autoconfigure模块,引入spring-boot-autoconfigure
    ② 编写自动配置类,使用条件注解
    ③ 在META-INF/spring/下创建自动配置文件,注册配置类
    ④ 创建starter模块,依赖autoconfigure模块

2. Resilience4j 熔断与限流

  • 业务场景:防止库存服务宕机导致订单服务雪崩。
  • 技术点:
    - 支持CircuitBreaker(熔断)、RateLimiter(限流)、Retry、Bulkhead(舱壁)
    - 函数式编程风格:.decorateFunction()
    - 与Spring Cloud OpenFeign集成:@EnableCircuitBreaker + 注解配置
  • YAML配置示例:
    resilience4j.circuitbreaker.instances.orderService.failure-rate-threshold=50
    resilience4j.ratelimiter.instances.orderService.limit-for-period=10

3. Seata AT 模式分布式事务

  • 业务场景:跨服务的数据一致性,如订单+库存+支付。
  • 核心组件:
    - TC(Transaction Coordinator):Seata Server,协调全局事务
    - TM(Transaction Manager):开启/提交/回滚全局事务
    - RM(Resource Manager):管理分支事务,注册与状态汇报
  • 执行流程:
    ① TM向TC申请开启全局事务 → XID生成
    ② RM注册分支事务(如扣库存)→ 记录before image到undo_log
    ③ 执行SQL → 记录after image
    ④ 全局提交:TC通知各RM异步删除undo_log
    ⑤ 全局回滚:对比before/after image,生成逆向SQL执行

4. 缓存一致性方案

  • 常见模式:
    - Cache Aside Pattern(最常用):
      ✓ 更新DB → 删除缓存
      ✗ 可能出现:读请求命中旧缓存(可加延迟双删)
    - Read/Write Through:由缓存层代理DB读写
    - Write Behind:异步写回,风险高
  • 优化策略:
    - 延迟双删:更新DB → 删缓存 → 延迟几百ms → 再删一次
    - 使用Binlog监听(如Canal)异步更新缓存
    - 设置缓存过期时间作为兜底

更多推荐