Java大厂面试实录:Spring Boot + 微服务 + 分布式场景三轮连环问
第一轮:基础构建与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)异步更新缓存
- 设置缓存过期时间作为兜底
更多推荐

所有评论(0)