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.mzph.cn/diannao/52315.shtml

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

相关文章

git-版本管理工具基本操作-创建仓库-拉取-推送-暂存库-版本库

1、创建仓库和版本说明 2、克隆仓库到本地&#xff08;首次拉取需要输入用户名和密码&#xff0c;用户名用邮箱&#xff0c;密码用登录gitee的密码&#xff0c;后面配置密钥后可以直接clone&#xff09; 在命令行输出两行指令配置git才能克隆&#xff1a; username&#xff1…

《Web项目跨域请求后端Api设置Cookie失败问题?》

问题描述&#xff1a; 在web项目中跨域请求api时&#xff0c;api登录成功后需要向域名中设置cookie实现在两个域名下共享&#xff0c;但是登录接口返回成功&#xff0c;响应头中也有set-cookie&#xff0c;实际却无法设置到cookie中… web项目访问时的域名https://b.com/ api所…

解锁Spring Boot、Prometheus与Grafana三合一:打造你的专属自定义指标炫酷大屏!

1. 集成Prometheus到Spring Boot 需要在Spring Boot应用中集成Prometheus。可以通过micrometer库来实现。micrometer是一个应用程序监控库&#xff0c;它支持多种监控系统&#xff0c;包括Prometheus。 一招制胜&#xff01;Spring Boot、Prometheus和Grafana三剑合璧&#x…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…

【Redis】基本全局命令

Redis的基本全局命令 keysexistsdelexpirettltype Redis 有 5 种数据结构&#xff0c;但它们都是键值对种的值&#xff0c;对于键来说有⼀些通⽤的命令。 keys 返回所有满足样式 &#xff08;pattern&#xff09;的key。支持如下统配样式。 h?llo 匹配 hello , hallo 和 hxl…

培训班和科班出生有什么区别

IT业的萌新来啦 每到毕业季 总有大量萌新走进职场 IT圈子的程序员 有的是科班出生 比如 计算机科学与技术、软件工程、大数据技术 有的是相关专业出生的 比如 信息安全、网络工程、物联网工程等等 除此之外 还有各种其他专业转行过来的 文理不限、专业不限 科班出生…

【在Linux世界中追寻伟大的One Piece】IO基础

目录 1 -> 回顾 1.1 -> 回顾C文件接口 1.2 -> 总结 2 -> 系统文件I/O 3 -> 接口介绍 3.1 -> open 3.2 -> open函数返回值 3.3 -> 文件描述符fd 4 -> 0 & 1 & 2 5 -> 文件描述符的分配规则 6 -> 重定向 7 -> 使用dup2系…

运维开发——局域网SSH访问服务器与应用

摘要 本博文主要介绍局域网SSH访问登陆虚拟机和及其应用相关配置操作。 1. 局域网SSH访问登陆虚拟机 目标&#xff1a;在局域网内A电脑使用SSH登陆B电脑上虚拟机的服务器。 前提条件:B电脑为宿主机&#xff0c;可以正常使用ssh访问虚拟机服务器&#xff0c;虚拟机网络连接方…

深度学习基础—超参数调试

1.超参数调试顺序 在训练深度网络最难的事情之一是超参数的选择&#xff0c;如何选择合适的超参数取值&#xff1f;下面我将谈谈&#xff0c;如下是我所理解的超参数调试顺序&#xff1a; 重要性排序 超参数 Top1梯队 学习率a Top2梯队 min-batch大小&#xff0c;隐层神经…

QT-五子棋游戏

QT-五子棋游戏 一、演示效果二、核心代码三、下载链接 一、演示效果 二、核心代码 #include "GameModel.h" #include <time.h> #include <stdlib.h>GameModel::GameModel(){}void GameModel::startGame(GameType type){gameType type;//初始化棋盤game…

uniapp/vue如何实现一个子表单及子表单作用

子表单是一个辅助表单或一个表&#xff0c;它允许在主表单中添加多个行式项目&#xff0c;以处理与主记录相关联的多个辅助项目或数据。子表单在多种应用场景中发挥着重要作用&#xff0c;特别是在需要处理一对多关系的数据时。 以下是对子表单的详细解析&#xff1a; 定义与特…

90%的设计师都不知道的免抠图素材插件,水花免抠png素材轻松搞定!附保姆教程

你是否曾在设计中为绘制那些晶莹剔透的水花而苦恼&#xff1f;用PS太麻烦&#xff0c;细节根本抠不清楚&#xff1b;去素材网找&#xff0c;不是付费太高就是图案不满意&#xff01;可以试试千鹿设计助手的“AI免抠生成”插件&#xff0c;接下来我来分享一下我的一些使用过程和…

ardupilot开发 --- C嘎嘎 篇

长生不老&#xff1f;三界六道不就毁在这4个字上&#xff1f; 溜撒点一起上吧 cout和cin的使用&#xff0c;标准输入输出<< 和 >> 的使用数据类型&#xff08;函数&#xff09;模板的使用&#xff1a;命名空间的使用&#xff0c;std命名空间语句块new 的使用引用 &…

fiddler在软件测试中的使用(详细版)

1.抓包&#xff0c;辅助定位bug&#xff08;web中类似谷歌浏览器F12开发调试工具&#xff09; 合格的软件测试工程师&#xff0c;不仅仅需要能够发现bug&#xff0c;还需要能透过bug表象&#xff0c;分析出问题根本原因&#xff0c;从而提升bug的解决效率&#xff0c;通过fidd…

手机使用技巧:如何恢复Android手机不见的短信

在您的 Android 手机上丢失短信可能是一种令人沮丧的经历&#xff0c;尤其是在文本包含重要信息的情况下。幸运的是&#xff0c;有一些方法可以在Android上恢复已删除的短信。在这篇博文中&#xff0c;我们将讨论几种在Android手机上恢复已删除短信的方法。 为什么需要恢复Andr…

vue2版本空目录下创建新项目的方法2024

vue2版本空目录下创建新项目的方法2024 node -v npm -v vue -V 安装vue-cli 2.9版本的命令 npm install vue-cli -g 卸载vue2.x方法&#xff1a; npm uninstall vue-cli -g 设置 NPM 镜像 npm config set registry https://registry.npmmirror.com vue -V 报错时需设置环…

JVM的内存模型和垃圾回收

JVM内存区域 内存模型图&#xff1a; 堆 线程共享。所有的对象实例以及数组都要在堆上分配。回收器主要管理的对象。 它的目的是存放对象实例。同时它也是GC所管理的主要区域&#xff0c;因此常被称为GC堆&#xff0c;又由于现在收集器常使用分代算法&#xff0c;Java堆中还…

【Spring Cloud】Consul

官网介绍: Spring Cloud Consul该项目为Spring Boot应用程序提供了与Consul的集成,通过自动配置和绑定到Spring环境以及其他Spring编程模型习语。通过几个简单的注解,您可以在应用程序内部快速启用和配置常见模式,并使用基于Consul的组件构建大型分布式系统。提供的模式包括…

【网络编程】第十一章 数据链路层 - 以太网(MAC+MTU+ARP+MSS+RARP)

文章目录 重点链路层以太网MAC帧格式碰撞域MAC地址MAC地址和IP地址 MTU-最大传输单元MTU 对 IP 的影响MTU 对 UDP 的影响MTU 对 TCP 的影响-MSS ARP协议ARP协议的工作流程ARP请求的过程ARP应答的过程 ARP 缓存中间人攻击 RARP协议 重点 数据链路层的作用&#xff1a;两个设备 …

虚幻5|AI视力系统,听力系统,预测系统(2)听力系统

虚幻5|AI视力系统&#xff0c;听力系统&#xff0c;预测系统&#xff08;1&#xff09;视力系统-CSDN博客 一&#xff0c;把之前的听力系统&#xff0c;折叠成函数&#xff0c;复制粘贴一份改名为听力系统 1.小个体修改如下&#xff0c;把之前的视力系统改成听力系统 2.整体修…