面试官:谢飞机,欢迎来我们公司面试!
第一轮:基础构建与Web框架(场景:电商促销系统)
- 面试官:我们有个电商大促项目用Spring Boot开发,你说说自动配置原理?
谢飞机:哦这个我知道!是
@SpringBootApplication里的@EnableAutoConfiguration,它会扫描META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件加载自动配置类。 面试官:不错,那如果我想自定义一个Starter,该怎么做? 谢飞机:嗯……建个spring-boot-starter-xxx,加个META-INF/spring.factories……啊不是,现在是.imports了,然后写个自动配置类注册Bean。 面试官:很好,有关注版本变化。那Maven和Gradle你更推荐哪个?为什么? 谢飞机:我用Maven多,XML看着踏实。但听说Gradle快,DSL也简洁,就是……不太熟。 面试官:生产环境建议用Gradle,尤其微服务多模块项目,编译速度优势明显。
第二轮:数据层与缓存(场景延续:商品秒杀)
- 面试官:秒杀场景下,如何用Redis防止超卖?
谢飞机:用
SETNX抢锁!先设一个key,比如lock:product:1001,抢到了就查库存、减库存…… 面试官:那如果机器宕机没释放锁呢? 谢飞机:呃……我让程序崩溃前删锁! 面试官:应该用SET key value NX EX seconds原子操作,设置过期时间。另外,HikariCP连接池最大连接数怎么设? 谢飞机:默认10?不对……好像是100?我们项目没改过。 面试官:应设为数据库最大连接的80%,避免DB被打满。JPA和MyBatis你偏好哪个? 谢飞机:MyBatis!SQL自己写,调优方便。JPA……太重,生成的SQL看不懂。
第三轮:微服务与消息队列(场景:订单异步处理)
- 面试官:下单后要发短信、更新积分、推送到物流系统,怎么设计? 谢飞机:写三个service方法挨个调!不行……万一发短信失败,后面都不执行了。 面试官:那怎么办? 谢飞机:加个try-catch?或者……用事务? 面试官:考虑用Kafka解耦。订单服务发消息到topic,三个消费者各自处理,失败重试。 谢飞机:哦!消息队列!但我们公司用RabbitMQ…… 面试官:RabbitMQ也可以,但Kafka吞吐量更大,适合日志、事件流。最后问,Spring Cloud Alibaba里Nacos是干嘛的? 谢飞机:注册中心!还能配……配置中心? 面试官:正确。好了,今天就到这里,回家等通知吧。
【附录】问题详解:从小白到实战理解
场景背景:电商大促系统
涉及高并发、分布式事务、异步解耦、缓存一致性等典型难题。
技术点深度解析
-
Spring Boot 自动配置原理
- 原理:通过
spring-boot-autoconfigure模块下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,列出所有自动配置类。 - 条件装配:使用
@ConditionalOnClass、@ConditionalOnMissingBean等注解按条件加载Bean。 - 自定义Starter:创建
autoconfigure模块和starter空模块,自动配置类加入.imports即可被发现。
- 原理:通过
-
Redis 防止超卖(秒杀核心)
- 方案:使用Lua脚本或Redisson分布式锁保证原子性。
- 推荐做法:
SET product_stock_1001 100 EX 3600 # 初始化库存 EVAL "if redis.call('get', KEYS[1]) > 0 then return redis.call('decr', KEYS[1]) else return 0 end" 1 product_stock_1001 - 结合数据库最终扣减,Redis做前置拦截。
-
Kafka 异步解耦订单流程
- 架构优势:生产者-消费者模型,削峰填谷,系统间无直接依赖。
- 流程:
- 订单服务 → Kafka Topic
order.created - 短信服务消费 → 发送短信
- 积分服务消费 → 增加用户积分
- 物流服务消费 → 创建运单
- 订单服务 → Kafka Topic
- 可靠性:开启ACK机制、副本同步、消费者手动提交offset。
-
HikariCP 连接池配置
- 关键参数:
maximumPoolSize: 通常设为(CPU核心数 * 2)或 DB最大连接的80%connectionTimeout: 30sidleTimeout: 600smaxLifetime: 小于数据库自动断连时间
- 监控:集成Micrometer暴露指标到Prometheus。
- 关键参数:
-
MyBatis vs JPA
- MyBatis:SQL完全可控,适合复杂查询、性能敏感场景。
- JPA:面向对象,快速开发,但复杂关联易生成低效SQL,需谨慎使用
@EntityGraph优化。
-
Nacos 在微服务中的角色
- 服务注册与发现:替代Eureka,支持AP/CP模式切换。
- 配置中心:动态推送配置变更,无需重启服务。
- 命名空间+分组实现多环境隔离。
总结
本次面试围绕“电商大促”真实业务展开,从Spring Boot起步,深入Redis防超卖、Kafka异步化、微服务治理等核心技术。建议开发者不仅要会用框架,更要理解其背后的设计思想与落地细节。只有结合场景思考,才能在面试中脱颖而出。