Eureka 服务注册与发现原理和使用

1. Eureka 基础概念

Eureka 是 Netflix 开发的服务注册与发现组件,是 Spring Cloud 微服务架构中的核心模块,用于解决微服务间的自动发现与通信问题。其核心功能包括:

  • 服务注册:服务实例将自身信息(IP、端口、健康状态等)注册到 Eureka Server。
  • 服务发现:服务消费者从 Eureka Server 获取可用服务列表。
  • 服务健康检查:通过心跳机制检测服务实例的存活状态。

2. Eureka 架构原理

1. 核心组件
  • Eureka Server:服务注册中心,维护服务实例列表,提供注册、发现、剔除功能。
  • Eureka Client:分为服务提供者(Producer)和服务消费者(Consumer),负责与 Server 交互。
  • 注册中心集群:多个 Eureka Server 互相复制数据,实现高可用性。
2. 服务注册与发现流程
  1. 服务注册
  • 服务启动时,Client 向 Server 发送注册请求,携带服务元数据(如服务名、IP、端口)。
  • Server 接收请求后,将服务信息存入注册表,并返回注册成功响应。
  1. 心跳续约
  • Client 定期(默认 30 秒)向 Server 发送心跳请求(续约),表明服务存活。
  • 若 Server 超过一定时间(默认 90 秒)未收到心跳,会将服务标记为"过期"并剔除。
  1. 服务发现
  • Consumer 启动时,从 Server 获取服务列表并缓存到本地。
  • Consumer 调用服务时,从本地缓存获取服务实例(通常结合负载均衡算法)。
  1. 服务剔除
  • Server 定期扫描注册表,剔除过期(无心跳)的服务实例。
  • Client 停止服务时,会主动向 Server 发送取消注册请求。
3. 自我保护模式(Self-Preservation Mode)
  • 触发条件:当 Server 检测到大量服务实例心跳失败(如网络分区),会进入自我保护模式。
  • 核心逻辑:暂停剔除服务实例,避免健康服务被误删。
  • 影响:此时 Server 可能包含已失效的服务实例,Consumer 需结合客户端健康检查(如 Ribbon + Hystrix)确保调用有效性。
4. 数据一致性
  • Eureka Server 采用去中心化架构,Server 之间通过异步复制实现数据同步。
  • 因此,服务注册信息可能存在短暂不一致,但满足最终一致性。

3. Eureka 使用详解

1. 环境准备
  • JDK 1.8+
  • Spring Boot 2.x
  • Spring Cloud 对应版本(如 Greenwich、Hoxton)
2. 搭建 Eureka Server
步骤 1:添加 Maven 依赖
复制代码
<dependencies>`
    `<!-- Eureka Server 依赖 -->`
    `<dependency>`
        `<groupId>org.springframework.cloud</groupId>`
        `<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>`
    `</dependency>`
    `<dependency>`
        `<groupId>org.springframework.boot</groupId>`
        `<artifactId>spring-boot-starter-web</artifactId>`
    `</dependency>`
`</dependencies>`
`
步骤 2:配置 application.yml
复制代码
server:`
  `port:` `8761`  `# Eureka Server 端口`

`eureka:`
  `instance:`
    `hostname: localhost  # 本地测试用,生产环境用域名或IP`
  `client:`
    `# 是否将自己注册为服务(Server 本身不需要注册)`
    `register-with-eureka:` `false`
    `# 是否从 Eureka Server 获取服务列表(Server 不需要)`
    `fetch-registry:` `false`
    `# Eureka Server 地址(集群时多个地址用逗号分隔)`
    `service-url:`
      `defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/`
  `server:`
    `# 关闭自我保护模式(生产环境谨慎使用)`
    `enable-self-preservation:` `false`
    `# 剔除过期服务的时间间隔(毫秒)`
    `eviction-interval-timer-in-ms:` `60000`
`
步骤 3:启动类添加注解
复制代码
import` `org.springframework.boot.SpringApplication;`
`import` `org.springframework.boot.autoconfigure.SpringBootApplication;`
`import` `org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;`

`@SpringBootApplication`
`@EnableEurekaServer`  `// 启用 Eureka Server 功能`
`public` `class` `EurekaServerApplication` `{`
    `public` `static` `void` `main(String[] args)` `{`
        `SpringApplication.run(EurekaServerApplication.class, args);`
    `}`
`}`
`
3. 服务提供者(Producer)注册
步骤 1:添加依赖
复制代码
<dependency>`
    `<groupId>org.springframework.cloud</groupId>`
    `<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>`
`</dependency>`
`
步骤 2:配置 application.yml
复制代码
server:`
  `port:` `8081`  `# 服务端口`

`spring:`
  `application:`
    `name: service-producer  # 服务名称,用于注册`

`eureka:`
  `client:`
    `service-url:`
      `defaultZone: http://localhost:8761/eureka/  # Eureka Server 地址`
  `instance:`
    `# 注册到 Eureka 的实例 IP(默认用 hostname,建议显式指定 IP)`
    `ip-address: 127.0.0.1`
    `# 端口是否暴露(用于健康检查)`
    `port:`
      `enable:` `true`
    `# 实例ID格式(服务名+IP+端口)`
    `instance-id: ${spring.application.name}:${eureka.instance.ip-address}:${server.port}`
    `# 心跳续约间隔(秒,默认30秒)`
    `lease-renewal-interval-in-seconds:` `10`
    `# 心跳过期时间(秒,默认90秒)`
    `lease-expiration-duration-in-seconds:` `30`
`
步骤 3:启动类(无需额外注解,自动注册)
4. 服务消费者(Consumer)发现服务
步骤 1:添加依赖(同服务提供者)
复制代码
<dependency>`
    `<groupId>org.springframework.cloud</groupId>`
    `<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>`
`</dependency>`
`<!-- 如需负载均衡,添加 Ribbon 依赖 -->`
`<dependency>`
    `<groupId>org.springframework.cloud</groupId>`
    `<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>`
`</dependency>`
`
步骤 2:配置 application.yml
复制代码
server:`
  `port:` `8082`

`spring:`
  `application:`
    `name: service-consumer`

`eureka:`
  `client:`
    `service-url:`
      `defaultZone: http://localhost:8761/eureka/`

`# 示例:使用 Ribbon 进行负载均衡调用`
`@Configuration`
`public class RibbonConfig {`
`    @Bean`
`    @LoadBalanced  // 开启负载均衡`
`    public RestTemplate restTemplate() {`
`        return new RestTemplate();`
    `}`
`}`

`// 服务调用示例`
`@Service`
`public class UserService {`
`    @Autowired`
`    private RestTemplate restTemplate;`
    
`    public String getUser() {`
`        // 通过服务名调用(Ribbon 自动选择实例)`
`        return restTemplate.getForObject("http://service-producer/user/1", String.class);`
    `}`
`}`
`
5. 高可用集群部署
  • 原理:多个 Eureka Server 互相注册,形成集群(如 Server A 注册到 Server B,Server B 注册到 Server A)。
  • 配置示例(Server A 的 application.yml):
复制代码
eureka:`
  `client:`
    `service-url:`
      `defaultZone: http://serverB:8762/eureka/  # 注册到 Server B`
`
  • 注意:生产环境建议使用域名或负载均衡器指向集群,避免硬编码多个地址。

4. Eureka 核心参数调优

|------------------------------------------------------|----------------------------------|---------|-----------|
| 参数名 | 作用 | 默认值 | 建议生产值 |
| eureka.instance.lease-renewal-interval-in-seconds | 心跳续约间隔(秒),缩短可加快服务状态更新,但增加网络开销 | 30 | 10-15 |
| eureka.instance.lease-expiration-duration-in-seconds | 心跳过期时间(秒),超过此时间未收到心跳则剔除服务 | 90 | 30-45 |
| eureka.server.eviction-interval-timer-in-ms | 剔除过期服务的扫描间隔(毫秒) | 60000 | 30000 |
| eureka.server.enable-self-preservation | 是否开启自我保护模式,生产环境建议开启,避免网络波动导致服务误删 | true | true |
| eureka.client.registry-fetch-interval-seconds | 服务消费者获取服务列表的间隔(秒) | ||

5. Eureka 与其他服务发现组件对比

|--------|--------------|-----------------|---------------------|-------------------|
| 组件 | 一致性模型 | 健康检查方式 | 支持功能 | 社区活跃度 |
| Eureka | 最终一致性 | 客户端心跳(主动) | 服务注册发现、自我保护 | 较低(Netflix 已停止维护) |
| Consul | 强一致性(Raft) | 客户端心跳 + 服务端主动检查 | 服务注册、健康检查、配置中心、服务网格 | 高 |
| Nacos | 最终一致性 / 强一致性 | 客户端心跳 + 服务端主动检查 | 服务注册、配置中心、流量管理 | 高(阿里维护) |

6. 注意事项

  1. 生产环境建议
  • 开启自我保护模式(`enable-self-preservation: true`)。
  • 部署至少 3 个 Eureka Server 节点形成集群。
  • 结合客户端健康检查(如 Ribbon + Hystrix)处理失效服务。
  1. Netflix 停止维护
  • Eureka 1.x 已进入维护模式,建议新项目考虑 Consul 或 Nacos。
  • Spring Cloud 已推出 `spring-cloud-starter-cloud-eureka` 适配 Eureka 2.x(需自行构建)。
  1. 服务发现优化
  • 服务消费者启用本地缓存(Eureka 自动实现),减少对 Server 的调用压力。
  • 大型系统中按业务域拆分注册中心,避免单中心负载过高。
相关推荐
清水白石0087 分钟前
深入解析 LRU 缓存:从 `@lru_cache` 到手动实现的完整指南
java·python·spring·缓存
符哥200820 分钟前
C++ 进阶知识点整理
java·开发语言·jvm
Sayuanni%332 分钟前
初阶_多线程1(线程含义与关键属性)
java
程序媛徐师姐33 分钟前
Java基于微信小程序的模拟考试系统,附源码+文档说明
java·微信小程序·java模拟考试系统小程序·模拟考试微信小程序·模拟考试系统小程序·模拟考试小程序·java模拟考试小程序
疯狂敲代码的老刘42 分钟前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
夕除44 分钟前
js--15
java·jvm·spring
曾经的三心草1 小时前
redis-9-集群
java·redis·mybatis
sun03221 小时前
【架构基础】Spring中的PropertySourcesPlaceholderConfigurer介绍 (并非新知识,比较古老的一种使用方式)
java·spring·架构
MrSYJ1 小时前
Redis 做分布式 Session
后端·spring cloud·微服务
chilavert3181 小时前
技术演进中的开发沉思-356:重排序(中)
java·开发语言