Eureka

Eureka 是 Netflix 开源的 AP 型服务注册与发现组件,是 Spring Cloud Netflix 的核心组件。它采用客户端拉取模式,即使注册中心部分不可用,服务仍可正常通信(自我保护机制)。

Eureka 2.x 开发已停止,官方建议迁移至 NacosConsul

架构

┌─────────────────────────────────┐
│         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 对比

特性EurekaNacosConsul
CAPAPAP / CPCP
配置管理有(KV)
健康检查心跳心跳 + TCP + HTTPTCP / HTTP / Script
多数据中心弱支持支持原生支持
维护状态停止维护活跃活跃
推荐程度遗留系统国内首选多云 / 跨语言

相关链接