面试官:你好,请坐。今天我们围绕电商场景下的高并发系统设计来聊一聊。


第一轮:基础构建与Web框架

Q1:如果让你用Spring Boot搭建一个商品详情页服务,你会怎么规划项目结构?依赖如何管理?

谢飞机:呃……我一般就新建个Spring Boot项目,加个spring-boot-starter-web,然后写个Controller返回JSON。依赖?Maven自动下载啊!

面试官(点头):不错,至少知道Maven。那你知道为什么选Spring Boot而不是传统Spring MVC吗?

谢飞机:因为……不用配XML?启动快?还能打成jar包直接跑!

面试官(笑):算答对一半。Spring Boot的核心是约定优于配置,内嵌Tomcat,简化部署。你提到的jar包方式正是spring-boot-maven-plugin打包的结果。

Q2:商品详情页需要静态资源(如图片、JS),你怎么处理?

谢飞机:放resources/static下呗,Spring Boot默认支持!

面试官:如果要CDN加速呢?

谢飞机:那……我把图片上传到阿里云OSS,前端引用链接就行!

面试官:还行,至少知道解耦。

Q3:如果页面访问量突增,比如秒杀活动,你担心什么?

谢飞机:怕服务器崩……CPU爆了?

面试官:更具体点?

谢飞机:呃……数据库被查死了?

面试官:接近了。


第二轮:缓存与数据库优化

Q4:既然担心数据库压力,如何用Redis缓解商品信息查询压力?

谢飞机:把商品数据放到Redis里!每次先查Redis,没有再查数据库,再放进去!

面试官:这个模式叫什么?

谢飞机:缓存……穿透?

面试官:那是异常情况。你说的是“缓存命中”或“缓存旁路”。正确的模式是Cache-Aside。

谢飞机:哦对!就是那个……查缓存,没命中读库,回填缓存!

面试官:那缓存穿透怎么办?

谢飞机:穿……穿透?那就是查不存在的数据呗,我可以用布隆过滤器挡一下!

面试官:很好!那缓存雪崩呢?

谢飞机:雪崩?是不是大量缓存同时失效?我可以给TTL加随机值,错开过期时间!

面试官:不错,有准备。那缓存击穿呢?

谢飞机:击穿……好像是热点key过期,瞬间大量请求打到数据库……我可以用互斥锁,比如Redis的SETNX……

面试官:可以,但注意分布式环境下要用Redlock或Redisson。

Q5:MyBatis和JPA你更倾向哪个?为什么?

谢飞机:我用MyBatis!SQL自己写,灵活!JPA太自动了,生成的SQL看不懂……

面试官:在电商这种复杂查询场景,确实MyBatis更适合。但记得用<resultMap>避免N+1问题。


第三轮:微服务与高可用设计

Q6:如果商品服务独立为微服务,订单服务要调用它,你用什么技术?

谢飞机:用Feign!Spring Cloud OpenFeign,声明式客户端,方便!

面试官:如果商品服务挂了,订单服务一直等会怎样?

谢飞机:会……超时?阻塞?

面试官:可能导致线程池耗尽。怎么防?

谢飞机:加熔断!Hystrix!或者Resilience4j!

面试官:现在主流是哪个?

谢飞机:Hystrix停更了……用Resilience4j吧,轻量,函数式编程风格!

面试官:很好。

Q7:服务注册与发现你了解吗?

谢飞机:用Eureka!服务启动后注册,消费者从Eureka拉列表,再负载均衡……

面试官:如果Eureka挂了呢?

谢飞机:呃……Eureka是AP系统,自我保护机制,还能撑一阵……不过现在都用Nacos或Consul了吧?

面试官:有眼界。

Q8:部署在Kubernetes上,服务间调用怎么做?

谢飞机:用K8s Service做内部路由,配合Ingress暴露外部……Feign还是能用,底层走ClusterIP!

面试官:可以。


面试官总结

面试官:今天问得不错,你对Spring Boot、Redis缓存、微服务调用链有基本理解,虽然有些概念混淆,但学习态度在线。这样吧,你回去等通知,HR会联系你。

谢飞机:好嘞!那我先去楼下买杯咖啡压压惊……


✅ 详细解析:电商高并发场景下的技术实现路径

业务场景背景

电商平台中,商品详情页是高频访问入口,尤其在促销期间可能面临每秒数万请求。需保障响应速度、系统稳定性和数据一致性。

1. 技术选型逻辑
  • Spring Boot:快速构建独立运行的服务,集成Web、缓存、数据库等模块。
  • Maven:标准化依赖管理,确保团队构建一致性。
  • Redis + Cache-Aside模式
    • 流程:GET → Redis → Miss → DB → Set Redis
    • 防护策略:
      • 缓存穿透:布隆过滤器拦截非法ID
      • 缓存雪崩:TTL + 随机偏移(如30min ± 5min)
      • 缓存击穿:热点key加互斥锁(Redisson.getLock)
2. 数据库与ORM选择
  • MyBatis:适合复杂SQL场景,便于DBA审核与优化。
  • 使用<resultMap>关联查询,避免循环查库导致N+1问题。
3. 微服务架构设计
  • OpenFeign:声明式HTTP客户端,降低调用成本。
  • Resilience4j:实现熔断、降级、限流,防止故障扩散。
  • Eureka/Nacos:服务注册中心,实现动态发现与健康检查。
  • Kubernetes:容器编排,提供Service网络模型,支撑微服务通信。
4. 高可用保障
  • 日志:Logback + ELK收集分析
  • 监控:Prometheus抓取指标,Grafana展示QPS、延迟、错误率
  • 链路追踪:Jaeger记录跨服务调用链路
5. CI/CD流程
  • Git提交 → Jenkins/GitLab CI构建 → Docker镜像 → 推送仓库 → K8s滚动更新

总结

本次面试覆盖了Java电商系统的典型技术栈:从Spring Boot起步,深入缓存设计,再到微服务治理,层层递进。建议开发者不仅要会用框架,更要理解其背后的设计思想与容错机制。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐