Eureka 原理与实践全攻略

一、Eureka 概述 

Eureka 在微服务架构中具有举足轻重的地位。它作为服务注册与发现的核心组件,为分布式系统中的服务管理提供了关键支持。

Eureka 的主要功能包括服务注册、服务发现、服务健康监测和自我保护机制。服务注册功能使得服务提供者能够在启动时将自身的信息,如服务名称、IP 地址、端口等,注册到 Eureka 服务器上,方便后续被其他服务发现和调用。服务发现功能则允许服务消费者从 Eureka 服务器获取所需服务的实例列表,从而实现服务之间的通信和协作。

服务健康监测是 Eureka 保障系统稳定性的重要手段。服务实例会定期向 Eureka 服务器发送心跳,以表明自身的健康状态。若服务器在一段时间内未收到某个实例的心跳,就会将其视为不健康并从注册表中移除,避免服务消费者调用到不可用的服务。

自我保护机制是 Eureka 的一大特色。当网络出现异常或大量服务实例心跳异常时,Eureka 服务器不会立即剔除这些实例,而是进入自我保护模式,以防止误判导致正常服务被错误移除,从而保持服务的可用性。

总之,Eureka 通过这些功能,有效地解决了微服务架构中服务管理的复杂问题,提高了系统的可靠性和可扩展性。

二、Eureka 的核心概念

(一)服务注册

当服务提供者启动时,Eureka Client 会将其服务的详细信息,如服务名称、IP 地址、端口、服务版本等,封装成特定的数据结构,并通过 HTTP 协议向 Eureka Server 发送注册请求。Eureka Server 接收到注册请求后,会将这些信息存储在内部的数据结构中,通常是一个类似于注册表的结构。

在这个过程中,关键的原理在于服务提供者需要准确地提供自身的关键信息,以便 Eureka Server 能够有效地识别和管理。同时,Eureka Server 要具备高效的存储和检索机制,能够快速地处理大量的服务注册请求,并保证数据的一致性和可靠性。

(二)服务发现

服务消费者在需要调用其他服务时,会通过 Eureka Client 向 Eureka Server 发送获取服务实例列表的请求。Eureka Server 会根据请求的服务名称,从注册表中查找相应的服务实例信息,并将其返回给服务消费者。

服务消费者获取到实例列表后,通常会采用一定的负载均衡策略,如随机、轮询等,选择其中一个实例进行调用。这个机制的关键在于服务消费者能够准确地向 Eureka Server 表达自己的需求,并能够有效地处理返回的实例列表,以实现高效的服务调用。

(三)心跳检测

服务端和客户端之间通过定期发送心跳来维持服务状态。客户端会按照一定的时间间隔(默认通常为 30 秒)向服务端发送心跳包,以告知服务端自己仍然处于可用状态。

心跳检测的原理在于服务端通过接收心跳包来更新服务实例的状态信息,如果在一定时间内(默认通常为 90 秒)未收到某个服务实例的心跳,服务端就会认为该实例不可用,并将其从注册表中移除。

心跳检测的作用主要有两个方面。一是能够及时发现不可用的服务实例,避免服务消费者调用到故障的服务;二是能够让服务端了解服务实例的实时状态,为服务发现提供准确的信息。

三、Eureka 的工作原理

alt

(一)服务注册流程

当服务提供者启动时,它会通过 Eureka Client 向 Eureka Server 发送包含自身详细信息(如服务名称、IP 地址、端口等)的注册请求。Eureka Server 接收到请求后,会将这些信息存储在内部的注册表中。同时,Eureka Server 还会将新注册的服务信息同步到其他节点,以保证整个集群中的注册表信息一致。在存储过程中,Eureka Server 会对服务信息进行有效性验证,确保关键信息的完整性和准确性。此外,为了提高注册的效率和可靠性,Eureka Server 采用了优化的存储结构和数据同步策略。

(二)服务发现流程

服务消费者在需要调用其他服务时,通过 Eureka Client 向 Eureka Server 发送服务发现请求,指定所需服务的名称。Eureka Server 接收到请求后,根据服务名称在注册表中查找匹配的服务实例信息,并将其返回给服务消费者。服务消费者收到实例列表后,通常会基于预设的负载均衡策略(如随机、轮询等)选择一个合适的实例进行调用。在这个过程中,Eureka Server 会快速响应请求,并提供最新、准确的实例信息,而服务消费者需要能够有效地处理返回的实例列表,确保选择的合理性和高效性。

(三)自我保护模式

自我保护机制的触发条件通常是在一定时间内(如 15 分钟),如果 Eureka Server 检测到心跳失败的比例低于预设阈值(如 85%),就会触发自我保护。其运行原理是当触发自我保护后,Eureka Server 不再从注册列表中移除因长时间未收到心跳而应过期的服务,同时仍然接受新服务的注册和查询请求,但不会将新的注册信息同步到其他节点。自我保护模式的作用在于避免因网络故障等原因导致正常服务被误剔除,保证服务的可用性。然而,在自我保护期间,如果服务确实非正常下线,可能会导致服务消费者调用失败,因此服务消费者端需要具备容错机制,如重试、断路器等。

四、Eureka 的关键特性

(一)服务注册与发现

服务注册与发现极大地简化了服务间的依赖管理。通过服务注册,服务提供者能够自动将自身信息注册到 Eureka 中,服务消费者无需手动配置服务地址,只需通过服务名称即可获取可用的服务实例列表。这种方式降低了服务配置的复杂性,提高了服务部署的灵活性和可扩展性。同时,服务注册与发现机制能够动态感知服务的上线和下线,实现服务的自动发现和更新,避免了因服务地址变更而导致的服务调用失败。

(二)集群支持

Eureka Server 集群通常采用两两相互注册的方式进行部署。每个节点都需要发现集群中的其他节点并建立连接,通过心跳机制来维持连接状态。在数据同步方面,当某个节点接收到服务注册、更新或删除等操作时,会将这些变更同步到其他节点,以保证整个集群中服务注册表的一致性。这种数据同步机制确保了即使部分节点出现故障,服务注册与发现功能仍然能够正常运行,提高了系统的可用性和容错性。

(三)客户端缓存

客户端缓存服务实例列表能够显著提升性能。当服务消费者获取到服务实例列表后,将其缓存在本地。这样,在后续的服务调用中,如果需要再次获取相同服务的实例列表,就可以直接从本地缓存中获取,减少了对 Eureka Server 的频繁请求,降低了网络开销和服务器负载。同时,本地缓存还能在 Eureka Server 暂时不可用的情况下,提供一定时间内的可用服务实例信息,保障服务调用的连续性。

(四)健康检查

Eureka 通过心跳机制监控服务实例的健康状态。服务实例定期向 Eureka Server 发送心跳,Eureka Server 根据心跳的接收情况来判断服务实例是否健康。这种健康检查方法能够及时发现不可用的服务实例,避免服务消费者调用到故障的服务,从而提高服务调用的成功率和系统的稳定性。此外,健康检查还为服务的自动扩展和故障恢复提供了依据,有助于优化系统的资源分配和服务质量。

(五)自我保护模式

自我保护模式是应对网络异常和服务失效的有效策略。当网络出现故障或大量服务实例心跳异常时,Eureka Server 不会立即剔除这些实例,而是进入自我保护状态。这避免了因短暂的网络波动或服务异常导致大量正常服务被误剔除,保障了服务的可用性。在自我保护期间,Eureka Server 仍然能够接受新的服务注册和查询请求,为系统的恢复争取了时间。一旦网络恢复正常或服务实例的心跳恢复正常,Eureka Server 会自动退出自我保护模式,恢复正常的服务剔除逻辑。

(六)REST API

Eureka 提供的 RESTful API 具有丰富的功能,包括服务注册、服务发现、服务实例状态管理等。这些 API 可以方便地与其他系统进行集成,例如监控系统可以通过调用这些 API 获取服务的注册信息和健康状态,实现对服务的实时监控和告警。同时,运维人员也可以通过这些 API 对服务注册与发现进行手动干预和管理,满足特定的运维需求。此外,开发人员还可以利用这些 API 开发自定义的管理工具和界面,提升服务管理的便捷性和可视化程度。

五、Eureka 实战案例

(一)创建 Eureka Server

创建 Eureka Server 需要以下几个步骤:

  1. 添加依赖:在项目的 pom.xml 文件中添加 spring-cloud-starter-netflix-eureka-server 依赖,以便引入 Eureka Server 相关的功能。
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency>
  2. 配置文件设置:在 src/main/resources/application.yml 文件中进行如下配置,设置服务器的端口和 Eureka 相关的参数。
    server:port: 8761eureka:instance:hostname: localhostclient:register-with-eureka: falsefetch-registry: falseservice-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  3. 启动类注解:在主启动类上添加 @EnableEurekaServer 注解,启用 Eureka Server 功能。
    import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication@EnableEurekaServerpublic class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}}

(二)创建服务提供者(Eureka Client)

创建服务提供者的流程如下:

  1. 添加依赖:在服务提供者项目的 pom.xml 文件中添加 spring-cloud-starter-netflix-eureka-client 依赖。
    <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency>
  2. 配置:在 src/main/resources/application.yml 文件中配置 Eureka 相关信息。
    spring:application:name: service-providereureka:client:service-url:defaultZone: http://localhost:8761/eureka/
  3. 启动类注解:在主启动类上添加 @EnableDiscoveryClient 注解。
    import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@SpringBootApplication@EnableDiscoveryClientpublic class ServiceProviderApplication {public static void main(String[] args) {SpringApplication.run(ServiceProviderApplication.class, args);}}

(三)创建服务消费者(Eureka Client)

创建服务消费者的流程与服务提供者类似,需要注意以下几点:

  1. 同样需要在 pom.xml 文件中添加 spring-cloud-starter-netflix-eureka-client 依赖。
  1. 配置文件中的 spring.application.name 需根据服务消费者的名称进行修改。
  1. 启动类同样添加 @EnableDiscoveryClient 注解。

在实际开发中,服务消费者通过从 Eureka Server 获取服务提供者的实例列表,然后根据负载均衡策略选择合适的实例进行调用,实现服务之间的通信和协作。

六、Eureka 高可用

(一)实现高可用的配置

要实现 Eureka 的高可用性,通常需要创建多个 Eureka Server 节点并进行相互注册。以下是具体的配置步骤:

  1. 创建多个配置文件,例如 application-peer1.yml、application-peer2.yml 等,分别为每个节点设置不同的端口和服务 URL。
    server:port: 8091spring:application:name: eureka-servereureka:instance:hostname: peer1client:register-with-eureka: truefetch-registry: trueservice-url:defaultZone: http://peer2:8092/eureka/, http://peer3:8093/eureka/
  2. 在本地的 hosts 文件中进行域名映射,例如:127.0.0.1 peer1 peer2 peer3 。
  3. 分别以不同的配置文件启动各个 Eureka Server 节点。

通过以上配置,多个 Eureka Server 节点形成一个集群,实现了高可用性,当其中一个节点出现故障时,其他节点仍能正常提供服务。

(二)服务注册与故障处理

在高可用环境下,服务注册的方式与单个 Eureka Server 时类似,服务提供者仍然向其中一个 Eureka Server 节点注册自身信息。但不同的是,由于存在多个 Eureka Server 节点,注册信息会在节点之间进行同步。

当发生故障时,Eureka 具有一定的应对策略。例如,如果某个 Eureka Server 节点故障,服务提供者的心跳信息无法传递到该节点,但只要其他节点正常工作,服务提供者不会被误判为下线。同时,服务消费者在获取服务实例列表时,能够从其他正常的 Eureka Server 节点获取到最新的信息,并根据负载均衡策略选择可用的服务实例进行调用。此外,Eureka 的自我保护机制在高可用环境下也能发挥重要作用,当网络故障或部分节点异常导致大量心跳失败时,能够避免误剔除正常的服务实例,保障服务的可用性。

七、Eureka 服务与服务之间调用方式

(一)直接调用方式

订单服务可以直接使用 RestTemplate 来调用商品服务。通过配置 RestTemplate 实例,并指定目标服务的 URL ,即可发送请求获取商品服务的数据。

@Autowiredprivate RestTemplate restTemplate;public void callProductService() {String response = restTemplate.getForObject("http://product-service/api/product", String.class);// 处理响应}

(二)Feign 调用方式

Feign 是一种声明式的 HTTP 客户端,可以更方便地定义和调用服务。首先需要在订单服务中添加 Feign 相关的依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>

然后创建一个接口来定义与商品服务的交互。

@FeignClient(name = "product-service")public interface ProductServiceClient {@GetMapping("/api/product")String getProduct();}

在订单服务的业务逻辑中,直接调用这个接口的方法即可。

(三)负载均衡与调用策略

在服务间调用时,还需要考虑负载均衡策略。可以使用 Ribbon 来实现负载均衡,通过配置选择合适的算法,如轮询、随机等。同时,可以设置重试机制,当调用失败时进行一定次数的重试,提高调用的成功率。

product-service:ribbon:NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

八、总结

        Eureka 在微服务架构中扮演着至关重要的角色。它为微服务提供了服务注册与发现的核心功能,使得服务之间能够动态地找到彼此,实现了服务的解耦和灵活部署。通过心跳检测和自我保护机制,保证了服务的可用性和稳定性,提高了整个微服务系统的可靠性。集群支持和高可用配置确保了在面对故障时系统能够持续运行,为企业级应用提供了坚实的基础。此外,Eureka 的客户端缓存和高效的服务调用方式提升了系统性能,减少了响应时间,满足了用户对快速响应的需求。

随着微服务架构的不断发展,Eureka 也面临着新的机遇和挑战。在未来,Eureka 可能会在以下方面不断发展:

  1. 性能优化:随着微服务数量的不断增加,对 Eureka 的性能要求也会越来越高。未来可能会通过优化算法、提高数据存储和查询效率等方式,进一步提升 Eureka 的性能。
  2. 与其他技术融合:Eureka 可能会与容器化技术、服务网格等新兴技术融合,为微服务架构提供更加全面的解决方案。例如,与 Kubernetes 等容器编排平台结合,实现更加自动化的服务管理。
  3. 智能化管理:利用人工智能和机器学习技术,对服务的健康状态进行预测和分析,实现智能化的故障排查和管理。
  4. 安全增强:随着微服务架构在企业中的广泛应用,对服务的安全性要求也会越来越高。未来 Eureka 可能会加强安全方面的功能,如身份验证、授权管理等。

总之,Eureka 作为微服务架构中的重要组件,在未来仍将发挥重要作用。随着技术的不断发展,它将不断优化和完善,为企业级微服务应用提供更加可靠、高效的服务注册与发现解决方案。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/407994.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Unity】移动端草海解决方案

草海是开放大世界渲染的必不可少的因素&#xff0c;Unity 原生的 Terrain 草海效率较低&#xff0c;而且无法与 RVT 结合起来&#xff0c;无法在移动端上实现。因此我们自己搓出来一套草海系统&#xff0c;使用 C# 多线程辅助运算&#xff0c;并能支持割草、烧草等进阶玩法。草…

系统编程 网络 http协议

http协议------应用层的协议 万维网&#xff1a;http解决万维网之间互联互通 计算机web端网络只能看到文字 1.如何在万维网中表示一个资源&#xff1f; url <协议>&#xff1a;//<主机>&#xff1a;<端口>/<路径> ------------------------------…

2024软件测试面试,别玩这些题目,轻松拿捏百分之95的测试!

1、你会封装自动化测试框架吗&#xff1f; 自动化框架主要的核心框架就是分层PO模式&#xff1a;分别为&#xff1a;基础封装层BasePage&#xff0c;PO页面对象层&#xff0c;TestCase测试用例层。然后再加上日志处理模块&#xff0c;ini配置文件读取模块&#xff0c;unittest…

计算机毕业设计--基于深度学习(PSPNet、空洞卷积Atrous Convolutions)的多类型图像通用分割模型

基于深度学习(PSPNet、空洞卷积Atrous Convolutions)的多类型图像通用分割模型 更多基于深度学习的毕业设计请关注专栏 --- 计算机毕业设计 ✨ 动物图分割&#xff08;使用训练集DIS5K-TR&#xff0c;DIS-TEs&#xff0c;DUTS-TR_TE &#xff09; ✨自然与人类图像分割&#xf…

[CLIP-VIT-L + Qwen] 多模态大模型源码阅读 - MultiModal篇

[CLIP-VIT-L Qwen] 多模态大模型源码阅读 - MultiModal篇 前情提要源码阅读导包逐行讲解 dataclass部分整体含义逐行解读 模型微调整体含义逐行解读 MultiModal类整体含义逐行解读 参考repo:WatchTower-Liu/VLM-learning; url: VLLM-BASE 前情提要 有关多模态大模型架构中的…

搭建智能客服机器人:langgraph实现用户订单管理

大家好&#xff0c;今天我们将创建一个智能客服机器人&#xff0c;它能够记录用户的食物订单到真实数据库中&#xff0c;并允许用户查看他们的订单。这是一个相对高级的Langgraph项目&#xff0c;大家可以先看一下前面介绍的Langgraph的基础课程。 项目概述 我们要构建的系统…

mysqldump + python 定时备份数据库

场景&#xff1a; 需要对mysql进行定时备份&#xff0c;受限于硬盘空间的大小&#xff0c;需要对备份的数据需要定时清理 python代码实现&#xff1a; # -*- coding:UTF-8 -*- """ProjectName : HotelGo2DelonixPmxFileName : fix_missing_ratesDescripti…

《通义千问AI落地—下》:WebSocket详解

一、前言 文本源自 微博客 且已获授权,请尊重版权。 《通义千问AI落地——下篇》如约而至。Websocket在这一类引用中,起到前后端通信的作用。因此,本文将介绍websocket在这类应用场景下的配置、使用、注意事项以及ws连接升级为wss连接等;如下图,本站已经使用了wss连接…

python实用教程(一):安装配置anaconda(Win10)

下一篇&#xff1a;python实用教程&#xff08;二&#xff09;&#xff1a;安装配置Pycharm及使用(Win10)-CSDN博客 1、简介及下载 Anaconda 是一个开源的 Python 和 R 语言的发行版&#xff0c;专为科学计算、数据分析、机器学习和大数据处理而设计。它包含了众多常用的数据…

【Python】列表和元组

文章目录 概念创建列表访问下标通过下标来修改列表元素获取列表长度下标可以写成负数 切片操作省略后边界省略前边界省略前后边界带有步长的切片 遍历列表元素使用 for 循环使用 for 循环访问下标的方式使用 while 循环 新增元素在末尾新增在任意位置新增 查找元素判定元素是否…

Python酷库之旅-第三方库Pandas(096)

目录 一、用法精讲 411、pandas.DataFrame.values属性 411-1、语法 411-2、参数 411-3、功能 411-4、返回值 411-5、说明 411-6、用法 411-6-1、数据准备 411-6-2、代码示例 411-6-3、结果输出 412、pandas.DataFrame.axes属性 412-1、语法 412-2、参数 412-3、…

背包问题【算法 07】

背包问题 背包问题是经典的计算机科学问题之一&#xff0c;涉及到如何在有限资源的约束下&#xff0c;选择最优的物品组合&#xff0c;以最大化收益。这个问题在现实中有广泛的应用&#xff0c;例如资源分配、物流调度和投资组合优化等。本文将详细介绍背包问题的定义、解决方法…

iphone问题笔记

拼音打字显示一些不相干的词 原因&#xff1a;开启了自动改正&#xff0c;傻逼iphone总以为你打错了。 计算器没有退格键&#xff1f; 解决方法&#xff1a;按住数字往右滑是退格。 关机重启必须去设置里&#xff1f; 连按五次锁屏可以选择关机。

如何选择适合自己的开放式耳机?五款实力出众爆款安利!

开放式耳机以其不侵入耳道的设计&#xff0c;为耳朵提供了更轻的负担&#xff0c;同时保护了耳道健康&#xff0c;这与传统的头戴式或入耳式耳机相比&#xff0c;在长时间佩戴时更能减少不适感。市场上的开放式耳机种类繁多&#xff0c;要找到一款真正满意的产品可能有些困难。…

文件—python

一、文件编码 对于同一份文件&#xff0c;人的视角和计算机的视角是不相同的&#xff0c;人看到的是文字&#xff0c;计算机看到的0和1组成的编码。因为计算机只能识别0和1&#xff0c;无法直接识别文字&#xff0c;那我们是如何在电脑上看到文字的呢&#xff1f; 计算机按照一…

【逐行注释】MATLAB下的IMM-EKF代码

IMM-EKF 基于EKF的多模型交互。以CV和CT两个模型进行交互&#xff0c;这里对代码进行逐行注释。 注释较多&#xff0c;个人理解的时候如果有误&#xff0c;欢迎指正。 每一行都有注释&#xff1a; 模型概况 二维平面上的运动模型&#xff0c;由CV和CT构成&#xff0c;基于…

C++:vector篇

前言&#xff1a; 本篇仅介绍vector中常用的函数接口&#xff0c;如果需要详细的请到官网查看。 vector是一种动态数组&#xff0c;能够自动调整大小。与数组类似&#xff0c;vector使用连续内存来存储元素&#xff0c;允许高效访问&#xff0c;但可以动态增加容量。为了应对容…

达梦数据库的系统视图v$tablespace

达梦数据库的系统视图v$tablespace 在达梦数据库&#xff08;DM Database&#xff09;中&#xff0c;V$TABLESPACE 提供了有关数据库中的表空间&#xff08;Tablespace&#xff09;信息。这些信息对于管理数据库存储和优化性能非常关键。表空间是数据库逻辑存储结构的一个层次…

12、stm32通过dht11读取温湿度

一、配置 二、代码 dht11.c /** dht11.c** Created on: Aug 19, 2024* Author: Administrator*/#include "main.h" #include "tim.h" #include "usart.h" #include "gpio.h" /**TIM3定时器实现us级延时*/ void Delay_us(uint16…

Midjourney提示词-动物系列-65

A super cute little anthropomorphic,sheep of the Chinese Zodiac, wearing berets ,in a Hanfu in red style,standing, eyes,cute tail,super realistic,super detail,luxurious,elegant,Unreal Engine,octane render, 8K,VRAY super realistic Pixar Style, Tiny cute…