什么是微服务?它带来哪些挑战?

一则或许对你有用的小广告

欢迎 加入小哈的星球 ,你将获得: 专属的项目实战(已更新的所有项目都能学习) / 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/

面试考察点

  1. 架构认知:面试官不仅仅是想知道你能不能背出微服务的定义,更是想知道你是否理解微服务架构出现的背景,以及它解决了单体架构的什么痛点。
  2. 全局视野:考察你是否清楚微服务在带来好处的同时,也引入了大量复杂的分布式问题——只会说好处、不说挑战,说明理解不够深入。
  3. 实践意识:考察你在真实项目中是否踩过微服务的坑,对服务治理、链路追踪、配置管理等是否有实战经验。

核心答案

微服务是一种架构风格,将一个大型单体应用拆分为多个小型、独立部署的服务,每个服务围绕特定业务能力构建,拥有自己独立的数据库,服务之间通过轻量级通信机制(通常是 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

面试高频追问

  1. 微服务和 SOA 有什么区别?
    • 微服务是 SOA 的演进,去掉了沉重的 ESB,强调独立部署和轻量通信,更加细粒度
  2. 什么情况下不适合用微服务?
    • 团队小(少于 10 人)、业务初期需求不明确、没有完善的 DevOps 基础设施
  3. 微服务之间如何通信?
    • 同步调用(OpenFeign / REST)和异步消息(RocketMQ / Kafka),各有适用场景
  4. 如何保证微服务的数据一致性?
    • 最终一致性 + 消息队列 + 补偿机制,强一致性用 Seata

常见面试变体

  • "微服务架构的优缺点是什么?"
  • "单体架构和微服务架构怎么选?"
  • "你们项目为什么要用微服务?"
  • "微服务的服务拆分原则是什么?"

记忆口诀

微服务挑战六字诀通信、一致、运维、治理、配置、边界

通信要熔断,一致靠最终,运维要基建,治理靠注册,配置要集中,边界按领域。

总结

微服务是将单体应用按业务能力拆分为独立部署的小服务,解决了单体架构的扩展性和开发效率问题,但同时引入了分布式通信、数据一致性、运维复杂度、服务治理等一系列挑战。微服务不是银弹,需要根据团队规模、业务复杂度和基础设施成熟度来决定是否采用。