面试记录 2026-09-27
题目:什么是微服务架构?优势?特点?
难度:low
标签:arch/microservice, general/knowledge
评分:⭐⭐⭐☆☆(3/5)
我的回答
微服务架构是一个演变的过程。最初大家的架构基本上都是单体的,一个服务支撑所有的事情。但是发现单个的机器存在上限,然后就做了横向的扩容,做分布式,由多台机器同时提供服务,然后实现可以实现承担更多的流量,更高的并发。但是后来发现这种横向的并发存在一些问题。首先,所有的服务都集中到一起,我只想扩容某一点的时候,这时候并不容易。我只想扩容某一点,但是不想扩容其他的时候,无法直接进行,需要把整体的全部去聚合到一起,再扩一份出来。这造成了资源浪费。后续一方面为了更好的扩充资源,一方面为了有使用到不同语言的优势,做了微服务,将原有的服务拆分成多份,分别部署。比如 A 服务用部署 10 份,B 服务可能就部署 2 份,最终构建一组服务去进行对外提供能力;
微服的优势就是更好扩展,性能上其实也是更好的。但是延伸的问题就是它的复杂度太高了。如果区分不好,可能会产生,要么是大量的服务聚在一起,没有划分出合理的内容,要么就是拆分太细,导致资源的浪费。
点评
优点:
- 架构演变脉络讲得对:单体 → 单机上限 → 横向扩容 → 独立扩缩容需求 → 微服务,这是很真实的演进过程
- 抓到"独立扩缩容"这个核心动因,A 部署 10 份 B 部署 2 份的举例很直观
- 提到"多语言"是微服务的一个次要优势
- 有反思意识,说到"拆得太细也是问题"
不足:
- "性能更好"这个结论有问题:微服务间是 RPC/HTTP 网络调用,比单体内的方法调用慢很多,通常性能是更差的。微服务赢在可扩展性、隔离性、团队敏捷性,不是单机性能
- 特点层面缺少关键要素:独立部署、独立数据库(去中心化数据)、轻量通信(REST/gRPC)、去中心化治理、围绕业务能力组织、DevOps/CI/CD 配套
- 优势层面缺少关键要素:故障隔离、技术异构、团队独立、按需扩展、灰度发布友好
- 没有提到 CAP/BASE 权衡、分布式一致性难题
- "多语言"这个优势在实践里很罕见,90% 微服务体系都是 Java/Go 单栈为主
补充:
- 围绕业务能力构建服务
- 组织围绕服务(Conway's Law)
- 去中心化治理(技术选型自治)
- 去中心化数据管理(每个服务自己 DB)
- 基础设施自动化(CI/CD)
- 面向设计演进(设计失败、优雅废弃)
- 轻量通信(HTTP/gRPC/消息)
- 主要优势:独立部署、故障隔离、按需扩缩容、多团队并行开发、技术栈演进灵活、灰度/蓝绿发布友好
- 主要代价:分布式复杂性(网络分区、超时重试、幂等)、分布式事务(2PC/TCC/SAGA)、服务发现与治理、链路追踪与可观测性、跨服务调用性能损耗、调试和排障复杂度上升
完整讲解
第一部分:知识重点剖析
核心考点定位:考察对微服务本质的理解,是否清楚演进动因、核心特征、优势代价的权衡,而非仅仅背一堆名词。
知识点拆解:
- 演进脉络:单体 → 垂直拆分(按功能层)→ SOA(企业服务总线) → 微服务(轻量通信 + DevOps)。微服务不是新技术,是新的组织与治理方式。
- 7 大核心特征(Martin Fowler):围绕业务组织、去中心化治理、去中心化数据、智能端点 + 轻量通信、基础设施自动化、设计失败(每个服务可以独立失败演进)、组合而非继承。
- 5 大优势:独立部署、故障隔离、按需扩展、团队独立、技术栈灵活。
- 5 大代价:分布式一致性、跨服务调用损耗、服务治理复杂度、可观测性挑战、分布式事务。
- 拆分边界:DDD 领域驱动设计,按业务限界上下文(Bounded Context)拆分,而不是按技术层(web/service/dao)拆。
递进:从"为什么拆"(单体瓶颈)→ "拆成什么样"(业务边界)→ "拆完要付出什么"(分布式复杂度)。
第二部分:考察方向与延伸递进
考察方向:
- 深度:DDD 限界上下文划分方法、服务边界如何定义
- 广度:与 SOA、Serverless、Service Mesh 的关系
- 应用:拆分原则、什么时候不该用微服务、单体优先原则
延伸递进面试题:
- 什么时候不该用微服务?
- 解答要点:团队小于 8 人、业务没跑通、迭代频繁还未稳定、性能敏感场景。Amazon 有 "Monolith First, Microservices Second" 的原则。
- 拆分微服务有哪些原则?
- 解答要点:高内聚低耦合、单一职责、避免共享状态和数据库、避免循环依赖、按业务能力而非技术层拆、控制爆炸半径。
- 微服务如何通信?同步 vs 异步怎么选?
- 解答要点:强一致、需要同步返回 → REST/gRPC;解耦、削峰、最终一致 → MQ。远程调用要超时 + 重试 + 熔断 + 幂等。
- 康威定律是什么?为什么对微服务重要?
- 解答要点:系统架构最终会反映组织的沟通结构。所以微服务的拆分必须匹配团队边界,一个团队负责一个服务,避免跨团队调用。
第三部分:面试者参考回答(300-600 字口语化)
面试官您好,微服务是从单体演进出来的架构风格。
演进过程是这样:最早单体一个大应用,简单好上手;单机有瓶颈,就把多个单体实例放多台机器做横向扩容;但整体部署导致无法按需扩缩容——用户服务要 20 副本,支付服务只要 2 副本,被迫一起扩,资源浪费;再往后按功能域拆分成多个独立部署的小服务,就是微服务。
特点上我记 7 条:围绕业务能力构建、去中心化治理、去中心化数据(每个服务自己的 DB)、智能端点 + 轻量通信(HTTP/gRPC/消息)、基础设施自动化(CI/CD)、可以设计失败、组合而非继承。
优势主要是:
- 独立部署——支付改了只发支付,不影响用户;
- 故障隔离——一个服务挂了不拖垮整个系统;
- 按需扩展——按业务量给服务单独扩缩容;
- 多团队并行——一个团队一个服务,符合康威定律;
- 技术栈灵活——支付可以用 Go,用户可以用 Java。
代价要正视:
- 分布式一致性——数据不在一起了,2PC/TCC/SAGA/本地消息表各种方案;
- 跨服务调用有网络开销,比内调用慢;
- 服务治理成本——注册中心、网关、熔断、限流、链路追踪都要搭;
- 排查复杂——一个请求跨 5 个服务,出问题很难定位。
实践上:团队小、业务没跑通,先做单体(Monolith First);只有当单体真的扛不住(比如团队大于 20 人、某个模块需要独立扩展),再按 DDD 的限界上下文拆分。拆得太细和没拆,都是坑。