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

作者:360_go_php日期:2025/10/28

在最近的项目中,我负责从零搭建一个基于 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) 查找效率,既简洁又高效。 ​编辑


✅ 总结

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


面试自述:从单体到微服务的实践之路》 是转载文章,点击查看原文


相关推荐


Redis(82)如何解决Redis的缓存雪崩问题?
Victor3562025/10/25

缓存雪崩的概念 缓存雪崩(Cache Avalanche)指的是在某一时刻大量缓存数据同时过期或者缓存服务器宕机,导致大量请求直接打到数据库,从而使数据库瞬时压力剧增,甚至可能导致数据库崩溃。 解决缓存雪崩问题的方法 为了解决缓存雪崩问题,可以采取以下策略: 缓存数据的过期时间设置为随机值:避免在同一时间大量缓存数据同时失效。 加锁或队列:在缓存失效时,通过机制控制对数据库的访问,避免大量请求同时打到数据库。 双写策略:更新缓存的同时也更新数据库,保证数据的一致性。 数据预热:在系统启动时,预


猿辅导MySQL面试常见问题解析(一)
360_go_php2025/10/23

​ 在进行MySQL相关的面试时,尤其是在如猿辅导这样注重技术底层实现的公司,面试官往往会问一些关于数据库优化、事务管理、锁机制等方面的问题。以下是一些常见的MySQL面试问题及其详细解答,帮助你更好地准备面试。​编辑 1. MySQL建立索引的原则​编辑 在MySQL中,索引是提升查询性能的重要工具。然而,索引虽然能加速查询,但也会占用额外的空间,并且会影响写操作的性能。因此,建立索引时需要遵循一些原则: 选择性高的列:选择性高的列,指的是该列的唯一值多,数据分布较为均匀。对于这些列建立索


Swift 字符串与字符完全导读(二):Unicode 视图、索引系统与内存陷阱
unravel20252025/10/22

Unicode 的三种编码视图 Swift 把同一个 String 暴露成 4 种迭代方式: 视图元素类型单位长度典型用途StringCharacter人眼“一个字符”业务逻辑utf8UInt81~4 字节网络/文件 UTF-8 流utf16UInt162 或 4 字节与 Foundation / Objective-C 交互unicodeScalarsUnicodeScalar21-bit精确到标量,做编码分析 代码一览 l


AWS EKS 集成Load Balancer Controller 对外暴露互联网可访问API [AWS 中国宁夏区]
thinktik2025/10/20

本文主要介绍AWS EKS和AWS Elastic Load Balancing的集成;我们可以通过AWS ELB将运行在EKS中的服务暴露出去,供互联网访问。 AWS ELB提供的负载均衡,高可用,按流量自动弹性和自带的安全性服务(比如基础版的AWS Shield)给为我们的网络服务提供了高质量的保证。虽然我们也可以直接让K8S Service服务直接以public ip的方式来对外服务,但是一般技术和成本等综合来考虑不如AWS ELB。 如下图,AWS ELB充当运行在AWS上的动态API服


AI环境下的网络安全人才的发展方向
Mr_Meng_De2025/10/19

2025年9月16日,2025年国家网络安全宣传周分论坛上发布《AI时代网络安全产业人才发展报告(2025)》。 《报告》由工业和信息化部教育与考试中心、安恒信息、中国联合网络通信有限公司软件研究院、全国数字安全行业产教融合共同体、中国网络空间新兴技术安全创新论坛、智联招聘、中国网络空间安全人才教育论坛联合编制。 AI驱动网络安全领域岗位革新与挑战升级 随着人工智能技术与网络安全行业的深度融合,当代大学生对这一技术变革带来的就业影响形成了较为全面的认知。约三分之一(33.5%)的学生表现出


策略模式:让算法选择像点菜一样简单
太过平凡的小蚂蚁2025/10/18

什么是策略模式? ​策略模式(Strategy Pattern)​​ 是一种行为设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以相互替换。策略模式让算法的变化独立于使用算法的客户端。 简单来说:​定义策略家族,让客户端自由选择。​​ 现实世界类比 想象你去餐厅吃饭: ​策略接口​:点菜这个行为 ​具体策略​:中餐、西餐、日料等不同菜系 ​上下文​:餐厅(提供点菜环境) ​客户端​:你(根据心情选择今天吃什么) 模式结构 classDiagra


VSCODE GDB调试
Gary Studio2025/10/16

流程 1.首先点击左侧的小虫子按钮 2.选择gdb调试 3.在program一栏填上你需要调试的可执行文件 注意:编译的时候记得在编译命令的最后或者在前面的语句中添加-g 增加调试的选项 例如下面 PS D:\CODE\c> gcc .\04_example2.c -o .\04_example2 -g 4.在需要调试的代码打上断点即可开启运行。 补充 有时候运行不起来有可能是没有安装gdb或者是gdb的环境变量没有配置造成的 验证gdb是否安装 输入以下指令


SpringBoot实现JWT动态密钥轮换
风象南2025/10/15

背景:为什么 JWT 密钥也要"轮换" JWT(JSON Web Token) 是当代认证体系的常用方案, 无论是单体系统、微服务、还是前后端分离登录,几乎都会用到它。 但在大多数系统里,签名密钥往往是一成不变的—— 一旦生成,常年不换,代码里写死或放在配置文件中。 这其实非常危险: 一旦密钥被误传或泄露,攻击者就能伪造任意用户的合法 Token 无论是测试环境误配置,还是日志误打出 key,都可能导致密钥泄露,带来安全隐患 于是我们面临一个工程问题: "如何能动态更新 JWT 签名密钥,


从Java集合到云原生现代数据管理的演进之路
kkjt01302025/10/14

从Java集合到云原生现代数据管理的演进之路在软件开发的漫长历程中,数据管理技术的演进一直是推动应用架构变革的核心动力。从最初在单一应用内存中操作的Java集合,到今天跨越全球分布式环境的云原生数据平台,这条路不仅反映了技术的飞跃,更体现了我们对数据处理能力、规模和敏捷性不断增长的需求。这一演进是渐进而深刻的,每一步都为了解决特定时代的核心挑战。Java集合:单机时代的基石Java集合框架(Java Collections Framework, JCF)是早期Java应用数据管理的基石。它以Li


如何为Spring Cloud Gateway配置具体的负载均衡策略?
IT橘子皮2025/10/12

以下是针对 ​Spring Cloud Gateway​ 配置具体负载均衡策略(如加权轮询、最小连接数等)的详细指南,结合最新技术文档和最佳实践: 一、基础配置与依赖 1. ​引入依赖​ 确保项目中已包含 Spring Cloud Gateway 和负载均衡器(Spring Cloud LoadBalancer)的依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cl

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0