什么是微服务?它带来哪些挑战?
一则或许对你有用的小广告
欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新开坑项目: 《Spring AI 项目实战(问答机器人、RAG 增强检索、联网搜索)》 正在持续爆肝中,基于
Spring AI + Spring Boot3.x + JDK 21..., 点击查看; - 《从零手撸:仿小红书(微服务架构)》 已完结,基于
Spring Cloud Alibaba + Spring Boot3.x + JDK 17..., 点击查看项目介绍; 演示链接: http://116.62.199.48:7070/; - 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/
面试考察点
- 架构认知:面试官不仅仅是想知道你能不能背出微服务的定义,更是想知道你是否理解微服务架构出现的背景,以及它解决了单体架构的什么痛点。
- 全局视野:考察你是否清楚微服务在带来好处的同时,也引入了大量复杂的分布式问题——只会说好处、不说挑战,说明理解不够深入。
- 实践意识:考察你在真实项目中是否踩过微服务的坑,对服务治理、链路追踪、配置管理等是否有实战经验。
核心答案
微服务是一种架构风格,将一个大型单体应用拆分为多个小型、独立部署的服务,每个服务围绕特定业务能力构建,拥有自己独立的数据库,服务之间通过轻量级通信机制(通常是 HTTP REST 或消息队列)进行协作。
一句话概括:把一个大系统拆成一堆小系统,各自独立开发、独立部署、独立运行,通过 API 互相通信。
微服务带来的主要挑战:
| 挑战领域 | 核心问题 | 复杂度 |
|---|---|---|
| 服务治理 | 服务如何注册、发现、路由、负载均衡 | ⭐⭐⭐ |
| 分布式通信 | 网络延迟、超时、重试、熔断降级 | ⭐⭐⭐⭐ |
| 数据一致性 | 跨服务事务、最终一致性保障 | ⭐⭐⭐⭐⭐ |
| 运维复杂度 | 部署、监控、日志、链路追踪 | ⭐⭐⭐⭐ |
| 配置管理 | 多服务配置统一管理和动态刷新 | ⭐⭐⭐ |
| 团队协作 | 服务边界划分、API 版本管理 | ⭐⭐⭐ |
深度解析
一、单体架构 vs 微服务架构
上图展示了单体架构到微服务架构的演进。核心变化:
- 从 "一个应用" 变成 "多个服务":每个服务独立进程、独立部署
- 从 "共享数据库" 变成 "每个服务独享数据库":避免数据层耦合
- 从 "方法调用" 变成 "网络通信":服务间通过 RPC 交互
二、微服务带来的核心挑战
挑战 1:分布式通信问题
单体架构中,模块之间是方法调用,可靠且快速。微服务中,服务间是网络通信,会面临:
- 网络延迟:原来本地方法调用是微秒级,现在变成毫秒甚至秒级
- 网络不可靠:调用可能超时、失败,需要重试机制
- 服务不可用:下游服务挂了,上游不能跟着一起挂
解决方案:引入熔断降级(如 Sentinel、Hystrix)、超时重试、限流等机制。
挑战 2:数据一致性
这是微服务最难的问题。举个例子:
用户下单 → 需要调用库存服务扣库存 → 调用支付服务扣款 → 调用订单服务创建订单
这三个操作分别在三个服务中,各自有独立的数据库,没法用传统的数据库事务来保证一致性。
解决方案:
- 最终一致性:通过消息队列 + 本地消息表实现
- Saga 模式:将长事务拆成多个本地事务,通过补偿机制回滚
- Seata:阿里开源的分布式事务框架
挑战 3:运维复杂度爆炸
单体应用部署一个 jar 包就行了,微服务呢?
-
一个系统可能有 几十甚至上百个服务
-
每个服务需要独立部署、独立扩缩容
-
出了问题需要链路追踪才能定位是哪个服务导致的
上图展示了微服务架构下需要的基础设施组件。可以看到,微服务的"技术代价"非常大,这也是为什么小团队不建议一上来就搞微服务。
挑战 4:服务边界划分
怎么拆服务?拆大了等于没拆,拆小了服务数量爆炸,服务间调用链路过长。
常见原则:
- 按业务领域拆分(DDD 领域驱动设计)
- 高内聚低耦合:频繁交互的逻辑放在同一个服务
- 避免分布式单体:服务拆了但数据库没拆,等于白拆
三、Spring Cloud 生态如何应对这些挑战
| 挑战 | Spring Cloud 解决方案 |
|---|---|
| 服务注册与发现 | Nacos / Eureka |
| 配置管理 | Nacos Config / Spring Cloud Config |
| 服务间调用 | OpenFeign / RestTemplate + LoadBalancer |
| 熔断降级 | Sentinel / Resilience4j |
| API 网关 | Spring Cloud Gateway |
| 链路追踪 | Micrometer Tracing + Zipkin |
面试高频追问
- 微服务和 SOA 有什么区别?
- 微服务是 SOA 的演进,去掉了沉重的 ESB,强调独立部署和轻量通信,更加细粒度
- 什么情况下不适合用微服务?
- 团队小(少于 10 人)、业务初期需求不明确、没有完善的 DevOps 基础设施
- 微服务之间如何通信?
- 同步调用(OpenFeign / REST)和异步消息(RocketMQ / Kafka),各有适用场景
- 如何保证微服务的数据一致性?
- 最终一致性 + 消息队列 + 补偿机制,强一致性用 Seata
常见面试变体
- "微服务架构的优缺点是什么?"
- "单体架构和微服务架构怎么选?"
- "你们项目为什么要用微服务?"
- "微服务的服务拆分原则是什么?"
记忆口诀
微服务挑战六字诀:通信、一致、运维、治理、配置、边界
通信要熔断,一致靠最终,运维要基建,治理靠注册,配置要集中,边界按领域。
总结
微服务是将单体应用按业务能力拆分为独立部署的小服务,解决了单体架构的扩展性和开发效率问题,但同时引入了分布式通信、数据一致性、运维复杂度、服务治理等一系列挑战。微服务不是银弹,需要根据团队规模、业务复杂度和基础设施成熟度来决定是否采用。