0%

Eureka简介

Eureka 简介:Spring Cloud 生态的经典服务注册中心

Eureka 是 Netflix 开源的服务发现组件,作为 Spring Cloud 早期推荐的注册中心,凭借高可用性设计和与 Spring 生态的无缝集成,成为微服务架构中服务治理的经典方案。它通过Eureka Server(注册中心)和Eureka Client(服务端 / 客户端)的角色分工,实现服务的注册、发现和健康管理。

Eureka 的核心架构

Eureka 的设计遵循AP 原则(可用性优先,兼顾最终一致性),核心组件包括:

Eureka Server(注册中心)

  • 提供服务注册接口,存储所有可用服务的元数据(IP、端口、状态等);
  • 支持集群部署,通过节点间数据复制实现高可用;
  • 提供 Web 控制台(默认地址 http://localhost:8761),直观展示服务状态。

Eureka Client(服务端 / 客户端)

  • 服务提供者:启动时向 Eureka Server 注册自身信息,定期发送心跳证明可用性;

  • 服务消费者:从 Eureka Server 拉取服务列表并缓存到本地,通过服务名调用接口;

    这种方式可以使得微服务不需要每次请求都查询Eureka Server,从而降低了Eureka Server的压力,如果Eureka Server所有节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者完成调用

  • 内置轮询负载均衡算法,简化服务调用流程。

Eureka 的核心特性

  1. 自我保护机制
    当网络分区导致 Eureka Server 无法收到大部分服务的心跳时,会触发自我保护:

    • 不剔除任何服务实例(避免误判健康服务为失效);
    • 控制台显示警告信息:EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESS THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
    • 适合分布式系统网络不稳定的场景,默认开启(生产环境推荐保留)。
  2. 客户端缓存
    服务消费者会缓存服务列表,即使 Eureka Server 宕机,仍可通过缓存调用服务,降低注册中心压力。

  3. 对等集群
    Eureka Server 集群中无主从之分,节点地位平等,相互同步服务注册表:

    • 任一节点可接收注册请求,异步复制到其他节点;
    • 少数节点故障不影响整体可用性,保证高可用。

    eureka的高可用性,不需要等注册信息replicate到其他节点,也不保证注册信息是否replicate成功,当数据出现不一致时,虽然A,B上的注册信息不完全相同,但每个Eureka节点依然能够正常对外提供服务,这会出现查询服务信息如果请求A查不到,但请求B就能查到

  4. 心跳与剔除机制

    • 服务提供者每 30 秒发送一次心跳(lease-renewal-interval-in-seconds);
    • 若 90 秒未收到心跳(lease-expiration-duration-in-seconds),Eureka Server 会剔除该服务(自我保护关闭时)。

Eureka Server 配置(注册中心)

1. 引入依赖

根据 Spring Cloud 版本选择依赖:

  • Spring Cloud F 版及以上

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
    </dependency>
  • 旧版本(如 Edgware)

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka-server</artifactId>
    </dependency>

2. 启动类配置

通过 @EnableEurekaServer 注解启用注册中心功能:

1
2
3
4
5
6
7
@SpringBootApplication
@EnableEurekaServer // 标记为Eureka Server
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class, args);
}
}

3. 核心配置(application.yml)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
server:
port: 8761 # Eureka Server默认端口

eureka:
instance:
hostname: localhost # 节点主机名(集群时需配置不同名称)
prefer-ip-address: true # 显示IP地址(而非主机名)
server:
enable-self-preservation: true # 开启自我保护(默认true)
eviction-interval-timer-in-ms: 4000 # 服务剔除间隔(默认4000ms)
client:
register-with-eureka: false # 不向自身注册(单节点时)
fetch-registry: false # 不拉取服务列表(单节点时)
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 服务注册地址

# 集群配置示例(3个节点):
# 节点1配置:
# eureka:
# client:
# service-url:
# defaultZone: http://node2:8762/eureka/,http://node3:8763/eureka/
# 节点2和3类似,互相指向其他节点

业务微服务配置(Eureka Client)

1. 引入依赖

  • Spring Cloud F 版及以上

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    </dependency>
  • 旧版本

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>

2. 启动类配置

通过 @EnableEurekaClient@EnableDiscoveryClient 启用服务注册:

1
2
3
4
5
6
7
8
@SpringBootApplication
@EnableEurekaClient // 仅适用于Eureka注册中心
// @EnableDiscoveryClient // 通用注解,支持所有注册中心(如Consul、Zookeeper)
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}

3. 核心配置(application.yml)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server:
port: 8081 # 服务端口

spring:
application:
name: user-service # 服务名称(注册到Eureka的标识)

eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # Eureka Server地址(集群时填多个)
registry-fetch-interval-seconds: 30 # 拉取服务列表间隔(默认30s)
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port} # 实例ID(IP:端口)
prefer-ip-address: true # 注册时使用IP地址
lease-renewal-interval-in-seconds: 10 # 心跳间隔(默认30s)
lease-expiration-duration-in-seconds: 30 # 过期时间(默认90s)

Eureka 的局限性

  1. 停止维护:Netflix 已停止 Eureka 2.x 开发,目前依赖社区维护;
  2. 一致性弱:采用最终一致性,集群节点数据可能短暂不一致;
  3. 功能单一:仅支持服务注册发现,无配置管理、健康检查扩展等功能。

适用场景

  • 中小规模微服务架构,优先保证可用性;
  • 网络环境不稳定,需要自我保护机制的场景;
  • 基于 Spring Cloud 生态,追求快速集成和低学习成本。

总结

Eureka 作为 Spring Cloud 生态的经典注册中心,以 AP 原则为核心,通过自我保护、客户端缓存和对等集群实现高可用性,适合分布式系统中服务动态变化的场景。尽管已停止官方更新,但其设计思想(如客户端缓存、自我保护)对理解服务注册中心仍有重要意义

欢迎关注我的其它发布渠道

表情 | 预览
快来做第一个评论的人吧~
Powered By Valine
v1.3.10