外观
微服务架构 速查卡
🎯 覆盖 16 题 | ⭐ 高频 8 题 | 预计扫描 9 分钟 📌 先看⭐一句话答案 → 展开要点 → 自测清单检验
一、注册与发现
知识地图:Nacos(AP Distro / CP JRaft) / 临时实例(心跳) vs 永久实例(探测) / 注册→订阅→缓存→调用
⭐ Nacos 注册与发现
一句话: Nacos 支持临时实例(AP 模式/Distro 协议/客户端心跳)和永久实例(CP 模式/JRaft 协议/服务端探测),客户端注册后通过 UDP 推送+HTTP 长轮询感知实例变更,本地缓存实例列表实现容灾。
| 维度 | 临时实例 (Ephemeral) | 永久实例 (Persistent) |
|---|---|---|
| 健康检查 | 客户端心跳 5s/次 | 服务端主动探测 TCP/HTTP |
| 不健康处理 | 15s 标记不健康,30s 剔除 | 标记不健康但不剔除 |
| 一致性协议 | AP — Distro(最终一致) | CP — JRaft(强一致) |
| 场景 | Spring Cloud 微服务 | 数据库、中间件等基础设施 |
Distro 协议要点: Hash 分片写入 → 异步复制到其他节点 → 每节点持有全量数据(读任意节点);写入快但有毫秒级不一致
注册流程核心步骤:
启动 → register(IP:Port+元数据) → 写入内存 ConcurrentHashMap
→ Distro 异步同步 → UDP 推送订阅者
→ 心跳定时任务 5s/次(返回 NOT_FOUND 则重新注册)⭐ Nacos vs Eureka vs ZooKeeper
一句话: 注册中心优先选 AP 模型——网络分区时宁可返回旧数据也不要拒绝服务;Nacos AP+CP 可切换且内置配置中心,功能最全。
| 维度 | Nacos | Eureka | ZooKeeper |
|---|---|---|---|
| CAP | AP + CP 可切换 | AP | CP |
| 协议 | Distro / JRaft | 对等复制 | ZAB(类 Paxos) |
| 推/拉 | 推(UDP) + 拉(长轮询) | 拉(30s 轮询) | 推(Watch) |
| 自我保护 | 有(Distro 容忍) | 有(Renew<85%不剔除) | 无(过半不可用则不可写) |
| 配置中心 | 内置 | 不支持 | 需封装 |
| 权重/灰度 | 原生支持 | 不支持 | 不支持 |
| 维护 | 阿里活跃 | Netflix 已停更 | Apache 活跃但偏底层 |
⚠️ ZK 的 CP 特性对注册中心是劣势——分区时无法写入导致注册失败
二、API 网关
知识地图:Gateway(WebFlux+Netty) / Route+Predicate+Filter 三大件 / GlobalFilter vs GatewayFilter
⭐ Spring Cloud Gateway 架构
一句话: Gateway 基于 WebFlux+Reactor+Netty 全异步非阻塞;核心三组件——Route(路由规则)、Predicate(匹配条件)、Filter(过滤器链),请求经 Pre Filter 链 → 路由转发 → Post Filter 链。
网关八大职责: 路由转发 / 负载均衡 / 认证鉴权 / 限流熔断 / 协议转换 / 灰度发布 / 日志监控 / 跨域处理
三大核心组件:
| 组件 | 作用 | 示例 |
|---|---|---|
| Route | 路由规则(id + uri + predicates + filters) | uri: lb://order-service |
| Predicate | 匹配条件(Path/Method/Header/Cookie/Weight...) | Path=/api/order/** |
| Filter | 过滤器链(Pre→转发→Post) | StripPrefix / AddRequestHeader |
Filter 分类:
GatewayFilter(局部):只作用于单个路由 → StripPrefix / Retry / RateLimiter
GlobalFilter (全局):作用于所有路由 → 认证 / 日志 / 链路追踪
执行顺序:Pre(Order 升序) → 路由转发 → Post(Order 降序)Gateway vs Zuul 1.x: Gateway=Netty 异步非阻塞(高性能+WebSocket) vs Zuul=Servlet 同步阻塞(并发高时线程耗尽)
三、负载均衡与通信
知识地图:服务端LB(Nginx/LVS/F5) vs 客户端LB(SC LoadBalancer/Ribbon) / 六大算法
⭐ 客户端 vs 服务端负载均衡
一句话: 服务端 LB(Nginx/LVS)做外部流量入口,多一跳但集中管控;客户端 LB(SC LoadBalancer)做内部服务间调用,直连无单点,实例列表从注册中心获取并本地缓存。
| 维度 | 服务端负载均衡 | 客户端负载均衡 |
|---|---|---|
| 代表 | Nginx / LVS / F5 / ALB | SC LoadBalancer / Ribbon |
| 链路 | Client → LB → Server(多一跳) | Client → Server(直连) |
| 单点 | LB 是单点(需高可用) | 无单点 |
| 适用 | 外部流量入口(用户→网关) | 内部调用(服务→服务) |
六大算法: RoundRobin(轮询) / Random(随机) / WeightedRoundRobin(加权轮询) / LeastConnections(最少连接) / ConsistentHash(一致性哈希) / ResponseTimeWeighted(响应时间加权)
四、配置中心
知识地图:Nacos Config(长轮询) / Apollo(强管理) / Spring Cloud Config(Git-Based)
⭐ Nacos Config 热刷新
一句话: Nacos Config 采用长轮询(Long Polling)+MD5 比对——客户端携带配置 MD5 发请求,服务端 hold 住连接最多 29.5s,有变更立即返回 dataId 列表,客户端再拉取最新配置并触发 RefreshScope 刷新 Bean。
长轮询流程:
Client POST /listener (dataId+group+md5)
→ Server 对比 MD5:
相同 → hold 29.5s 后返回空
不同 → 立即返回变更 dataId 列表
→ Client GET /configs 拉取最新配置
→ 更新本地缓存 + 触发 Listener
→ 立即发起下一次长轮询ClientWorker 双线程池: 调度线程(10ms 检查) + 长轮询线程(HTTP 请求)
Spring 集成两种方式:
@RefreshScope+@Value:配置变更时销毁旧 Bean 创建新 Bean(可能短暂空指针)@ConfigurationProperties:直接修改属性值,更平滑(推荐)
⚠️ Nacos 客户端会将配置缓存到本地文件,Server 宕机后仍可使用缓存
五、熔断与弹性
知识地图:断路器三状态(Closed→Open→Half-Open) / 滑动窗口 / Sentinel vs Resilience4j vs Hystrix
⭐ 断路器状态机
一句话: 断路器三状态——Closed(正常放行,滑动窗口统计失败率) → 失败率>=阈值 → Open(快速失败+fallback,等待超时) → Half-Open(放行少量探测请求,全部成功回 Closed,有失败回 Open)。
失败率 >= 阈值
CLOSED ──────────────→ OPEN(快速失败, 等待60s)
↑ │
│ 探测全部成功 ↓ 超时
└──────── HALF_OPEN ←───┘
(放行少量探测)
探测失败 → 回到 OPEN滑动窗口统计: 时间窗口切分为多个桶(如 1s=5*200ms),统计各桶成功/失败数,实时计算失败率
Sentinel 熔断策略: 慢调用比例 / 异常比例 / 异常数(三种任选)
⭐ Sentinel vs Resilience4j vs Hystrix
一句话: Sentinel=流量治理完整方案(限流+熔断+热点+Dashboard);Resilience4j=轻量级函数式弹性库;Hystrix=已停更(线程池隔离开销大)。
| 维度 | Sentinel | Resilience4j | Hystrix |
|---|---|---|---|
| 维护 | 阿里活跃 | 社区活跃 | 已停更(2018) |
| 隔离 | 信号量(轻量) | 信号量(轻量) | 线程池+信号量(开销大) |
| 限流 | 内置(QPS/并发/关联/排队/预热) | Rate Limiter | 不支持 |
| 热点参数 | 支持 | 不支持 | 不支持 |
| 系统自适应 | CPU/Load 自适应限流 | 不支持 | 不支持 |
| Dashboard | 自带(实时监控+动态规则) | 无(需 Prometheus+Grafana) | Hystrix Dashboard |
| 编程模型 | 注解+API+Dashboard | 函数式(装饰器) | 注解+HystrixCommand |
选型: SC Alibaba → Sentinel | Spring Boot 轻量 → Resilience4j | 老项目 → 从 Hystrix 迁走
六、分布式追踪与可观测
知识地图:Trace ID + Span ID + Parent Span ID / 传播(HTTP Header/RPC Context/MQ Header)
⭐ 分布式追踪原理
一句话: 链路追踪核心是 Trace ID(全局唯一标识一次完整请求) + Span(每个操作一个 Span,含 Span ID/Parent Span ID/耗时/标签);Trace ID 通过 HTTP Header / RPC Context / MQ Header 在服务间传播。
Trace/Span 结构示意:
Trace ID: abc-123
├── Span A: 网关 [0~200ms]
│ ├── Span B: 订单服务 [10~180ms]
│ │ ├── Span C: MySQL查询 [20~50ms]
│ │ └── Span D: 库存服务 [60~150ms]
│ └── Span F: 支付服务 [50~190ms]传播方式: HTTP=Header(X-B3-TraceId/SpanId) / RPC=Context(Attachment/Metadata) / MQ=Message Header
方案对比: SkyWalking(Agent零侵入,推荐) / Zipkin(SDK埋点,侵入高) / Jaeger(CNCF,自适应采样) / OpenTelemetry(未来标准,统一API)
补充速览
| 关键词 | 核心答案 |
|---|---|
| 注册到调用全链路 | 注册→订阅/推送→本地缓存实例列表→LoadBalancer选实例→Feign/Dubbo调用→失败重试/熔断降级 |
| Gateway 自定义 Filter | GlobalFilter(全局认证/日志,实现GlobalFilter接口) / GatewayFilter(局部,继承AbstractGatewayFilterFactory) |
| OpenFeign 原理 | @FeignClient→JDK动态代理→解析注解构建RequestTemplate→LoadBalancer选实例替换URL→HTTP调用→Decoder反序列化 |
| 配置中心三方案 | Nacos Config(长轮询,简单) / Apollo(推送,管理强大) / SC Config(Git-Based,功能少) |
| 降级策略 | Fallback方法(最常用) / 静态默认值 / 缓存降级(读旧数据) / 功能开关(关非核心) |
| 可观测三支柱 | Metrics(Prometheus+Grafana) + Logging(ELK/Loki) + Tracing(SkyWalking);Trace ID 是关联纽带 |
| gRPC vs REST vs Dubbo | REST=跨语言/对外API;gRPC=高性能/多语言/HTTP2+Protobuf;Dubbo=Java生态/内置服务治理 |
| Service Mesh / Sidecar | 治理能力下沉到 Sidecar 代理(Envoy);Istio=控制面(Pilot/Citadel)+数据面(Envoy);优势=语言无关/零侵入;代价=+2~5ms延迟/运维复杂 |
🧠 助记汇总
| 口诀 | 含义 |
|---|---|
| 临心Distro,永探JRaft | 临时实例=心跳+Distro(AP);永久实例=探测+JRaft(CP) |
| 路断过(Route/Predicate/Filter) | Gateway 三大核心组件 |
| 服外客内 | 服务端LB做外部入口,客户端LB做内部调用 |
| 长轮询MD5 | Nacos Config 热刷新=长轮询+MD5比对 |
| 关开半(C→O→HO) | 断路器三状态:Closed→Open→Half-Open |
| Trace穿Span量 | Trace ID 贯穿全链路,Span 度量每个操作 |
| 哨轻停(Sentinel/R4j/Hystrix) | Sentinel全面 / Resilience4j轻量 / Hystrix已停更 |
✅ 自测清单
| # | 问题 | 你能说出... |
|---|---|---|
| 1 | Nacos 注册发现 | 临时 vs 永久实例 + AP(Distro) vs CP(JRaft) + 心跳机制 |
| 2 | Nacos vs Eureka vs ZK | CAP 模型 + 推/拉模型 + 为什么注册中心优先 AP |
| 3 | Gateway 架构 | Route/Predicate/Filter + 异步非阻塞 + vs Zuul |
| 4 | 客户端 vs 服务端 LB | 适用场景 + 六大算法 |
| 5 | Nacos Config 热刷新 | 长轮询+MD5 + ClientWorker + @RefreshScope vs @ConfigurationProperties |
| 6 | 断路器状态机 | Closed→Open→Half-Open + 滑动窗口 + 熔断策略 |
| 7 | Sentinel vs R4j vs Hystrix | 隔离策略 + 限流 + Dashboard + 选型建议 |
| 8 | 分布式追踪 | Trace ID+Span ID + 传播机制 + SkyWalking 零侵入 |
💡 首次全部过一遍 → 第2天只过答不上来的 → 第4天再复习 → 面试前一天最后扫一遍