5月27日 23:24

什么是服务治理?RPC 框架如何实现服务治理?

答案前置

服务治理是微服务架构中保障服务稳定、可控运行的一整套机制。RPC 框架中的服务治理核心包括:服务注册与发现、负载均衡、容错降级、限流熔断、路由与灰度、监控与配置管理六大能力。其本质是在远程调用链路上,加入"发现谁能调、怎么调更优、调失败了怎么办、流量怎么控"的决策逻辑。

服务注册与发现

服务提供者启动时将自身地址注册到注册中心(Nacos、ZooKeeper、Consul),消费者从注册中心订阅地址列表。核心要解决的是实例上下线的实时感知:通过心跳检测剔除不健康实例,通过推送或拉取机制更新地址列表。

java
// Dubbo 注册配置 <dubbo:registry address="nacos://127.0.0.1:8848"/>

负载均衡与路由

拿到地址列表后,需要决定请求打到哪个实例。常见算法有随机、轮询、最少连接、一致性哈希。路由则在负载均衡之上增加条件过滤,比如灰度发布时按标签将流量导向新版本实例。

java
<dubbo:reference loadbalance="consistenthash"/> <dubbo:router rule="host = 10.0.0.* => provider.version = 2.0"/>

追问:一致性哈希为什么适合有状态服务? 因为同一 key 始终路由到同一节点,避免状态迁移。

容错、降级与熔断

这三者常被混淆,但解决的问题不同:

  • 容错:调用失败后的重试策略(Failover 重试其他实例、Failfast 快速失败)
  • 降级:服务不可用时返回兜底结果,保证主流程不中断
  • 熔断:当错误率超过阈值,直接切断调用,避免级联故障(雪崩)

熔断器有三个状态:Closed(正常)→ Open(熔断,快速失败)→ Half-Open(试探恢复)。

java
// Sentinel 熔断降级 @SentinelResource(value = "getUser", fallback = "fallback", blockHandler = "handleBlock") public User getUser(Long id) { return userService.getUser(id); } public User fallback(Long id) { return new User(id, "默认用户"); }

限流

保护服务不被突发流量压垮。令牌桶允许突发流量,漏桶强制匀速,滑动窗口统计更精准。实际选型看场景:对外网关用令牌桶,内部服务用滑动窗口。

java
RateLimiter rateLimiter = RateLimiter.create(100); // 每秒100个令牌 if (rateLimiter.tryAcquire()) { /* 处理请求 */ }

监控与配置

监控是治理的眼睛:QPS、RT、错误率是核心指标,Prometheus + Grafana 是主流方案。配置中心(Nacos Config、Apollo)支持动态下发,无需重启即可调整超时、限流阈值等参数。

总结

服务治理的各能力不是孤立的:注册发现是基础,负载均衡和路由决定流量去向,限流熔断降级保障稳定性,监控配置让整个系统可观测可调整。面试中重点讲清楚三者区别(容错 vs 降级 vs 熔断)和选型思路,比罗列功能更有价值。

标签:RPC