在微服务架构席卷企业级开发的今天,服务注册与发现是微服务通信的 "通讯录"------ 它让分散的服务能够自动找到彼此,无需人工配置地址。而 Spring Cloud Netflix Eureka,作为 Netflix 开源体系中成熟的服务发现组件,凭借其高可用性、易用性,成为了许多微服务项目的首选。本文将从微服务架构演进入手,逐步深入 Eureka 的核心原理、实操搭建与集群优化,带你系统性掌握这一核心工具。
目录
[1.1 三代架构对比](#1.1 三代架构对比)
[1.2 分布式与集群的区别](#1.2 分布式与集群的区别)
[二、Spring Cloud:微服务的 "全家桶" 框架](#二、Spring Cloud:微服务的 “全家桶” 框架)
[2.1 Spring Cloud 三大体系](#2.1 Spring Cloud 三大体系)
[2.2 核心组件对比(Netflix vs Alibaba vs 原生)](#2.2 核心组件对比(Netflix vs Alibaba vs 原生))
[三、Spring Cloud 版本号:避坑关键](#三、Spring Cloud 版本号:避坑关键)
[3.1 版本命名规则](#3.1 版本命名规则)
[3.2 Spring Cloud 与 Spring Boot 版本兼容](#3.2 Spring Cloud 与 Spring Boot 版本兼容)
[四、Eureka 核心:服务注册与发现的基石](#四、Eureka 核心:服务注册与发现的基石)
[4.1 Eureka 的核心角色](#4.1 Eureka 的核心角色)
[4.2 CAP 定理与 Eureka 的选择](#4.2 CAP 定理与 Eureka 的选择)
[五、实操:搭建单机版 Eureka Server](#五、实操:搭建单机版 Eureka Server)
[5.1 第一步:添加 POM 依赖](#5.1 第一步:添加 POM 依赖)
[5.2 第二步:配置 application.yml](#5.2 第二步:配置 application.yml)
[5.3 第三步:编写启动类](#5.3 第三步:编写启动类)
[5.4 第四步:访问 Eureka 管理平台](#5.4 第四步:访问 Eureka 管理平台)
[六、实操:搭建 Eureka Client(服务注册)](#六、实操:搭建 Eureka Client(服务注册))
[6.1 第一步:添加 POM 依赖](#6.1 第一步:添加 POM 依赖)
[6.2 第二步:配置 application.yml](#6.2 第二步:配置 application.yml)
[6.3 第三步:编写启动类](#6.3 第三步:编写启动类)
[6.4 第四步:验证注册结果](#6.4 第四步:验证注册结果)
[七、进阶:搭建 Eureka 高可用集群](#七、进阶:搭建 Eureka 高可用集群)
[7.1 集群核心原理](#7.1 集群核心原理)
[7.2 集群搭建步骤(Windows + Linux 伪集群)](#7.2 集群搭建步骤(Windows + Linux 伪集群))
[步骤 1:添加打包插件(POM)](#步骤 1:添加打包插件(POM))
[步骤 2:编写多环境配置文件](#步骤 2:编写多环境配置文件)
[步骤 3:配置 hosts 文件(关键)](#步骤 3:配置 hosts 文件(关键))
[步骤 4:打包并启动集群](#步骤 4:打包并启动集群)
[步骤 5:Client 注册到集群](#步骤 5:Client 注册到集群)
[八、Eureka 核心特性:自我保护机制](#八、Eureka 核心特性:自我保护机制)
[8.1 触发条件](#8.1 触发条件)
[8.2 保护机制内容](#8.2 保护机制内容)
[8.3 配置自我保护(默认开启)](#8.3 配置自我保护(默认开启))
[九、补充:Spring Boot 应用优雅关闭](#九、补充:Spring Boot 应用优雅关闭)
[9.1 步骤 1:添加 Actuator 依赖](#9.1 步骤 1:添加 Actuator 依赖)
[9.2 步骤 2:配置优雅关闭端点](#9.2 步骤 2:配置优雅关闭端点)
[9.3 步骤 3:测试优雅关闭](#9.3 步骤 3:测试优雅关闭)
[十、总结:Eureka 的核心价值与使用建议](#十、总结:Eureka 的核心价值与使用建议)
一、应用架构的演进:从单体到微服务
要理解 Eureka 的价值,首先需要回顾应用架构的变迁 ------ 每一次架构升级,都源于业务对 "效率" 和 "稳定性" 的更高需求。
1.1 三代架构对比
架构类型 | 核心特点 | 优点 | 缺点 | 适用场景 |
---|---|---|---|---|
单体架构 | 所有代码打包为一个应用,部署在单一服务器 | 部署简单、开发成本低、维护方便 | 并发瓶颈明显、改动影响全局、无法弹性伸缩 | 小型管理系统、早期互联网项目 |
SOA 架构 | 按功能拆分为服务,通过 ESB(企业服务总线)集成 | 松耦合、服务可重用、支持中大型团队协作 | ESB 笨重、服务粒度粗、集中式扩容效率低 | 中大型企业传统系统 |
微服务架构 | 按业务拆分为独立服务,轻量通信、自动化部署 | 粒度细(2Pizza 团队)、弹性伸缩、快速迭代(TTM 按天 / 周) | 分布式复杂度高、部署 / 监控成本高、需解决分布式事务 | 互联网项目、大型企业系统 |

1.2 分布式与集群的区别
很多人会混淆 "分布式" 和 "集群",这里明确二者核心差异:
- 分布式 :软件架构层面------ 将一个项目拆分为多个独立服务,每个服务部署在不同服务器(如订单服务、用户服务分别部署)。
- 集群 :部署层面 ------ 将同一个服务部署到多台服务器,共同承担流量(如 2 台服务器都部署 Eureka Server)。若同一服务部署在一台服务器的多个进程中,称为 "伪集群"(适合学习测试)。
二、Spring Cloud:微服务的 "全家桶" 框架

微服务架构需要解决服务注册、配置管理、负载均衡等问题,而 Spring Cloud 正是整合了这些能力的 "工具集"------ 它基于 Spring Boot,封装了 Netflix、Alibaba 等厂商的成熟组件,让开发者无需重复造轮子。
2.1 Spring Cloud 三大体系
当前主流的 Spring Cloud 体系分为三类,核心差异在于组件来源:
体系 | 核心特点 | 代表组件 | 适用场景 |
---|---|---|---|
Spring Cloud Netflix | 最成熟、使用最广,Netflix 开源组件封装 | Eureka(服务治理)、Ribbon(负载均衡)、Hystrix(容错) | 传统微服务项目、对稳定性要求高的场景 |
Spring Cloud Alibaba | 基于 Dubbo,适配阿里云生态 | Nacos(服务治理)、Sentinel(容错)、Seata(分布式事务) | 阿里云用户、需要 Dubbo RPC 支持的场景 |
Spring Cloud 原生 | 摆脱 Netflix 依赖,社区自研 | Consul(服务治理)、Gateway(网关)、Config(配置) | 追求轻量、避免厂商绑定的场景 |
2.2 核心组件对比(Netflix vs Alibaba vs 原生)
应用领域 | Netflix 组件 | Alibaba 组件 | Spring / 其他开源组件 |
---|---|---|---|
服务治理 | Eureka | Nacos、Dubbo(RPC) | Consul |
负载均衡 | Ribbon | - | Spring Cloud LoadBalancer |
服务调用 | OpenFeign | Dubbo | - |
服务容错 | Hystrix+Turbine+Dashboard | Sentinel | - |
服务网关 | Zuul | - | Gateway |
配置管理 | Archaius | Alibaba Cloud ACM | Config |
链路追踪 | - | - | Sleuth+Zipkin |
三、Spring Cloud 版本号:避坑关键
Spring Cloud 的版本命名规则特殊,且与 Spring Boot 版本强绑定 ------ 用错版本会导致依赖冲突,这是新手最容易踩的坑。
3.1 版本命名规则
Spring Cloud 主版本经历了两个阶段:
- 伦敦地铁站命名 (早期):按首字母升序排列,如
Angle
→Brixton
→Hoxton
(最后一个地铁站版本)。 - 年份命名 (Hoxton 之后):如
2020.0.x
、2021.0.x
,更直观。
每个主版本包含 "阶段版本",代表开发进度:
阶段版本 | 含义 | 稳定性 | 推荐度 |
---|---|---|---|
BUILD-SNAPSHOT | 开发快照版,频繁更新 | 极低(含未修复 BUG) | 不推荐(仅内部测试) |
GA | 通用可用版,基本稳定 | 中等(可能有隐藏 BUG) | 不推荐商业使用 |
PRE(M1/M2) | 里程碑版,修复 GA 的部分 BUG | 较高 | 测试环境可用 |
RC | 候选发布版,仅修复高危 BUG | 高 | 预生产环境可尝试 |
SR | 正式发布版,修复 RC 的 BUG | 极高 | 推荐生产环境使用 |
3.2 Spring Cloud 与 Spring Boot 版本兼容

Spring Cloud 版本 | 支持的 Spring Boot 版本 |
---|---|
2020.0.x(Ilford) | 2.4.x、2.5.x(2020.0.3 + 支持 2.5.x) |
Hoxton | 2.2.x、2.3.x(SR5 + 支持 2.3.x) |
Greenwich | 2.1.x |
Finchley | 2.0.x |
Edgware | 1.5.x |
注意 :本文所有实操基于Spring Cloud Hoxton.SR12
+ Spring Boot 2.3.12.RELEASE
(稳定 SR 版,适合学习)。
四、Eureka 核心:服务注册与发现的基石
Eureka 是 Netflix 开源的服务注册中心,核心作用是 "记录服务地址"------ 让服务消费者能找到服务提供者,无需硬编码 IP。

4.1 Eureka 的核心角色
Eureka 分为两大角色,所有角色本质都是 Spring Boot 应用:
-
Eureka Server:服务注册中心
- 负责接收 Client 的注册请求,存储服务信息(如服务名、IP、端口)。
- 类似 "通讯录服务器",管理所有服务的联系方式。
-
Eureka Client:所有需要注册的微服务
- 分为Application Service (服务提供者,如订单服务)和Application Client(服务消费者,如用户服务),但角色是相对的:例:用户服务调用订单服务时,用户服务是 Client,订单服务是 Service;若订单服务调用支付服务,订单服务又变成 Client。
- 所有 Client 启动后会自动向 Server 注册,并定期发送 "心跳" 证明存活。
4.2 CAP 定理与 Eureka 的选择
在分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition Tolerance)三者不可兼得,而分区容错性(网络故障时系统仍可用)是分布式系统的必选项,因此只能在 A 和 C 之间权衡。
Eureka 选择了AP(可用性优先),这是它与 Zookeeper(CP,一致性优先)的核心差异:
- 可用性(A):Eureka 集群中只要有一个 Server 存活,就能接收注册和查询请求;自我保护机制(后文详解)也会避免因网络波动误删服务。
- 一致性(C):Eureka Server 之间通过 "Replicate" 同步数据,但同步是异步的 ------ 可能存在短暂的服务信息不一致,但最终会一致,属于 "最终一致性"。
五、实操:搭建单机版 Eureka Server
单机版适合学习测试,步骤分为 "依赖配置→启动类→访问验证" 三步。
5.1 第一步:添加 POM 依赖
需指定 Spring Boot 父工程、Spring Cloud 依赖管理,以及 Eureka Server 启动器:
<!-- 1. Spring Boot父工程(统一版本) -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<!-- 2. Spring Cloud依赖管理(统一子组件版本) -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 3. Eureka Server启动器 -->
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
5.2 第二步:配置 application.yml
核心配置:端口(默认 8761)、关闭自我注册(单机版无需注册自己):
server:
port: 8761 # Eureka默认端口,可修改(非默认需额外配置defaultZone)
eureka:
client:
# 单机版Server无需向自己注册
register-with-eureka: false
# 单机版无需同步其他Server数据
fetch-registry: false
# 若端口非8761,需配置此地址:defaultZone: http://localhost:${server.port}/eureka/
5.3 第三步:编写启动类
添加@EnableEurekaServer
注解,声明这是 Eureka Server:
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);
}
}
5.4 第四步:访问 Eureka 管理平台
启动应用后,访问 http://localhost:8761
,即可看到管理界面,核心模块包括:
- System Status:系统状态(如运行时间、心跳延迟)。
- DS Replicas:集群节点列表(单机版为空)。
- Instances currently registered with Eureka:已注册的服务列表(单机版初始为空)。
六、实操:搭建 Eureka Client(服务注册)
Eureka Client 是需要注册的微服务(如用户服务),步骤与 Server 类似,但配置和注解不同。
6.1 第一步:添加 POM 依赖
需包含 Web 启动器(微服务需提供 HTTP 接口)和 Eureka Client 启动器:
<!-- 1. 同Server:Spring Boot父工程 + Spring Cloud依赖管理 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.12.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!-- 2. 核心依赖:Web + Eureka Client -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
6.2 第二步:配置 application.yml
核心配置:服务名(注册到 Server 的名称,不能含下划线)、Server 地址:
spring:
application:
name: eureka-client # 服务名,后续消费者通过此名调用
server:
port: 8080 # Client的端口(自定义,避免与Server冲突)
eureka:
client:
# 注册中心地址(默认是http://localhost:8761/eureka/,可省略)
service-url:
defaultZone: http://localhost:8761/eureka/
6.3 第三步:编写启动类
@EnableEurekaClient
注解可省略(Spring Boot 2.x 后自动识别 Client 依赖),但显式添加更清晰:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient // 声明为Eureka Client(可省略)
public class EurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaClientApplication.class, args);
}
}
6.4 第四步:验证注册结果
启动 Client 后,刷新 Eureka Server 管理平台(http://localhost:8761
),在 "Instances currently registered with Eureka" 中会看到注册的服务:


Application | Status |
---|---|
EUREKA-CLIENT | UP (1) - 主机名:eureka-client:8080 |
- UP:服务正常存活。
- 主机名:Client 所在服务器的主机名。
七、进阶:搭建 Eureka 高可用集群
单机版 Server 存在单点故障风险,生产环境必须用集群 ------Eureka 集群通过 "互相注册" 实现数据同步,确保任意一个 Server 故障,其他 Server 仍可用。
7.1 集群核心原理
- 数据同步:所有 Server 之间通过 "Replicate" 异步同步服务信息,最终所有 Server 存储的服务列表一致。
- Client 注册:Client 向集群中任意一个 Server 注册,信息会同步到所有 Server;Client 查询服务时,也可访问任意一个 Server。

7.2 集群搭建步骤(Windows + Linux 伪集群)
以 "2 节点集群" 为例,步骤分为 "配置多环境→打包→修改 hosts→启动"。
步骤 1:添加打包插件(POM)
集群需要将 Server 打包为 Jar,在不同环境启动,需添加 Spring Boot 打包插件:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
步骤 2:编写多环境配置文件
创建两个配置文件(application-windows.yml
和application-linux.yml
),核心是 "应用名一致、互相注册":
1.application-windows.yml(Windows 节点):
spring:
application:
name: eureka-server-cluster # 集群所有节点应用名必须一致!
server:
port: 8761
eureka:
instance:
hostname: eureka-windows # 自定义主机名
client:
service-url:
# 注册到Linux节点
defaultZone: http://eureka-linux:8761/eureka/
2.application-linux.yml(Linux 节点):
spring:
application:
name: eureka-server-cluster # 与Windows节点一致
server:
port: 8761
eureka:
instance:
hostname: eureka-linux # 自定义主机名
client:
service-url:
# 注册到Windows节点
defaultZone: http://eureka-windows:8761/eureka/
步骤 3:配置 hosts 文件(关键)
Windows 和 Linux 需通过 "自定义主机名" 访问彼此,需修改 hosts 文件:
- Windows :修改
C:\Windows\System32\drivers\etc\hosts
- Linux :修改
/etc/hosts
添加内容(替换为实际 IP):
192.168.1.100 eureka-windows # Windows节点IP
192.168.1.101 eureka-linux # Linux节点IP
步骤 4:打包并启动集群
-
打包 :执行 Maven 命令
mvn clean package
,生成 Jar 包(如eureka-server-1.0-SNAPSHOT.jar
)。 -
启动 Windows 节点 :
java -jar -Dspring.profiles.active=windows eureka-server-1.0-SNAPSHOT.jar
-
启动 Linux 节点 :
java -jar -Dspring.profiles.active=linux eureka-server-1.0-SNAPSHOT.jar
步骤 5:Client 注册到集群
修改 Client 的application.yml
,将defaultZone
改为集群所有节点地址:
eureka:
client:
service-url:
# 优先向第一个节点注册,失败则切换到第二个
defaultZone: http://eureka-windows:8761/eureka/,http://eureka-linux:8761/eureka/
八、Eureka 核心特性:自我保护机制
Eureka 的自我保护机制是其 "高可用性" 的关键,用于避免因网络波动误删正常服务。
8.1 触发条件
当 Eureka Server 在15 分钟内收到的 Client 心跳数低于 85% 时,判定为 "网络分区故障"(如 Client 与 Server 之间网络中断),触发自我保护。
8.2 保护机制内容
- 不再删除 "无心跳" 的服务实例(即使超过 90 秒过期时间)。
- 不再向其他 Server 同步服务信息(避免错误信息扩散)。
- 允许 Client 继续查询服务(返回本地缓存的信息)。
当网络恢复后,Server 会自动退出自我保护模式,同步服务信息。
8.3 配置自我保护(默认开启)
-
关闭自我保护 (不推荐,仅测试用):
eureka: server: enable-self-preservation: false # 关闭自我保护 eviction-interval-timer-in-ms: 10000 # 10秒扫描一次失效服务
-
修改心跳 / 过期时间 (不推荐默认值):
eureka: instance: lease-renewal-interval-in-seconds: 30 # Client发送心跳间隔(默认30秒) lease-expiration-duration-in-seconds: 90 # Server判定Client过期时间(默认90秒)
九、补充:Spring Boot 应用优雅关闭
微服务部署时,直接 kill 进程可能导致请求中断或数据丢失,需通过 "优雅关闭" 确保服务完成当前请求后再停止。Spring Boot 的 Actuator 组件可实现此功能。
9.1 步骤 1:添加 Actuator 依赖
Eureka Server/Client 默认已依赖 Actuator,若未包含需手动添加:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
9.2 步骤 2:配置优雅关闭端点
在application.yml
中暴露shutdown
端点(仅支持 POST 请求):
management:
endpoints:
enabled-by-default: true # 开启所有默认端点
web:
exposure:
include: shutdown # 暴露shutdown端点(*代表所有)
9.3 步骤 3:测试优雅关闭
发送 POST 请求到 http://IP:Port/actuator/shutdown
,示例(用 Postman 或 curl):
curl -X POST http://localhost:8761/actuator/shutdown
成功响应:
{
"message": "Shutting down, bye..."
}
十、总结:Eureka 的核心价值与使用建议
Eureka 作为 Spring Cloud Netflix 体系的核心组件,其核心价值在于 "高可用的服务注册与发现"------ 通过 AP 架构、自我保护机制、集群同步,确保微服务在复杂网络环境下稳定通信。
使用建议:
- 版本选择:优先使用 SR 版(如 Hoxton.SR12),并确保与 Spring Boot 版本兼容。
- 集群配置:生产环境至少 2 个节点,应用名一致、互相注册,修改 hosts 避免 IP 硬编码。
- 自我保护:默认开启,不建议随意关闭(除非明确是服务下线而非网络故障)。
- 服务命名 :Eureka Client 的
spring.application.name
不能含下划线,否则可能注册失败。
通过本文的学习,你已掌握 Eureka 从理论到实操的核心知识点,接下来可结合 Ribbon(负载均衡)、OpenFeign(服务调用),进一步搭建完整的微服务链路。