Eureka
Eureka 是 Netflix 开源的 AP 型服务注册与发现组件,是 Spring Cloud Netflix 的核心组件。它采用客户端拉取模式,即使注册中心部分不可用,服务仍可正常通信(自我保护机制)。
架构
┌─────────────────────────────────┐
│ Eureka Server │
│ ┌───────────────────────────┐ │
│ │ 注册表(ConcurrentHashMap)│ │
│ └───────────────────────────┘ │
│ ┌───────────┐ ┌─────────────┐ │
│ │ 对等复制 │ │ 自我保护模式 │ │
│ └───────────┘ └─────────────┘ │
└────────────┬────────────────────┘
│ REST HTTP
┌────────┴────────┐
│ │
┌───┴───┐ ┌───┴────┐
│Service│ │Service │
│Provider │Consumer│
│(Register) │(Fetch) │
└───────┘ └────────┘
| 概念 | 说明 |
|---|---|
| Eureka Server | 注册中心,维护服务注册表 |
| Eureka Client | 服务实例,向 Server 注册并定期拉取注册表 |
| Register(注册) | Client 启动时向 Server 上报实例信息 |
| Renew(心跳) | Client 每 30s 发一次心跳,表示存活 |
| Fetch(拉取) | Client 每 30s 拉取注册表缓存本地 |
| Cancel(下线) | Client 关闭时发送取消注册请求 |
CAP 定位
Eureka 优先保证 A(可用性) 而非 C(一致性):
- 注册表数据最终一致,各节点间通过对等复制同步
- 注册表缓存(服务端 + 客户端)可能有 30s~90s 延迟
- 适合对可用性要求高、能接受短暂数据不一致的场景
自我保护机制
当 Eureka Server 在 15 分钟内收到的心跳数低于阈值(85%),进入自我保护模式:
- 不再剔除长时间未续约的服务实例
- 防止因网络分区导致大规模服务误下线
# Server 端关闭自我保护(开发环境)
eureka:
server:
enable-self-preservation: false
eviction-interval-timer-in-ms: 3000 # 清理间隔快速搭建
Server 端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApp { ... }server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false # Server 本身不注册
fetch-registry: false
service-url:
defaultZone: http://localhost:8761/eureka/Client 端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>spring:
application:
name: order-service
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${server.port}
lease-renewal-interval-in-seconds: 30 # 心跳间隔
lease-expiration-duration-in-seconds: 90 # 剔除超时高可用集群
两个节点互相注册,实现对等复制:
# peer1
eureka:
instance:
hostname: peer1
client:
service-url:
defaultZone: http://peer2:8762/eureka/
# peer2
eureka:
instance:
hostname: peer2
client:
service-url:
defaultZone: http://peer1:8761/eureka/注册表三级缓存
写 读
Registry(实时)
↓ 30s
ReadWriteMap(读写缓存)
↓ 30s
ReadOnlyMap(只读缓存)← Client 拉取
缓存导致服务变更最长需要 90s 才能被全部 Client 感知。
与 Nacos / Consul 对比
| 特性 | Eureka | Nacos | Consul |
|---|---|---|---|
| CAP | AP | AP / CP | CP |
| 配置管理 | 无 | 有 | 有(KV) |
| 健康检查 | 心跳 | 心跳 + TCP + HTTP | TCP / HTTP / Script |
| 多数据中心 | 弱支持 | 支持 | 原生支持 |
| 维护状态 | 停止维护 | 活跃 | 活跃 |
| 推荐程度 | 遗留系统 | 国内首选 | 多云 / 跨语言 |