微服务面试题
2026/1/15大约 3 分钟
微服务面试题
基础概念
1. 微服务的优缺点?
优点:
- 独立部署,快速迭代
- 技术栈灵活
- 故障隔离
- 按需扩展
缺点:
- 分布式复杂性
- 运维成本高
- 数据一致性难保证
- 服务间通信开销
2. Spring Cloud 和 Dubbo 的区别?
| 特性 | Spring Cloud | Dubbo |
|---|---|---|
| 通信协议 | HTTP REST | RPC |
| 性能 | 较低 | 高 |
| 生态 | 完整 | 需整合 |
| 学习成本 | 较高 | 较低 |
| 适用场景 | 异构系统 | Java 系统 |
3. 服务注册与发现原理?
┌─────────────────────────────────────────────────────────┐
│ 服务注册与发现 │
├─────────────────────────────────────────────────────────┤
│ │
│ ┌──────────┐ 1.注册 ┌──────────┐ │
│ │ Provider │ ──────────> │ Registry │ │
│ └──────────┘ └──────────┘ │
│ │ │
│ │ 2.订阅 │
│ ▼ │
│ ┌──────────┐ 3.调用 ┌──────────┐ │
│ │ Consumer │ <────────── │ Consumer │ │
│ └──────────┘ └──────────┘ │
│ │
└─────────────────────────────────────────────────────────┘- Provider 启动时向 Registry 注册
- Consumer 订阅所需服务
- Registry 推送服务列表给 Consumer
- Consumer 根据负载均衡策略调用 Provider
4. 熔断器原理?
三种状态:
- Closed:正常状态,请求正常通过
- Open:熔断状态,请求直接失败
- Half-Open:半开状态,允许部分请求探测
触发条件:
- 错误率超过阈值
- 慢调用比例超过阈值
- 异常数超过阈值
5. 限流算法有哪些?
| 算法 | 原理 | 特点 |
|---|---|---|
| 计数器 | 固定窗口计数 | 简单,有临界问题 |
| 滑动窗口 | 滑动时间窗口 | 平滑,较复杂 |
| 漏桶 | 固定速率流出 | 平滑,无法应对突发 |
| 令牌桶 | 固定速率生成令牌 | 允许突发流量 |
服务治理
6. 如何保证服务高可用?
- 服务冗余:多实例部署
- 负载均衡:分散请求
- 熔断降级:故障隔离
- 限流:保护系统
- 超时重试:容错处理
- 健康检查:及时剔除故障节点
7. 分布式事务解决方案?
- 2PC/3PC:强一致性,性能差
- TCC:补偿事务,业务侵入
- Saga:长事务,最终一致
- 本地消息表:可靠消息
- Seata:AT/TCC/Saga 模式
8. 服务雪崩如何预防?
- 熔断:快速失败,防止级联
- 限流:控制并发
- 降级:返回兜底数据
- 超时:避免长时间等待
- 隔离:线程池/信号量隔离
Dubbo
9. Dubbo 负载均衡策略?
- Random:随机(默认)
- RoundRobin:轮询
- LeastActive:最少活跃
- ConsistentHash:一致性哈希
10. Dubbo 集群容错策略?
- Failover:失败自动切换(默认)
- Failfast:快速失败
- Failsafe:失败安全
- Failback:失败自动恢复
- Forking:并行调用
- Broadcast:广播调用
11. Dubbo 服务暴露流程?
- 解析配置,创建 ServiceBean
- 导出服务到本地(injvm)
- 导出服务到远程(注册中心)
- 启动 Netty 服务器
- 向注册中心注册服务
Spring Cloud
12. Gateway 和 Zuul 的区别?
| 特性 | Gateway | Zuul 1.x |
|---|---|---|
| 架构 | 异步非阻塞 | 同步阻塞 |
| 性能 | 高 | 较低 |
| 长连接 | 支持 | 不支持 |
| 限流 | 内置 | 需整合 |
13. Feign 原理?
- 扫描 @FeignClient 注解
- 为接口创建动态代理
- 解析方法注解,构建请求模板
- 通过负载均衡选择服务实例
- 发送 HTTP 请求
14. 配置中心如何实现热更新?
- Nacos:长轮询 + 推送
- Apollo:长轮询 + 推送
- Spring Cloud Config:消息总线
@RefreshScope // 支持热更新
@RestController
public class ConfigController {
@Value("${app.config}")
private String config;
}15. 链路追踪原理?
- 每个请求生成唯一 TraceId
- 每个服务调用生成 SpanId
- 通过 HTTP Header 传递追踪信息
- 收集上报到追踪系统(Zipkin/Jaeger)