Skip to content

微服务

微服务面试主线:拆分原则 → 通信方式 → 治理手段 → 部署运维。

Q1: 微服务怎么拆分? 「🔴 高级」

考察点:架构设计的基本功。

参考答案

  • 按业务领域拆分:DDD(领域驱动设计)划分限界上下文(Bounded Context)。
  • 单一职责:每个服务只负责一个业务能力。
  • 高内聚低耦合:服务内部高内聚,服务间通过接口/事件通信。
  • 拆分原则:先粗后细,避免过度拆分;考虑团队规模(两个披萨原则)。
  • 常见坑:分布式事务过多、运维成本上升、链路复杂排查困难。

追问延伸

  • 微服务和单体应用怎么共存?(绞杀者模式)
  • 拆分粒度怎么把握?

Q2: 微服务之间怎么通信? 「🟡 中级」

考察点:同步与异步通信的选型。

参考答案

  • 同步
    • HTTP/REST:简单通用,跨语言。
    • gRPC:高性能,基于 HTTP/2 + Protobuf,强类型,适合内部服务。
    • Dubbo:Java 生态,功能丰富(RPC + 服务治理)。
  • 异步
    • 消息队列(Kafka/RabbitMQ/RocketMQ):解耦、削峰、最终一致性。
  • 选型:核心链路用同步(低延迟),非核心用异步(解耦)。

追问延伸

  • gRPC 的四种模式(Unary/Server Stream/Client Stream/Bidirectional)?
  • REST 和 gRPC 怎么共存?(gRPC-Gateway)

Q3: 什么是 API 网关? 「🟡 中级」

考察点:微服务流量入口的设计。

参考答案

  • 统一入口:对外暴露一个地址,路由到后端各服务。
  • 核心功能:路由转发、鉴权、限流、熔断、日志、协议转换。
  • 常见方案:Nginx(反向代理)、Kong(基于 Nginx + 插件)、Spring Cloud Gateway、APISIX。
  • BFF(Backend For Frontend):为不同客户端(Web/App)提供定制化的聚合层。

追问延伸

  • 网关的高可用怎么保证?
  • 网关的性能瓶颈在哪?

Q4: 什么是链路追踪? 「🟡 中级」

考察点:微服务可观测性的核心。

参考答案

  • 分布式请求经过多个服务,需要串联起来排查问题。
  • 核心概念:Trace(整条链路)、Span(单个服务调用)、时间戳、状态。
  • 实现:请求头传递 TraceId/SpanId(W3C Trace Context 标准)。
  • 工具:Jaeger、Zipkin、SkyWalking、OpenTelemetry(统一标准)。
  • 三大支柱:链路追踪(Traces)+ 日志(Logs)+ 指标(Metrics)。

追问延伸

  • 链路追踪的性能开销怎么处理?(采样策略)
  • OpenTelemetry 解决了什么问题?

Q5: 微服务怎么保证高可用? 「🔴 高级」

考察点:系统可靠性设计。

参考答案

  • 服务层:多实例部署、负载均衡、熔断降级、限流。
  • 数据层:主从复制、分库分表、异地多活。
  • 运维层:健康检查、自动重启(K8s)、灰度发布、回滚机制。
  • 容灾:多机房部署、流量切换、混沌工程(Chaos Engineering)演练。

追问延伸

  • 灰度发布怎么实现?
  • 混沌工程的核心思想是什么?

Q6: 什么是服务网格(Service Mesh)? 「🔴 高级」

考察点:微服务架构的演进方向。

参考答案

  • 把服务治理能力(路由、熔断、限流、可观测性)从业务代码下沉到 Sidecar 代理。
  • 代表:Istio + Envoy。
  • 优势:业务代码无侵入、多语言支持、统一治理。
  • 劣势:Sidecar 带来额外延迟和资源消耗、运维复杂度高。
  • 适用场景:多语言、大规模微服务集群。

追问延伸

  • Sidecar 模式有什么性能开销?
  • Service Mesh 和 SDK 模式怎么选?