服务治理
服务治理解决微服务集群中「服务如何找到彼此、流量如何进来、请求如何分发」的问题。
注册与发现
服务启动时将 IP、端口、服务名写入注册中心,注册中心通过心跳机制(默认 30s)检测实例健康,超时(默认 90s)则剔除。消费者从注册中心获取可用实例列表,按负载均衡策略选择目标。
主流注册中心对比
| 注册中心 | CAP | 一致性协议 | 核心特点 |
|---|---|---|---|
| Eureka | AP | 自研 | Netflix 开源,自我保护机制,已停止维护 |
| Consul | CP | Raft | HashiCorp 开源,支持健康检查、KV 存储 |
| Nacos | CP + AP | Raft + Distro | 阿里开源,同时支持服务发现和配置中心 |
| ZooKeeper | CP | ZAB | Hadoop 生态,Leader 选举保证强一致 |
提示
Eureka 自我保护 Eureka 遵循 AP 原则,当 15 分内心跳失败比例超过 85% 时进入保护模式,暂停剔除失效实例。宁可保留「僵尸」服务,也不误删健康实例。
提示
Nacos 双模式 临时实例(默认)使用 Distro 协议(AP),基于 Gossip 变体,最终一致;永久实例使用 Raft 协议(CP),Leader 选举保证强一致,适合配置管理。
网关
网关是所有流量的统一入口,是微服务架构的第一道防线。
| 职责 | 说明 |
|---|---|
| 路由 | 根据 URL、Header、Method 将请求转发到目标服务 |
| 认证鉴权 | 统一 Token 验证,详见 架构安全 |
| 限流熔断 | 保护后端服务不被流量压垮,详见 流量治理 |
| 协议转换 | HTTP → gRPC、REST → Thrift |
Spring Cloud Gateway vs Zuul
| 维度 | Zuul 1.x | Spring Cloud Gateway |
|---|---|---|
| 架构 | Servlet + 同步阻塞 | WebFlux + Netty 非阻塞 |
| 性能 | 每请求一线程,高并发差 | 单线程处理多请求,高吞吐 |
| 路由配置 | Filter 链 | Predicate + GatewayFilter |
| WebSocket | 不支持 | 支持 |
BFF 模式
BFF(Backend for Frontend)为不同客户端提供定制化接口,承担数据聚合、格式转换职责,解决多端差异化需求。
Web → [BFF-Web] → 微服务A
iOS → [BFF-Mobile] → 微服务B
小程序 → [BFF-Wechat] → 微服务C负载均衡
负载均衡将请求分发到多个服务实例,实现高可用和扩展性。
| 类型 | 说明 | 代表 |
|---|---|---|
| 服务端负载均衡 | 流量先到负载均衡器,再转发 | Nginx、HAProxy |
| 客户端负载均衡 | 消费者本地缓存实例列表,自行选择 | Ribbon、OpenFeign |
| Sidecar 代理 | 流量先到本地 Sidecar,代理完成 | Envoy(Istio) |
提示
Region 与 Zone 多区域部署时,优先选择同 Zone 实例(同 Zone > 同 Region > 跨 Region),降低网络延迟。
Ribbon 使用示例
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
// 使用服务名调用,Ribbon 自动选择实例
restTemplate.getForObject("http://user-service/api/users", List.class);内置策略:轮询(默认)、随机、按响应时间加权、选择并发最少实例、失败重试。
演进路径
手动配置 → 注册中心(Eureka)→ Kubernetes Service → 服务网格(Envoy Sidecar)适用场景
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| Spring Cloud 微服务 | Nacos + Spring Cloud Gateway | 同时支持服务发现和配置中心 |
| Kubernetes 原生应用 | K8s Service + Ingress | 基础设施层服务发现,无需额外组件 |
| 多语言异构系统 | Consul + Nginx | 跨语言支持好,健康检查完善 |
| 高性能内部通信 | Dubbo + Nacos | TCP 长连接 + 二进制序列化 |
FAQ
| 问题 | 解答 |
|---|---|
| Eureka 已停止维护,还能用吗? | 已有项目可继续使用,新项目推荐 Nacos 或 Consul。迁移到 Nacos 成本较低,API 兼容性好。 |
| 客户端 vs 服务端负载均衡如何选? | 客户端(Ribbon/OpenFeign)适合内部调用,无额外网络跳转;服务端(Nginx)适合外部入口。生产环境通常两者配合。 |
| BFF 模式适合什么场景? | 不同客户端对同一服务有差异化数据格式需求时使用。只有一种客户端则不需要。 |