当前位置: 首页 > news >正文

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

        在微服务架构席卷企业级开发的今天,服务注册与发现是微服务通信的 “通讯录”—— 它让分散的服务能够自动找到彼此,无需人工配置地址。而 Spring Cloud Netflix Eureka,作为 Netflix 开源体系中成熟的服务发现组件,凭借其高可用性、易用性,成为了许多微服务项目的首选。本文将从微服务架构演进入手,逐步深入 Eureka 的核心原理、实操搭建与集群优化,带你系统性掌握这一核心工具。

目录

一、应用架构的演进:从单体到微服务

1.1 三代架构对比

1.2 分布式与集群的区别

二、Spring Cloud:微服务的 “全家桶” 框架

2.1 Spring Cloud 三大体系

2.2 核心组件对比(Netflix vs Alibaba vs 原生)

三、Spring Cloud 版本号:避坑关键

3.1 版本命名规则

3.2 Spring Cloud 与 Spring Boot 版本兼容

四、Eureka 核心:服务注册与发现的基石

4.1 Eureka 的核心角色

4.2 CAP 定理与 Eureka 的选择

五、实操:搭建单机版 Eureka Server

5.1 第一步:添加 POM 依赖

5.2 第二步:配置 application.yml

5.3 第三步:编写启动类

5.4 第四步:访问 Eureka 管理平台

六、实操:搭建 Eureka Client(服务注册)

6.1 第一步:添加 POM 依赖

6.2 第二步:配置 application.yml

6.3 第三步:编写启动类

6.4 第四步:验证注册结果

七、进阶:搭建 Eureka 高可用集群

7.1 集群核心原理

7.2 集群搭建步骤(Windows + Linux 伪集群)

步骤 1:添加打包插件(POM)

步骤 2:编写多环境配置文件

步骤 3:配置 hosts 文件(关键)

步骤 4:打包并启动集群

步骤 5:Client 注册到集群

八、Eureka 核心特性:自我保护机制

8.1 触发条件

8.2 保护机制内容

8.3 配置自我保护(默认开启)

九、补充:Spring Boot 应用优雅关闭

9.1 步骤 1:添加 Actuator 依赖

9.2 步骤 2:配置优雅关闭端点

9.3 步骤 3:测试优雅关闭

十、总结: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 / 其他开源组件
服务治理EurekaNacos、Dubbo(RPC)Consul
负载均衡Ribbon-Spring Cloud LoadBalancer
服务调用OpenFeignDubbo-
服务容错Hystrix+Turbine+DashboardSentinel-
服务网关Zuul-Gateway
配置管理ArchaiusAlibaba Cloud ACMConfig
链路追踪--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)
Hoxton2.2.x、2.3.x(SR5 + 支持 2.3.x)
Greenwich2.1.x
Finchley2.0.x
Edgware1.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” 中会看到注册的服务:

ApplicationStatus
EUREKA-CLIENTUP (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(服务调用),进一步搭建完整的微服务链路。

http://www.dtcms.com/a/441818.html

相关文章:

  • 网站建设 人天价格游戏制作软件免费下载
  • CSP-S2025复赛模拟4补题报告(无AC code)
  • 什么是Agent及其在人工智能中的角色
  • 爱授权系统V3.0免授权版 支持插件和插件商城
  • MySQL 本机压测分析
  • 华清远见25072班C++学习假期10.4作业
  • 建网站学什么软件全国医院的网站建设
  • 【深度学习计算机视觉】09:语义分割和数据集——应用场景与前沿探索
  • 【LeetCode热题100】No.1——两数之和(Java)
  • 系分论文《论边缘计算在工业质检系统中的分析与设计》
  • 利用 ArcMap 的 MXD 布局视图以及ArcPy 脚本实现批量自动生成油井点之记并导出 PDF(实操+亲测)
  • 计算机工作原理(简单介绍)
  • 自己如何建设网站聊天室做医药代表去什么招聘网站
  • 指针和数组解析
  • 【AI4S】3DSMILES-GPT:基于词元化语言模型的3D分子生成
  • Transformer推理优化全景:从模型架构到硬件底层的深度解析
  • MySQL 索引全解析:结构、优化与索引下推实战指南​
  • clear configuration interface概念及题目
  • 设计模式(C++)详解——策略模式(1)
  • 基于html5设计的网站建设做一些购物网站
  • Vivado综合通关指南:从IP打包失败到工具崩溃的四重考验
  • 语义分割概述
  • 数据结构之排序算法
  • 绍兴网站建设优化手机企业网站建设开发
  • 偏导数解释
  • Linux内核与设备管理:USB存储驱动usb_storage/uas的安全卸载与复原
  • fallocate: fallocate failed: Text file busy
  • visio实现扇形图绘制的方式方法-以三等分扇形为例
  • 以太坊私有链搭建与智能合约部署指南
  • 网站开发 教学大纲网页设计图片与图片的位置