互联网大厂Java面试实录:从JVM到微服务的真实问答

场景背景

某互联网大厂后端开发岗位,业务场景为电商+支付系统。面试官王工对候选人谢飞机的三轮面试。


第一轮提问:基础与框架篇

问题1:请简单介绍一下Spring Boot的核心特性?

谢飞机:嗯...就是那个...把spring配置简化了,不用xml了是吧?有个@SpringBootApplication注解,启动特别快,还内嵌Tomcat...

王工:(微笑点头)基本正确。能说说@SpringBootApplication这个组合注解包含了哪些吗?

谢飞机:呃...@ComponentScan, @EnableAutoConfiguration...还有啥来着?记不清了,反正就是自动配置嘛!

王工:很好,至少方向对了。继续——

问题2:Spring Boot的自动配置原理是什么?

谢飞机:这个...好像是读取配置文件,然后加载bean...具体怎么加载的我不太清楚...

王工:(皱眉)@EnableAutoConfiguration通过spring.factories机制加载,@ConditionalOnClass判断类是否存在...这些你都了解吗?

谢飞机:听说过spring.factories...但具体流程真的没研究过...

王工:嗯,回去多看看源码吧。下一个——

问题3:在电商场景中,如何保证下单时库存的一致性?

谢飞机:用数据库锁呗...悲观锁乐观锁什么的...或者加个redis缓存库存?

王工:可以,那如果并发很高怎么办?比如秒杀场景?

谢飞机:那就...加限流?Redis Lua脚本?这个我好像在哪见过代码...

王工:思路是对的。再深入一点——


第二轮提问:中间件与分布式篇

问题4:Kafka消息队列在订单系统中如何使用?

谢飞机:订单创建后发消息,消费者处理发货?应该是这样...

王工:那消息丢失或重复消费怎么处理?

谢飞机:设置ack机制...消费者手动提交offset...重复的话就幂等处理?

王工:不错。具体实现呢?

谢飞机:嗯...就是用@KafkaListener监听,然后事务控制?不太确定具体参数...

王工:(记录)继续——

问题5:微服务架构下,如何实现服务发现与负载均衡?

谢飞机:Nacos或者Eureka做注册中心,OpenFeign调用服务,Ribbon负载均衡...

王工:很好。那熔断降级怎么做?

谢飞机:Resilience4j或者Hystrix?配置超时时间,触发熔断...

王工:熔断后的fallback如何处理?

谢飞机:返回默认值?缓存数据?这个我没实际做过...

王工:明白。最后一个——

问题6:Redis在系统中主要承担什么作用?

谢飞机:缓存热点数据,分布式锁,计数器,会话存储...

王工:Redis持久化机制了解吗?

谢飞机:RDB和AOF...RDB是快照,AOF是日志...

王工:生产环境一般怎么配置?

谢飞机:混合模式吧...每秒同步一次?具体真没配置过...

王工:(点头)好,进入第三轮——


第三轮提问:性能优化与系统设计篇

问题7:线上CPU占用率飙高,如何排查?

谢飞机:top命令看进程,然后jstack分析线程状态?

王工:没错。如果是死循环或GC频繁呢?

谢飞机:jmap dump堆内存,MAT分析?GC日志看频率?

王工:不错。具体用什么工具监控?

谢飞机:Prometheus + Grafana?或者Arthas在线诊断?

王工:很好。继续——

问题8:MySQL慢SQL如何优化?

谢飞机:加索引,explain查看执行计划,避免select *,分页优化...

王工:索引失效的场景有哪些?

谢飞机:最左前缀原则,函数运算,类型转换...这个应该记得住...

王工:联合索引覆盖查询了解吗?

谢飞机:覆盖索引可以减少回表...但具体怎么设计还是不太清楚...

王工:嗯。最后一个——

问题9:设计一个日活千万级的商品详情页系统?

谢飞机:CDN加速静态资源,Redis缓存商品信息,分库分表,异步加载...

王工:缓存穿透、击穿、雪崩如何处理?

谢飞机:布隆过滤器防穿透,互斥锁防击穿,随机过期时间防雪崩...

王工:数据一致性如何保证?

谢飞机:双写策略?延迟双删?Canal监听Binlog?这个我真没搞过...

王工:好的,今天就到这里。


面试总结

王工:你的基础概念知道一些,但在深度和实战经验上还有欠缺。回去等通知吧。

谢飞机:好的谢谢王工!


详细答案与技术解析

一、Spring Boot自动配置详解

| 组件 | 说明 | |------|------| | @EnableAutoConfiguration | 启用自动配置 | | AutoConfigurationImportSelector | 导入自动配置类 | | spring.factories | 定义要加载的配置类 | | @Conditional系列 | 条件注解控制生效 |

关键点

@SpringBootApplication = 
    @SpringBootConfiguration + 
    @EnableAutoConfiguration + 
    @ComponentScan

二、库存一致性解决方案

方案对比

| 方案 | 优点 | 缺点 | |------|------|------| | 数据库乐观锁 | 简单 | 冲突率高 | | Redis Lua脚本 | 高性能 | 需保证原子性 | | 分布式锁 | 可靠性高 | 性能损耗 | | 预扣减库存 | 抗并发强 | 可能超卖 |

推荐实践:Redis预扣减 + 消息队列异步扣减数据库

三、Kafka消息可靠性保障

生产者:acks=all + retries=3 + enable.idempotence=true

消费者:手动提交offset + 幂等处理

消费重试:失败消息进入死信队列

四、微服务容错机制

熔断器状态机

  • Closed(正常)→ Open(熔断)→ Half-Open(恢复测试)

配置示例

resilience4j.circuitbreaker:
  instances:
    orderService:
      slidingWindowSize: 10
      failureRateThreshold: 50

五、Redis缓存策略

| 问题 | 解决方案 | |------|----------| | 缓存穿透 | 布隆过滤器 + 空值缓存 | | 缓存击穿 | 互斥锁 + 逻辑过期 | | 缓存雪崩 | 随机TTL + 多级缓存 | | 一致性 | Canal监听binlog + 延时双删 |

六、MySQL索引优化

最佳实践

  1. 遵循最左前缀原则
  2. 区分度高的字段建索引
  3. 避免在索引列上做计算
  4. 使用覆盖索引减少回表

执行计划关键字段

  • type: ALL > index > range > ref > eq_ref
  • rows: 越小越好
  • Extra: Avoiding where/Using index filesort

七、高并发系统架构

┌─────────────┐     ┌─────────────┐
│   CDN       │────▶│  前端集群    │
└─────────────┘     └─────────────┘
                          │
                    ┌─────▼─────┐
                    │  Nginx负载均衡│
                    └─────┬─────┘
                          │
          ┌───────────────┼───────────────┐
          ▼               ▼               ▼
    ┌──────────┐   ┌──────────┐   ┌──────────┐
    │ 应用节点 │   │ 应用节点 │   │ 应用节点 │
    └──────────┘   └──────────┘   └──────────┘
          │               │               │
          └───────────────┼───────────────┘
                          ▼
                  ┌─────────────┐
                  │ Redis集群   │
                  └─────────────┘
                          │
                          ▼
                  ┌─────────────┐
                  │ MySQL集群   │
                  └─────────────┘

给求职者的建议

  1. 基础要扎实:JVM、并发、集合必须精通
  2. 框架懂原理:不要只会用,要理解源码
  3. 实战经验:多做项目,积累踩坑经验
  4. 系统设计:学会画架构图,能说清优劣
  5. 持续学习:关注新技术,保持好奇心

本文根据真实面试经历改编,旨在帮助开发者更好地准备技术面试

更多推荐