🧭 服务治理
注册发现 · 负载均衡 · 限流熔断降级 · 网关
1. 服务注册与发现的原理?Nacos vs Eureka?
流程:服务启动 → 向注册中心注册(IP:端口)→ 周期心跳续约 → 消费方从注册中心拉取/订阅服务列表 → 本地缓存 + 负载均衡调用 → 服务下线注销,注册中心通知订阅方。
Nacos(阿里,主流):
- 临时实例:心跳续约 + 不健康剔除(AP 风格);持久实例:主动上报健康(CP)
- 自带配置中心(动态配置 + 命名空间分组),注册+配置一体
- 支持 gRPC 长连接推送(变更秒级感知)
Eureka(Netflix):AP 风格——自我保护机制:短时间内大量实例掉线时不剔除(防网络抖动误杀),宁可保留死节点让调用方重试,不可用性风险低。早已停止开发。
🎯 面试要点
- 对比:Nacos(可 AP 可 CP,功能全,国内主流)/ Eureka(AP,淘汰)/ ZooKeeper(CP,分区不可用)/ Consul(CP,云原生)
- 服务列表变更的感知:拉模式(轮询)vs 推模式(长连接/WebSocket)——Nacos 推送更快
2. 负载均衡策略有哪些?一致性哈希?
- 轮询(Round Robin):依次分发,简单均匀
- 加权轮询:按机器权重(机器性能不同)
- 随机:够均匀,实现简单
- 最少连接:分给当前连接数最少的(长连接场景好)
- 一致性哈希:key 哈希后落在哈希环上,顺时针找第一个节点——节点增减只影响少量 key(解决取模扩容雪崩),适合缓存类;加虚拟节点防分布不均
🎯 面试要点
- 一致性哈希 vs 取模:取模扩容要全部重映射;一致性哈希只影响 1/n 的 key
- Dubbo 默认加权随机;Nginx 默认轮询;Spring Cloud LoadBalancer 默认轮询
- 粘性会话(Session 绑定)不推荐,服务要无状态
3. 限流、熔断、降级的区别?(必考三件套)
- 限流(Rate Limiting):控制请求速率——每秒最多 N 个。算法:固定窗口、滑动窗口、漏桶、令牌桶。令牌桶最常用(允许突发)。落地:网关层(Sentinel/Guava RateLimiter)
- 熔断(Circuit Breaker):下游故障率超标(错误率/慢调用比例)→ 断路器打开,快速失败不请求下游,冷却后半开试探恢复。三态:关闭 → 打开 → 半开。落地:Resilience4j/Sentinel/Hystrix
- 降级(Degradation):主动放弃非核心功能保核心——返回兜底(默认值/缓存旧值/排队提示)。如大促时关闭"评论/积分"接口
区别一句话版
限流:流量太多 → 挡住新请求(保护自己)
熔断:下游坏了 → 不去调用(保护下游+自己)
降级:系统紧张 → 主动砍功能(保证核心可用)
// Sentinel 使用示例
@SentinelResource(value = "getOrder",
fallback = "getOrderFallback", // 降级兜底方法
blockHandler = "getOrderBlock") // 限流兜底方法
🎯 面试要点
- 三者关系:限流防"洪峰",熔断防"雪崩",降级保"核心"——一起构成系统保护体系
- 雪崩链路:A→B→C,C 慢导致 B 线程池耗尽导致 A 耗尽——熔断/限流/超时缺一不可
- Sentinel(阿里)vs Hystrix(Netflix 停更)——答"Sentinel 是现状"
4. 网关的作用?Spring Cloud Gateway?
- 统一入口:所有请求先过网关(路由转发)
- 横切能力:认证鉴权、限流、黑白名单、日志、跨域、灰度发布(按 header/cookie 路由到不同版本)
- 协议转换:HTTP → 内部 RPC
Spring Cloud Gateway 核心:路由(Route)= 断言(Predicate,匹配条件)+ 过滤器(Filter,请求/响应加工)。基于 WebFlux(Netty)非阻塞,性能好于 Zuul 1.x。
🎯 面试要点
- 网关对比:Spring Cloud Gateway(Java 微服务标配)/ Nginx(流量入口,静态负载)/ Kong / APISIX(云原生 API 网关)
- 网关不要放业务逻辑:它是横切面不是业务层