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

SpringCloud学习-------Eureka详解

        在微服务架构中,服务之间的通信是核心需求之一。随着服务数量的增多,如何高效地管理服务地址、实现服务间的动态发现成为关键问题。Eureka 作为 SpringCloud 生态中重要的服务注册与发现组件,很好地解决了这一难题。那么,什么是Eureka 呢​?

        Eureka 是 Netflix 开源的一款基于 REST 的服务注册与发现组件,后被整合到 SpringCloud 生态中,成为 SpringCloud Netflix 子项目的重要组成部分。它主要用于实现微服务架构中的服务注册与发现功能,帮助微服务之间进行高效的通信。​Eureka 由两个核心部分组成:​

(1)Eureka Server(服务端):也称为服务注册中心,主要负责接收客户端的服务注册请求,存储服务的元数据信息(如服务名称、IP 地址、端口号等),并为客户端提供服务发现的功能。​

(2)Eureka Client(客户端):每个微服务都可以作为 Eureka Client,它会向 Eureka Server 注册自己的服务信息,并定期发送心跳来续约服务,同时也能从 Eureka Server 获取注册的服务列表,以便实现服务间的调用。​

        Eureka 的核心原理围绕服务注册、续约、下线、注册表同步以及 CAP 理论选择等方面展开。其具体内容如下:​

(1)服务注册​

        当 Eureka Client 启动时,会通过发送 REST 请求的方式向 Eureka Server 注册自己的服务信息。注册时需要提供服务的名称、IP 地址、端口号等元数据。Eureka Server 接收到注册请求后,会将这些信息存储在一个双层 Map 结构中,第一层 key 是服务名称,第二层 key 是服务实例的唯一标识,value 则是服务实例的详细信息。​

(2)服务续约​

        Eureka Client 注册成功后,会定期(默认 30 秒)向 Eureka Server 发送心跳请求以续约服务。通过续约机制,Eureka Server 可以知道服务实例是否正常运行。如果 Eureka Server 在一定时间内(默认 90 秒)没有收到某个服务实例的心跳,就会将该服务实例从服务注册表中移除。​

(3)服务下线​

        当 Eureka Client 正常关闭时,它会主动向 Eureka Server 发送下线请求。Eureka Server 接收到下线请求后,会将该服务实例从服务注册表中删除,以保证服务注册表中的信息是最新的。​

(4)注册表同步​

        Eureka Server 集群中的各个节点之间会定期进行注册表的同步,以确保每个节点上的服务注册表信息保持一致。当一个 Eureka Server 接收到新的服务注册或服务状态变更时,会将这些信息同步到集群中的其他节点。​

(5)CAP 理论选择​

        在分布式系统的 CAP 理论(一致性、可用性、分区容错性)中,Eureka 选择了AP 架构,即优先保证可用性和分区容错性,而在一定程度上牺牲一致性。当 Eureka Server 集群中出现网络分区故障时,每个节点仍然可以独立地提供服务注册和发现功能,不会因为部分节点不可用而导致整个注册中心瘫痪。不过,这可能会导致在短时间内不同节点上的服务注册表信息不一致,但随着网络的恢复,注册表信息会逐渐同步一致。​

        Eureka作用主要有:

(1)动态服务发现​:在微服务架构中,服务的数量和地址可能会经常变化(如服务扩容、缩容、迁移等)。Eureka 能够实时感知服务的变化,客户端可以通过 Eureka Server 获取最新的服务列表,从而实现服务间的动态调用,无需人工干预服务地址的配置。​

(2)支持负载均衡​:Eureka 客户端从服务注册中心获取服务列表后,可以结合 SpringCloud 中的 Ribbon 等负载均衡组件,实现服务调用的负载均衡。Ribbon 会根据一定的负载均衡策略(如轮询、随机等)从服务列表中选择一个合适的服务实例进行调用,提高系统的可用性和性能。​

(3)高可用设计​:Eureka Server 可以通过集群部署的方式实现高可用。多个 Eureka Server 节点之间相互注册,形成一个集群。当其中一个节点出现故障时,其他节点可以继续提供服务注册和发现功能,避免了单点故障问题,保证了整个服务注册中心的稳定运行。​

        Eureka具有许多优点,例如:​

(1)高可用性:Eureka 采用 AP 架构,支持集群部署,能够在部分节点故障的情况下仍然正常工作,保证了服务注册中心的高可用性。​

(2)易用性:Eureka 与 SpringCloud 生态无缝集成,配置简单,开发者可以快速上手搭建服务注册中心和实现服务注册与发现功能。​

(3)灵活性:Eureka 客户端可以根据自身需求配置服务注册、续约等相关参数,适应不同的业务场景。​

(4)实时性较好:通过服务续约和下线机制,Eureka 能够及时更新服务注册表信息,保证客户端获取到的服务列表具有较高的实时性。​

        但其也有不少缺点,如:​

(1)自我保护机制的双刃剑效应:Eureka 的自我保护机制在网络出现波动时,会保护服务注册表中的信息不被删除,避免误删健康的服务实例。但这也可能导致客户端获取到已经失效的服务实例信息,从而影响服务调用的准确性。​

(2)不支持 CP 模式:由于 Eureka 选择了 AP 架构,在一致性方面存在一定的欠缺。在某些对数据一致性要求较高的场景中,Eureka 可能不是最佳选择。​

(3)功能相对简单:与一些其他的服务注册中心(如 Consul)相比,Eureka 的功能相对简单,缺乏一些高级特性,如服务健康检查的细粒度控制、分布式配置管理等。​

(4)性能瓶颈:在服务数量非常庞大的情况下,Eureka Server 的性能可能会受到一定影响,需要进行合理的集群规划和优化。

        Eurka Server 搭建的流程如下:

(1)在 SpringBoot 项目的 pom.xml 文件中引入 Eureka Server 依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>

(2)在启动类上添加 @EnableEurekaServer 注解,声明这是一个 Eureka Server:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

(3)在 application.yml 配置文件中进行 Eureka Server 的相关配置:

server:port: 8761  # Eureka Server端口号eureka:instance:hostname: localhost  # 主机名client:registerWithEureka: false  # 是否将自己注册到Eureka Server,默认true,单节点时设为falsefetchRegistry: false  # 是否从Eureka Server获取服务列表,默认true,单节点时设为falseserviceUrl:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/  # Eureka Server的注册地址server:enableSelfPreservation: false  # 是否开启自我保护机制,开发环境可关闭,生产环境建议开启

        Eureka与其他注册中心的对比:

特性

Eureka

Zookeeper

Consul

CAP 选择

AP

CP

CP/AP(可配置)

服务健康检查

客户端心跳机制

ZAB 协议维持连接

支持多种健康检查方式(HTTP、TCP 等)

负载均衡

需结合 Ribbon

需自行实现

内置负载均衡

分布式配置

不支持

支持

支持

易用性

高,与 SpringCloud 无缝集成

中,需了解 ZAB 协议

中,有自己的 CLI 和 API

社区活跃度

较低(Netflix 已停止更新)

http://www.lryc.cn/news/610845.html

相关文章:

  • SpringBoot3.x入门到精通系列:4.3 性能优化技巧
  • HTTP性能优化实战:解决高并发场景下的连接瓶颈与延迟问题
  • 浏览器渲染 首屏优化 性能优化
  • ArrayList 深度剖析:从底层原理到性能优化的实战指南
  • MySQL索引底层原理与性能优化实践
  • 力扣:2246. 相邻字符不同的最长路径
  • 解析图像几何变换:从欧式到仿射再到透视
  • 从达梦到 StarRocks:国产数据库实时入仓实践
  • Python高级编程与实践:Python装饰器深入解析与应用
  • 使用 BAML 模糊解析改进 LangChain 知识图谱提取:成功率从25%提升到99%
  • 力扣刷题日常(15-16)
  • 【Electron】electron-vite中基于electron-builder与electron-updater实现程序远程自动更新,附源码
  • 国产大模型平替方案:Spring Boot通义千问API集成指南
  • 2025 年半导体用铜前驱体市场规模有多大?全景调研及投资前景分析
  • 接口测试用例书写规范
  • 基于 FFmpeg 与 V4L2 的多路摄像头视频采集,图像处理处理与 RTMP 推流项目(开源)
  • 【教育教学】人才培养方案制定
  • Linux内核C语言代码规范
  • MySQL内外连接详解
  • Python 基础语法(二):流程控制语句详解
  • 【Qt开发】常用控件(一)
  • 嵌入式硬件中运放的基本控制原理
  • 选佳沐信,智享便捷,乐在其中
  • LeetCode——2683. 相邻值的按位异或
  • 下架的软件又复活了,低调使用!
  • HFSS许可审计与分析
  • 用 Python 批量处理 Excel:从重复值清洗到数据可视化
  • Go语言实战案例:使用context控制协程取消
  • 【工程化】tree-shaking 的作用以及配置
  • 小杰数据结构——题库——拂衣便欲沧海去,但许明月随吾身