Java大厂面试现场:Spring Boot + Kafka + Redis 实战问答全解析

53 阅读4分钟

面试官:谢飞机,欢迎来我们公司面试!

第一轮:基础构建与Web框架(场景:电商促销系统)

  1. 面试官:我们有个电商大促项目用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,尤其微服务多模块项目,编译速度优势明显。

第二轮:数据层与缓存(场景延续:商品秒杀)

  1. 面试官:秒杀场景下,如何用Redis防止超卖? 谢飞机:用SETNX抢锁!先设一个key,比如lock:product:1001,抢到了就查库存、减库存…… 面试官:那如果机器宕机没释放锁呢? 谢飞机:呃……我让程序崩溃前删锁! 面试官:应该用SET key value NX EX seconds原子操作,设置过期时间。另外,HikariCP连接池最大连接数怎么设? 谢飞机:默认10?不对……好像是100?我们项目没改过。 面试官:应设为数据库最大连接的80%,避免DB被打满。JPA和MyBatis你偏好哪个? 谢飞机:MyBatis!SQL自己写,调优方便。JPA……太重,生成的SQL看不懂。

第三轮:微服务与消息队列(场景:订单异步处理)

  1. 面试官:下单后要发短信、更新积分、推送到物流系统,怎么设计? 谢飞机:写三个service方法挨个调!不行……万一发短信失败,后面都不执行了。 面试官:那怎么办? 谢飞机:加个try-catch?或者……用事务? 面试官:考虑用Kafka解耦。订单服务发消息到topic,三个消费者各自处理,失败重试。 谢飞机:哦!消息队列!但我们公司用RabbitMQ…… 面试官:RabbitMQ也可以,但Kafka吞吐量更大,适合日志、事件流。最后问,Spring Cloud Alibaba里Nacos是干嘛的? 谢飞机:注册中心!还能配……配置中心? 面试官:正确。好了,今天就到这里,回家等通知吧。

【附录】问题详解:从小白到实战理解

场景背景:电商大促系统

涉及高并发、分布式事务、异步解耦、缓存一致性等典型难题。

技术点深度解析

  1. Spring Boot 自动配置原理

    • 原理:通过spring-boot-autoconfigure模块下的META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件,列出所有自动配置类。
    • 条件装配:使用@ConditionalOnClass@ConditionalOnMissingBean等注解按条件加载Bean。
    • 自定义Starter:创建autoconfigure模块和starter空模块,自动配置类加入.imports即可被发现。
  2. 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做前置拦截。
  3. Kafka 异步解耦订单流程

    • 架构优势:生产者-消费者模型,削峰填谷,系统间无直接依赖。
    • 流程:
      1. 订单服务 → Kafka Topic order.created
      2. 短信服务消费 → 发送短信
      3. 积分服务消费 → 增加用户积分
      4. 物流服务消费 → 创建运单
    • 可靠性:开启ACK机制、副本同步、消费者手动提交offset。
  4. HikariCP 连接池配置

    • 关键参数:
      • maximumPoolSize: 通常设为 (CPU核心数 * 2) 或 DB最大连接的80%
      • connectionTimeout: 30s
      • idleTimeout: 600s
      • maxLifetime: 小于数据库自动断连时间
    • 监控:集成Micrometer暴露指标到Prometheus。
  5. MyBatis vs JPA

    • MyBatis:SQL完全可控,适合复杂查询、性能敏感场景。
    • JPA:面向对象,快速开发,但复杂关联易生成低效SQL,需谨慎使用@EntityGraph优化。
  6. Nacos 在微服务中的角色

    • 服务注册与发现:替代Eureka,支持AP/CP模式切换。
    • 配置中心:动态推送配置变更,无需重启服务。
    • 命名空间+分组实现多环境隔离。

总结

本次面试围绕“电商大促”真实业务展开,从Spring Boot起步,深入Redis防超卖、Kafka异步化、微服务治理等核心技术。建议开发者不仅要会用框架,更要理解其背后的设计思想与落地细节。只有结合场景思考,才能在面试中脱颖而出。