面试自述:从单体到微服务的实践之路

在最近的项目中,我负责从零搭建一个基于 Spring Boot + Dubbo + Redis + RocketMQ 的分布式微服务系统。整个项目大约持续一个多月,代码量较大,是我第一次完整实践从后端架构设计到部署上线的全过程。


1. 自我介绍

2. 项目介绍

3. 为什么要做微服务?

做微服务的核心原因是为了解耦与扩展性 。单体项目后期难以维护,功能耦合严重、部署困难、影响面大。 ​编辑

微服务将系统拆分成多个独立模块(如用户、订单、支付、库存等),每个服务可以独立开发、独立部署、独立扩展 ,提升了系统的灵活性和可靠性。 ​编辑


4. 为什么用 Dubbo?

选择 Dubbo 是因为它在高性能 RPC 通信服务治理能力 上表现优秀。

它相比 HTTP REST 接口更高效,支持负载均衡、服务注册与发现、容错机制等。

另外,在公司或校园内网环境中,Dubbo 的**注册中心(Zookeeper 或 Nacos)**让服务发现更加方便稳定。


5. 为什么分为四个服务?

我将项目拆分为四个服务(例如:用户服务、商品服务、订单服务、支付服务),主要基于**领域驱动设计(DDD)**的思想。

拆分的原则是:高内聚、低耦合。每个服务都聚焦于自己的一部分业务逻辑,这样可以方便后期扩展与维护。


6. 谈谈 Spring Cloud

Spring Cloud 是另一套微服务解决方案,相比 Dubbo 更偏向 HTTP + Spring Boot 全家桶的生态,比如使用 Eureka、Ribbon、Feign、Gateway、Hystrix 等组件。

我了解 Spring Cloud 的核心思想:它通过标准化组件来实现服务注册、配置中心、负载均衡和链路追踪等功能。

如果是互联网项目,Spring Cloud 更适合;而 Dubbo 更适合高性能 RPC 的企业内部系统。


7. 为什么项目里面自己没有用多线程?

项目初期主要是 I/O 密集型操作(数据库、网络通信),Spring 框架内部已经做了线程池和异步优化,因此我没有手动创建线程,避免资源竞争和管理复杂性。


8. 哪些地方用了多线程?

在异步消息处理和缓存预热部分用到了多线程:

  • RocketMQ 消费者中使用线程池并发处理消息。
  • Redis 缓存预热 时用多线程异步加载数据,加快启动速度。 编辑

9. 在遇到什么困难的情况下用了 Redis?

项目初期数据库访问压力大,响应速度慢。我引入 Redis 缓存 来解决性能瓶颈。

具体使用场景包括:

  • 热点数据缓存(如热门商品、用户登录信息)
  • 分布式锁(防止超卖)
  • 延迟队列与排行榜功能

Redis 的高并发读写能力显著提升了系统性能。


10. 为什么用 RocketMQ?

RocketMQ 主要用于异步解耦与削峰填谷

例如,订单创建后异步发送库存扣减消息,避免主线程阻塞,提高系统吞吐量。

它支持事务消息和高可靠性投递机制,比 RabbitMQ 更适合大规模分布式场景。 ​编辑


11. 为什么不用 2PC、3PC、TCC?

这些属于强一致性事务方案 ,实现复杂、性能开销大。

我使用了 RocketMQ 的最终一致性事务消息机制,在业务层通过状态回查保证可靠性,既满足一致性要求又兼顾性能。


12. 你1个多月做这个项目,怎么做完的?

坦白说,我几乎是靠高强度学习和熬夜赶出来的

我每天学习新技术(Dubbo、MQ、Redis 等),白天设计架构、晚上编码调试。

虽然辛苦,但过程极大提升了我对分布式系统的理解。


13. 项目上线了吗?用什么方案部署的?了解热部署吗?

项目已上线测试环境,使用 Docker + Nginx + Jenkins 实现 CI/CD 自动化部署。

我了解**热部署(Hot Deployment)**的概念------在不重启服务的情况下更新代码或配置。

开发阶段用 Spring DevTools ,生产环境通过 容器滚动更新 实现热部署效果。 ​编辑


14. 为什么没有实习?

因为我在这段时间专注于完成自己的技术项目,希望通过实战掌握后端架构核心能力。

相比短期实习,我认为做出一个完整项目更能展示真实能力。 ​编辑


15. 给我讲一下 GC 的所有垃圾回收器

JVM 的 GC 分为两类:

  • 年轻代回收器:Serial、ParNew、Parallel Scavenge
  • 老年代回收器:Serial Old、Parallel Old、CMS、G1

不同回收器侧重点不同:

  • Serial 单线程简单高效,适合小内存。
  • Parallel GC 注重吞吐量。
  • CMS 注重低延迟。
  • G1 综合性能最佳,支持分区化内存管理。

16. G1 是什么版本出来的?

G1(Garbage First) 垃圾回收器是在 JDK 7u4 正式引入,在 JDK 9 中成为默认 GC。


17. 给我讲讲 Redis 的五大结构底层结构(尤其是跳跃表) ​编辑

Redis 的五大数据结构与底层实现:

  1. String:SDS(简单动态字符串)
  2. List:双向链表或压缩列表(QuickList)
  3. Hash:哈希表 + 压缩列表
  4. Set:整数集合或哈希表
  5. ZSet(有序集合)跳跃表(SkipList)+ 哈希表

其中跳跃表是一种平衡数据结构,通过多层索引实现 O(log n) 查找效率,既简洁又高效。 ​编辑


✅ 总结

这个项目让我真正理解了微服务架构、分布式通信、缓存优化、消息解耦等核心技术,也锻炼了独立解决复杂问题的能力。从零搭建到部署上线,是一次真正意义上的成长过程。

相关推荐
Moment4 小时前
面经分享——字节前端一面
前端·javascript·面试
XXX-X-XXJ5 小时前
Django 用户认证流程详解:从原理到实现
数据库·后端·python·django·sqlite
胡桃姓胡,蝴蝶也姓胡9 小时前
Rag优化 - 如何提升首字响应速度
后端·大模型·rag
roykingw12 小时前
【思想比实现更重要】高并发场景下如何保证接口幂等性
java·web安全·面试
尘觉13 小时前
面试-浅复制和深复制?怎样实现深复制详细解答
javascript·面试·职场和发展
紫荆鱼13 小时前
设计模式-命令模式(Command)
c++·后端·设计模式·命令模式
编码追梦人13 小时前
深耕 Rust:核心技术解析、生态实践与高性能开发指南
开发语言·后端·rust
朝新_14 小时前
【SpringBoot】详解Maven的操作与配置
java·spring boot·笔记·后端·spring·maven·javaee
绝无仅有14 小时前
某教育大厂面试题解析:MySQL索引、Redis缓存、Dubbo负载均衡等
vue.js·后端·面试