微服务架构、拆分与调用链面试题
本页只放标准回答、追问与知识点跳转,完整原理在对应知识页。
1. 单体系统一定要改成微服务吗
标准回答: 不一定。团队小、业务边界不稳定、容量不高时,模块化单体通常具有更低的调用、事务和运维复杂度。只有当独立扩容、独立发布、团队自治或故障隔离的收益能够覆盖网络、数据一致性、观测和交付成本时,微服务才更合适。应先在单体内形成模块边界,再按证据渐进抽取。
原理:架构演进阶段
2. 什么是分布式单体
标准回答: 分布式单体是指系统虽然拆成多个进程,但仍共享数据库、必须同步发布、存在循环调用或缺少兼容契约。它承担了远程调用和分布式一致性的成本,却没有获得服务独立演进和故障隔离收益。
原理:分布式单体特征
3. 微服务应该怎样拆分
标准回答: 优先按业务能力和限界上下文拆分,识别规则、状态机、数据事实源和负责人,再结合调用频率、事务范围、容量差异和团队边界验证。不要按数据库表一表一服务,也不要在领域边界不稳定时过早拆进程。
4. 为什么微服务不建议共享数据库
标准回答: 共享数据库允许服务绕过对方 API 和状态机直接写表,导致数据规则、Schema 发布、锁竞争和故障责任耦合。原则是一份业务数据只有一个写入解释权,其他服务通过 API、事件、查询模型或数据快照获得信息。
原理:数据所有权
4.1 怎样识别限界上下文和服务边界
标准回答: 先从业务事件、状态机、术语和规则所有者入手,而不是从表名入手。一个合格边界通常拥有稳定业务语言、独立状态机、明确事实源和负责人;再用调用频率、事务范围、容量差异、发布价值和团队边界验证。若两个模块总是一起改、一起发、强事务绑定,就不应过早拆成两个服务。
4.2 老系统多个服务共享数据库怎样迁移
标准回答: 先盘点所有服务账号和SQL,指定每张业务表唯一写入Owner;其他服务逐步改为API、事件或只读查询模型。通过Outbox、CDC或事件构建副本,灰度切读并比对结果,最后再做物理拆库和权限收口。不能直接复制表双写,否则数据漂移和回滚窗口会失控。
原理:共享数据库迁移
4.3 什么是防腐层,为什么迁移时需要
标准回答: 防腐层位于新服务和老系统或第三方之间,把老字段、状态码、异常和调用协议转换成新领域模型和稳定错误语义。它避免老系统模型污染新服务,也集中处理超时、重试、幂等、限流和日志脱敏。
原理:防腐层
4.4 循环依赖有什么问题,怎么治理
标准回答: 循环依赖会锁死发布顺序,放大超时重试,造成职责不清和排查困难。治理方式包括上移编排、领域事件、查询模型、合并边界或防腐层。把同步调用改成MQ不一定解决问题,如果事件仍是互相命令且没有状态机,只是异步版分布式单体。
原理:循环依赖治理
5. 一次 Feign、Dubbo 或 gRPC 调用经过哪些步骤
标准回答: 客户端代理根据方法元数据构建请求,拦截器加入认证、Trace 和 Deadline;服务发现提供实例列表,负载均衡选择节点;连接池获取连接并完成序列化和发送;服务端解码后进入 Filter、参数校验、Controller、Service AOP 和本地事务;响应再编码、传输和解码。每个阶段都有独立超时和失败窗口。
原理:完整微服务调用链
6. 服务扩容后为什么流量没有立即均匀
标准回答: 实例注册到所有客户端可见存在传播延迟,而且 HTTP/2、gRPC 等长连接通常在建连接时完成负载选择,旧连接仍绑定旧实例。要检查注册缓存、Endpoint 传播、连接年龄、排空和重连,而不是只看实例数量。
原理:服务发现与负载均衡
7. Connect Timeout、Read Timeout 和连接池等待超时有什么区别
标准回答: Connect Timeout 限制建立 TCP/TLS 连接,Read Timeout 限制请求发出后等待响应,Pool Acquire Timeout 限制从连接池等待可用连接。连接池耗尽时请求可能还没发到下游,所以必须按阶段记录指标,不能统称接口超时。
原理:连接池与超时阶段
8. 下游处理成功,上游为什么仍可能收到超时
标准回答: 下游本地事务提交后,响应仍可能在编码、网络或客户端解码阶段丢失。上游只能确定没有按时收到结果,不能推出下游失败。写接口必须使用业务幂等键,并提供按幂等键或业务流水查询事实的能力。
9. 为什么多层重试会导致雪崩
标准回答: Gateway、客户端、Mesh 和业务层的重试次数会相乘。原始请求在下游过载时被放大成大量物理请求,进一步消耗线程和连接。应指定主要重试层,限制 Retry Budget,退避抖动,只重试可安全重放的瞬时故障,并受剩余 Deadline 约束。
原理:重试层级
10. 怎样渐进地从单体迁移到微服务
标准回答: 使用绞杀者模式,在网关按接口或租户灰度路由;先构建兼容读模型并用无副作用影子流量比对,再迁写入事实源;契约和数据库采用 Expand–Migrate–Contract;指标未达标可立即回切,完成观察期后才删除旧实现。
