当前位置: 首页 > 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.dtcms.com/a/315895.html

相关文章:

  • FPGA设计思想与验证方法学系列学习笔记003
  • 基于Django的计算机资源爬虫及可视化系统的设计与实现
  • 【motion】HumanML3D 的安装2:psbody-mesh安装成功
  • Django中的转发与重定向详解
  • 利用m0改造循迹模块处理笔记00
  • Windows 安装 RabbitMQ 消息队列超详细步骤(附加详细操作截屏)
  • kettle插件-kettle http post plus插件,轻松解决https post接口无法调用文件流下载问题
  • python的高校考研交流系统
  • FastAPI快速入门P2:与SpringBoot比较
  • ESP-idf框架下的HTTP服务器\HTML 485温湿度采集并长传
  • windows如何查限制每个用户占用的显存大小
  • Node.js高并发下的内存泄漏排查与解决实录
  • 微信小程序的合规检测
  • (LeetCode 每日一题) 3477. 水果成篮 II (暴力)
  • Pytorch-06 如何开启模型训练(模型训练工作流梳理)
  • 几乎不会存在Store Buffer中的指令不提交缓存的情况~
  • Rust进阶-part3-生命周期
  • AI的第一次亲密接触——你的手机相册如何认出你的猫?
  • JavaWeb(苍穹外卖)--学习笔记17(Websocket)
  • 【qt5_study】2.使用Qt Designer构造UI界面(信号与槽)
  • 使用ZYNQ芯片和LVGL框架实现用户高刷新UI设计系列教程(第二十四讲)
  • React18 严格模式下的双重渲染之谜
  • 【01】OpenCV C++实战篇——基于多项式插值的亚像素边缘定位算法
  • NLP自然语言处理 02 RNN及其变体
  • golang 1.24引入alias types的原因
  • Mac上pnpm的安装与使用
  • 《计算机“十万个为什么”》之 面向对象 vs 面向过程:编程世界的积木与流水线
  • VSCode中使用Qt
  • MySQL 如何优化慢查询
  • Apifox使用mock模仿后端返回数据