Appearance
微服务
微服务面试主线:拆分原则 → 通信方式 → 治理手段 → 部署运维。
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 模式怎么选?