文章目录
-
- [一、 基础认知类](#一、 基础认知类)
-
- [1. 什么是微服务?和单体架构的核心区别是什么?](#1. 什么是微服务?和单体架构的核心区别是什么?)
- [2. 微服务的核心优势和劣势是什么?](#2. 微服务的核心优势和劣势是什么?)
- [3. 微服务设计的核心原则是什么?](#3. 微服务设计的核心原则是什么?)
- [二、 服务拆分与设计类](#二、 服务拆分与设计类)
-
- [1. 你是如何拆分微服务的?有什么具体的方法和标准?](#1. 你是如何拆分微服务的?有什么具体的方法和标准?)
- [2. 微服务拆分过细会有什么问题?如何避免?](#2. 微服务拆分过细会有什么问题?如何避免?)
- [3. 微服务为什么要避免共享数据库?](#3. 微服务为什么要避免共享数据库?)
- [三、 服务通信与数据一致性类](#三、 服务通信与数据一致性类)
-
- [1. 微服务间的同步通信和异步通信有什么区别?各自适用什么场景?](#1. 微服务间的同步通信和异步通信有什么区别?各自适用什么场景?)
- [2. 微服务中如何解决分布式事务问题?你用过哪些方案?](#2. 微服务中如何解决分布式事务问题?你用过哪些方案?)
- [3. 如何解决微服务调用中的服务雪崩问题?](#3. 如何解决微服务调用中的服务雪崩问题?)
- [四、 服务治理与运维类](#四、 服务治理与运维类)
-
- [1. 微服务的服务注册与发现是怎么实现的?你用过哪些注册中心?](#1. 微服务的服务注册与发现是怎么实现的?你用过哪些注册中心?)
- [2. 微服务的可观测性是怎么实现的?需要哪些工具?](#2. 微服务的可观测性是怎么实现的?需要哪些工具?)
- [3. 微服务的配置中心是做什么的?如何实现配置的动态更新?](#3. 微服务的配置中心是做什么的?如何实现配置的动态更新?)
- [五、 架构取舍与实战类](#五、 架构取舍与实战类)
-
- [1. 什么样的项目适合微服务?什么样的项目不适合?](#1. 什么样的项目适合微服务?什么样的项目不适合?)
- [2. 微服务架构演进的过程中,你遇到过哪些坑?如何解决的?](#2. 微服务架构演进的过程中,你遇到过哪些坑?如何解决的?)
- [3. 微服务和中台的关系是什么?](#3. 微服务和中台的关系是什么?)
这份手册覆盖微服务 核心原理、拆分、通信、治理、痛点取舍 五大模块,每个问题都提供 答题思路+话术示例 ,适配中高级工程师面试场景,突出理论+实战结合。
一、 基础认知类
1. 什么是微服务?和单体架构的核心区别是什么?
答题思路 :先定义微服务的核心是"业务域拆分+独立自治",再从开发、部署、扩展、容错 四个维度对比单体。
话术示例:
微服务是将单体应用按业务域 拆分为一系列小型、自治服务的架构模式,每个服务独立运行、独立部署,通过轻量级通信协作。
它和单体的核心区别有四点:
- 开发维度:单体是一个代码库,团队协作易冲突;微服务每个服务一个代码库,小团队可独立负责,迭代更快。
- 部署维度:单体改一行代码就要全量部署,风险高;微服务支持单个服务独立部署,不影响其他服务。
- 扩展维度:单体只能整体扩容,资源浪费;微服务可针对高负载服务(如订单服务)单独扩容,性价比更高。
- 容错维度:单体一个模块挂了,整个应用崩;微服务一个服务故障,可通过熔断降级隔离,不影响核心链路。
2. 微服务的核心优势和劣势是什么?
答题思路 :优势从业务迭代、资源利用、技术选型 切入;劣势从分布式复杂度、运维成本、团队要求 切入,最后强调"微服务不是银弹"。
话术示例:
优势很明确:第一,支撑业务快速迭代 ,不同服务可并行开发、独立发布,适合互联网产品快速试错的需求;第二,资源弹性伸缩 ,高并发服务单独扩容,比单体更节省资源;第三,技术栈灵活 ,每个服务可根据场景选技术,比如计算密集型用Go,数据密集型用Java。
但劣势也很突出:一是分布式带来的复杂度 ,比如服务调用的网络延迟、分布式事务、数据一致性问题;二是运维成本高 ,服务数量多,需要容器化、编排工具、监控体系支撑;三是对团队要求高,需要团队具备独立设计、开发、运维服务的能力,小团队盲目上微服务反而会拖累效率。
3. 微服务设计的核心原则是什么?
答题思路 :围绕高内聚低耦合 展开,提炼3-4个核心原则,结合业务场景解释。
话术示例:
核心原则有三个:
- 按业务域拆分,而非技术分层:比如电商要拆成用户、订单、支付、库存服务,而不是拆成controller、service、dao服务------后者是技术分层,解决不了耦合问题。
- 服务自治:每个服务必须有自己的数据库,禁止跨服务访问数据库,否则会形成强依赖;服务间的协作只能通过API或消息。
- 单一职责:一个服务只做一件事,比如订单服务只负责订单的全生命周期管理,库存扣减交给库存服务,避免服务变成"大杂烩"。
- 接口契约优先:服务间的接口要先定义好契约(比如用OpenAPI、Protobuf),保证调用方和提供方的一致性,减少联调成本。
二、 服务拆分与设计类
1. 你是如何拆分微服务的?有什么具体的方法和标准?
答题思路 :讲清拆分步骤(领域建模→粒度把控→边界确认),结合DDD(领域驱动设计),举实际项目例子,重点说"如何判断拆分粒度是否合理"。
话术示例:
我们主要用DDD领域驱动设计 的方法拆分,分三步:
第一步,领域建模 :和业务、产品同学一起梳理业务流程,划分限界上下文。比如电商的下单流程,会划分出订单上下文、库存上下文、支付上下文,每个上下文对应一个微服务。
第二步,粒度把控 :判断粒度的核心标准是"一个服务能否由2-5人的小团队独立负责 ",且"服务内的业务逻辑高度相关"。比如我们初期把订单拆成了"订单创建"和"订单查询"两个服务,结果一次查询要调用3个服务,性能差还难维护,后来合并成一个订单服务,反而更高效。
第三步,边界确认:明确服务的核心职责,比如订单服务的职责是"创建、修改、查询订单",库存扣减是库存服务的职责------订单服务通过调用库存服务的API完成扣减,而不是直接操作库存数据库。
2. 微服务拆分过细会有什么问题?如何避免?
答题思路 :问题从通信成本、运维复杂度、事务难度 切入;解决方案从业务闭环、合理聚合 切入。
话术示例:
拆分过细的坑我们踩过:一是服务间通信成本高 ,一次业务请求要调用多个服务,网络延迟叠加,性能下降;二是运维复杂度指数级上升 ,几十个服务的配置、部署、监控都是负担;三是分布式事务更难处理 ,涉及的服务越多,保证数据一致性的难度越大。
避免方法很简单:以业务闭环为标准聚合服务,确保一个服务能完成一个完整的业务功能。比如"用户下单"这个场景,订单服务负责创建订单,库存服务负责扣减库存,支付服务负责处理支付------这三个服务都是独立的业务闭环,拆分粒度就很合理;但如果把"订单创建"拆成"订单基本信息创建"和"订单商品信息创建",就超出了业务闭环,属于过度拆分。
3. 微服务为什么要避免共享数据库?
答题思路 :从耦合性、扩展性、事务一致性 三个角度分析,强调"共享数据库是微服务的大忌"。
话术示例:
共享数据库是微服务的"隐形陷阱",会让服务间的耦合变得更隐蔽,主要有三个问题:
- 强耦合:如果订单服务和库存服务共享一个数据库,库存表的结构变更会直接影响订单服务,违背了服务自治的原则。
- 扩展性受限:不同服务的数据库访问模式不同,比如订单服务是读多写少,库存服务是写多读少------共享数据库无法针对不同服务优化存储引擎和索引。
- 事务一致性更复杂 :跨服务的数据库操作会导致分布式事务问题,而且比API调用的事务更难处理,因为数据库层面的耦合更难监控和隔离。
所以我们的原则是:每个服务必须有独立的数据库,跨服务的数据交互只能通过API或消息队列。
三、 服务通信与数据一致性类
1. 微服务间的同步通信和异步通信有什么区别?各自适用什么场景?
答题思路 :先定义两种通信模式,再从实时性、耦合性、容错性 对比,结合具体业务场景举例。
话术示例:
同步通信是调用方发起请求后,必须等待服务提供方返回结果才能继续,比如RESTful、gRPC;异步通信是调用方发送请求后不用等待,直接继续执行,比如Kafka、RocketMQ。
两者的区别和适用场景很清晰:
维度 同步通信 异步通信 实时性 高,适合强依赖场景 低,适合弱依赖场景 耦合性 高,调用方依赖服务可用性 低,通过消息解耦 容错性 差,服务挂了调用方会受影响 好,消息可持久化,服务恢复后重试 适用场景 订单创建时查询用户余额、库存是否充足 订单创建后通知物流、积分服务、推送消息 我们项目中,核心链路的强依赖用gRPC(性能比RESTful高),非核心的通知场景用Kafka,既保证了核心链路的实时性,又降低了非核心链路的耦合。
2. 微服务中如何解决分布式事务问题?你用过哪些方案?
答题思路 :先讲CAP理论和BASE理论的取舍,再分场景讲方案(强一致性用TCC,最终一致性用本地消息表),结合项目案例说优缺点。
话术示例:
微服务中很难做到强一致性,我们一般遵循BASE理论,追求最终一致性,分两种场景选方案:
第一种,强一致性场景 (比如订单扣减库存、支付转账):我们用TCC模式 。比如订单扣减库存的流程:Try阶段,库存服务锁定订单需要的库存;Confirm阶段,订单创建成功,库存服务扣减锁定的库存;Cancel阶段,订单创建失败,库存服务释放锁定的库存。TCC的优点是粒度细,可控性强;缺点是开发成本高,需要每个服务实现Try、Confirm、Cancel三个接口。
第二种,最终一致性场景 (比如订单创建后更新用户积分):我们用本地消息表+消息队列 。订单服务在本地事务中,同时写入订单记录和"更新积分"的消息记录;然后有一个异步线程,把消息发送到Kafka;积分服务消费消息,更新用户积分。如果积分服务宕机,消息会存在Kafka里,恢复后可以重试。这个方案的优点是开发成本低,缺点是有一定的延迟,但对积分这类非核心场景完全够用。
另外,我们也用过Saga模式,但它的补偿逻辑比较复杂,适合长事务场景,一般不用。
3. 如何解决微服务调用中的服务雪崩问题?
答题思路 :先解释服务雪崩的原因(一个服务故障,导致依赖它的服务连锁故障),再讲熔断、降级、限流、隔离 四种解决方案,结合具体技术(Sentinel/Hystrix)举例。
话术示例:
服务雪崩是分布式系统的"噩梦"------比如库存服务挂了,订单服务调用库存服务超时,大量请求堆积在订单服务的线程池里,导致订单服务也挂了,进而影响支付服务。我们主要用四种手段解决:
- 熔断:用Sentinel做熔断,当库存服务的错误率超过阈值(比如50%),就触发熔断,订单服务在一段时间内不再调用库存服务,直接返回降级结果,避免线程池被耗尽。
- 降级:针对非核心接口,比如订单详情页的"商品推荐"接口,当系统负载高时,直接返回空数据,保证核心接口(订单创建、支付)的可用性。
- 限流:限制每个服务的QPS,比如订单服务的QPS上限是1000,超过的请求直接拒绝,避免服务被打垮。
- 线程池隔离:给每个服务的调用分配独立的线程池,比如调用库存服务的线程池和调用支付服务的线程池是分开的------库存服务的线程池满了,不会影响支付服务的调用。
四、 服务治理与运维类
1. 微服务的服务注册与发现是怎么实现的?你用过哪些注册中心?
答题思路 :先讲注册发现的核心流程(注册→发现→健康检查),再对比Nacos/Eureka/Consul的优缺点,结合项目选型说明原因。
话术示例:
服务注册与发现的核心是解决"服务地址动态变化"的问题,流程分三步:
- 注册:服务启动时,将自己的IP、端口、服务名注册到注册中心;
- 发现:调用方从注册中心拉取服务的实例列表,缓存到本地;
- 健康检查 :注册中心定期向服务发送心跳,服务宕机后自动剔除,避免调用方访问故障节点。
我们项目中用过Nacos和Eureka,最终选了Nacos。因为Eureka已经停更了,而Nacos不仅支持服务注册发现,还支持配置中心,一站式解决两个问题;而且Nacos的健康检查更灵活,支持TCP、HTTP两种方式,适合不同类型的服务。
2. 微服务的可观测性是怎么实现的?需要哪些工具?
答题思路 :可观测性的三大支柱是监控、日志、链路追踪 ,分别讲每个支柱的工具选型和作用,体现"三位一体"的监控体系。
话术示例:
微服务的问题定位很难,必须搭建"监控+日志+链路追踪"三位一体的可观测性平台:
- 指标监控:用Prometheus采集服务的指标(QPS、延迟、错误率),用Grafana做可视化面板,实时监控服务状态;还会设置告警规则,比如错误率超过阈值就发钉钉通知。
- 日志收集:用ELK栈(Elasticsearch+Logstash+Kibana),所有服务的日志统一输出为JSON格式,通过Logstash收集到Elasticsearch,开发和运维可以在Kibana上按服务名、时间、关键字查询日志,快速定位问题。
- 链路追踪:用SkyWalking,在服务调用的入口和出口埋点,记录一次请求经过的所有服务、每个服务的耗时------比如用户下单的请求慢了,通过SkyWalking可以看到是库存服务的延迟高,还是支付服务的问题。
3. 微服务的配置中心是做什么的?如何实现配置的动态更新?
答题思路 :先讲配置中心的核心价值(统一配置管理、动态更新、环境隔离),再讲实现动态更新的原理(长轮询/推送),结合Nacos/Apollo举例。
话术示例:
配置中心主要解决微服务"配置分散、更新麻烦"的问题------比如数据库连接串、限流阈值、开关配置,如果分散在每个服务的配置文件里,修改时要重启服务,效率很低。
配置中心的核心功能有三个:一是统一配置管理 ,所有服务的配置都存在配置中心;二是环境隔离 ,开发、测试、生产环境的配置分开,避免混淆;三是动态更新 ,修改配置后无需重启服务,配置自动生效。
我们用Nacos做配置中心,动态更新的原理很简单:服务启动时会和Nacos建立长轮询连接,当配置发生变化时,Nacos会主动推送新配置到服务端,服务端接收到后更新本地缓存,下次请求就会使用新配置。比如我们要调整订单服务的限流阈值,直接在Nacos控制台修改,10秒内所有订单服务实例就会生效,不用重启任何服务。
五、 架构取舍与实战类
1. 什么样的项目适合微服务?什么样的项目不适合?
答题思路 :从业务复杂度、团队规模、迭代速度 三个维度判断,强调"微服务是业务驱动,不是技术驱动"。
话术示例:
不是所有项目都适合微服务,判断标准有三个:
- 业务复杂度高:比如电商、金融这类多模块、多流程的项目,单体架构会导致耦合严重,适合拆成微服务;而内部管理系统(如OA、CRM)业务简单,单体架构足够用,没必要上微服务。
- 团队规模大:微服务需要多个小团队并行开发,每个团队负责一个服务;如果团队只有3-5人,维护多个服务的成本比单体还高。
- 迭代速度快 :互联网产品需要快速试错、频繁发布,微服务的独立部署能力能支撑这个需求;而传统软件(如ERP)迭代周期长,单体架构更稳定。
我们之前有个内部报表系统,团队只有2个人,初期盲目上了微服务,拆成了3个服务,结果开发、测试、运维的成本都很高,后来重构回单体,效率提升了一倍------这就是典型的"为了技术而技术"的反面案例。
2. 微服务架构演进的过程中,你遇到过哪些坑?如何解决的?
答题思路 :举1-2个真实的坑(比如过度拆分、分布式事务、服务依赖混乱),讲清"问题现象→原因分析→解决方案→经验总结"。
话术示例:
印象最深的是两个坑:
第一个坑是过度拆分 ,初期把订单服务拆成了订单创建、订单查询、订单履约三个服务,结果一次用户下单请求要调用5个服务,网络延迟高,排查问题也难。解决方案是按业务闭环聚合 ,把这三个服务合并成一个订单服务,同时通过消息队列解耦和其他服务的依赖------合并后订单服务的响应时间从200ms降到了50ms。
第二个坑是服务依赖混乱 ,服务间的调用关系像"蜘蛛网",不知道哪个服务依赖哪个服务。解决方案是引入服务网格(Istio) ,自动收集服务间的调用链路,生成依赖关系图;同时制定规范,要求服务调用必须走注册中心,禁止直接写死IP地址。
总结下来就是:微服务拆分要"宁粗勿细",先保证业务闭环,再根据需求逐步优化。
3. 微服务和中台的关系是什么?
答题思路 :先定义中台(业务中台、技术中台),再讲微服务是中台的"组成部分",中台是微服务的"上层抽象"。
话术示例:
中台的核心是"能力复用",分为业务中台和技术中台:业务中台是把各个业务线的通用能力抽离出来,比如用户中心、订单中心、支付中心;技术中台是把通用的技术能力抽离出来,比如配置中心、注册中心、监控平台。
微服务和中台的关系很清晰:中台是由一系列微服务组成的 ,比如用户中台就是一个用户微服务,提供用户注册、登录、信息查询的通用能力;而微服务不一定是中台,比如某个业务线的专属服务(如电商的秒杀服务),只服务于特定场景,就不属于中台。
简单说:中台是"通用能力的集合",微服务是"构建中台的技术手段"。