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


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

欢迎加入小哈的星球,你将获得:专属的实战项目(4个项目都能学) / 1v1 提问 / 简历修改 / Java 学习路线 / 社群讨论 / 学习打卡 / 每月赠书

  • 《Spring AI 项目实战(问答机器人、RAG 智能客服、联网搜索)》已完结,基于 Spring AI + Spring Boot 3.x + JDK 21...查看介绍

  • 《从零手撸:仿小红书(微服务架构)》 已完结,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...查看介绍;演示链接:http://116.62.199.48:7070/

  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接:http://116.62.199.48/

  • 新开坑项目:《从零手撸:秒杀系统高并发优化实战》 正在更新中...,查看介绍

截止目前,星球内专栏累计输出 150w+ 字,讲解图 5110+ 张,还在持续爆肝中.. 后续还会上新更多项目,已有 4700+ 小伙伴加入学习,欢迎点击围观

面试考察点

  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

常见面试变体

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

记忆口诀

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

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

总结

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