Spring Cloud Netflix Eureka:从微服务基础到高可用集群实战

在微服务架构席卷企业级开发的今天,服务注册与发现是微服务通信的 "通讯录"------ 它让分散的服务能够自动找到彼此,无需人工配置地址。而 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 主版本经历了两个阶段:

  1. 伦敦地铁站命名 (早期):按首字母升序排列,如AngleBrixtonHoxton(最后一个地铁站版本)。
  2. 年份命名 (Hoxton 之后):如2020.0.x2021.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 应用:

  1. Eureka Server:服务注册中心

    • 负责接收 Client 的注册请求,存储服务信息(如服务名、IP、端口)。
    • 类似 "通讯录服务器",管理所有服务的联系方式。
  2. 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.ymlapplication-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:打包并启动集群
  1. 打包 :执行 Maven 命令 mvn clean package,生成 Jar 包(如eureka-server-1.0-SNAPSHOT.jar)。

  2. 启动 Windows 节点

    复制代码
    java -jar -Dspring.profiles.active=windows eureka-server-1.0-SNAPSHOT.jar
  3. 启动 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 保护机制内容

  1. 不再删除 "无心跳" 的服务实例(即使超过 90 秒过期时间)。
  2. 不再向其他 Server 同步服务信息(避免错误信息扩散)。
  3. 允许 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 架构、自我保护机制、集群同步,确保微服务在复杂网络环境下稳定通信。

使用建议:

  1. 版本选择:优先使用 SR 版(如 Hoxton.SR12),并确保与 Spring Boot 版本兼容。
  2. 集群配置:生产环境至少 2 个节点,应用名一致、互相注册,修改 hosts 避免 IP 硬编码。
  3. 自我保护:默认开启,不建议随意关闭(除非明确是服务下线而非网络故障)。
  4. 服务命名 :Eureka Client 的spring.application.name不能含下划线,否则可能注册失败。

通过本文的学习,你已掌握 Eureka 从理论到实操的核心知识点,接下来可结合 Ribbon(负载均衡)、OpenFeign(服务调用),进一步搭建完整的微服务链路。

相关推荐
K_i1345 小时前
K8s集群CNI升级:Calico3.28.2安装全攻略
云原生·容器·kubernetes
2501_920047036 小时前
k8s-RBAC鉴权
云原生·容器·kubernetes
TGITCIC7 小时前
SpringCloud API Gateway2.0如何解决docker中应用间IP漂移的正确手法
spring cloud·docker·云原生·本地镜像·api gateway
月夕·花晨11 小时前
Gateway-过滤器
java·分布式·spring·spring cloud·微服务·gateway·sentinel
腾讯数据架构师17 小时前
大模型openai服务网关,认证,限流,接口输入输出的修正,监控等功能
云原生·kubernetes·ai平台
罗亚方舟20 小时前
微服务故障排查
微服务·云原生·架构
SirLancelot121 小时前
MinIO-基本介绍(一)基本概念、特点、适用场景
后端·云原生·中间件·容器·aws·对象存储·minio
hello_2501 天前
云原生架构与GitOps技术栈介绍
云原生·架构
Lin_Aries_04211 天前
基于 CI/CD 平台将应用程序自动部署到 Kubernetes 集群
运维·ci/cd·docker·云原生·容器·kubernetes·jenkins