SpringCloud-Eureka原理分析

Eureka是Netflix开源的一款用于实现服务注册与发现的工具。在微服务架构中,服务的动态注册和发现是必不可少的组成部分,而Eureka正是为了解决这一问题而诞生的。

一、为何需要Eureka

在微服务架构中,服务之间的协同合作和高效通信是至关重要的。服务的自动注册与发现成为了解决这一挑战的核心问题之一。Eureka作为Netflix开源的服务注册与发现组件,提供了一种简单且高效的解决方案。通过Eureka,服务实例能够自动注册和注销,同时其他服务能够动态地发现和调用这些服务,实现了微服务架构中的高度灵活性和可伸缩性。 

可能这段话听上去有些晦涩难懂,下面就由我来举例解释:

如我们前面文章介绍的,微服务架构是一种优秀的分布式架构,是为了弥补单体应用的不足发展过来的。

传统的单体应用如下图:

各业务之间是耦合的,没有单独根据业务去做区分,部署虽然方便,但是容灾性比较差,一旦一个服务挂掉,整个应用都会宕机,而且每次发布,都需要全量部署,系统维护非常耗时,从而影响用户体验。

后面为了适应大项目的需求,解决这类宕机问题,分布式架构应运而生,服务按模块为单位进行封装,极大程度避免了整体宕机的问题,而且每次发布只需要发布所需要的模块。

分布式应用架构如下:

但分布式的服务调用问题也接踵而至。

由于服务分别部署在不同的端口,如果我们按照传统的调用方法,把端口号写死,那么会导致端口变动时需要反复部署。

传统服务调用如图所示:

这种硬编码地址的调用方法非常不灵活,我们需要做很多的端口配置,修改起来又需要重新部署,而且服务挂掉了,也没有补救措施。

对于服务挂掉的问题,我们的理想方案是同时启动多个相同服务,部署在不同端口,一旦一个服务挂掉了,系统可以自动选择出最优端口进行替补。

为此,Eureka 应运而生。

Eureka 重点解决的就是服务注册与发现、负载均衡的问题。

引入Eureka 解决服务注册与发现、负载均衡后的服务调用如图:


二、Eureka原理

Eureka 的原理基于 CAP(一致性、可用性、分区容忍性)理论。Eureka 通过维护一份服务注册表,记录了各个服务实例的信息,包括服务名、实例 ID、IP 地址等。服务提供者通过向 Eureka 服务器注册自身信息,而服务消费者则通过查询 Eureka 服务器来获得可用服务实例的信息。Eureka 还实现了心跳机制和自我保护机制,确保服务实例的及时发现和故障恢复。

下面我们来详细解释。

Eureka 工作原理图如下:

服务提供者在启动时向 Eureka 服务器注册自己的信息,包括服务名、实例 ID、IP 地址等。完成注册的服务会出现在图中的服务提供者模块里,供服务消费者调用时选择。

服务消费者同样也会向 Eureka 服务器注册。服务消费者通过查询 Eureka 服务器获取可用服务实例的信息,从而进行服务调用。

服务调用的过程,大概如下:

  • ① 服务提供者向 Eureka 服务器注册服务信息;
  • ② 服务消费者从 Eureka 服务器拉取已注册的服务提供者信息;
  • ③ 服务消费者选择其中一个最优的服务提供者,这个过程叫负载均衡;
  • ④ 服务消费者远程调用选定的服务提供者。

同时,Eureka 通过定时发送心跳来检测服务实例的健康状况,确保注册表的及时更新。当 Eureka 服务器在一定时间内未收到服务实例的心跳时,会进入自我保护模式,保障注册表的稳定性。


三、Eureka原理总结

总体而言,Eureka的工作原理可归纳为以下几点:

功能点功能详述
自动注册与发现Eureka 允许服务实例在启动时自动注册,同时其他服务可以通过查询 Eureka 服务器获得服务实例的信息,实现动态发现。
负载均衡Eureka 通过维护服务实例的注册表,使得服务消费者可以从多个可用实例中进行负载均衡,提高系统性能和可用性。
自我保护机制Eureka具备自我保护机制,能够在网络分区故障或服务实例长时间不发送心跳时,保障注册表的稳定性。
开源社区支持作为Netflix开源项目,Eureka得到了广泛的社区支持和持续的更新,使其成为一个稳定可靠的服务注册与发现解决方案。

Eureka的设计理念简单而实用,使得它成为构建微服务架构中服务注册与发现的首选解决方案。通过深入理解Eureka的原理,开发者能够更好地利用其功能,构建出稳健、高可用的微服务体系。

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【性能最佳实践】跟着我们一起玩转查询模式与性能分析!

使用最新的驱动程序 MongoDB的官方驱动程序是由负责核心数据库开发的同一个专业团队打造的。这些驱动程序的更新通常比数据库本身更频繁,大概每几个月就会发布一次新版本。我们建议您尽可能使用最新版本的驱动程序,并在您使用的编程语言中安装可用的本地…

蓝桥杯Web应用开发-CSS3 新特性【练习三:文本阴影】

文本阴影 text-shadow 属性 给文本内容添加阴影的效果。 文本阴影的语法格式如下: text-shadow: x-offset y-offset blur color;• x-offset 是沿 x 轴方向的偏移距离,允许负值,必须参数。 • y-offset 是沿 y 轴方向的偏移距离&#xff0c…

OpenMLDB 作为中国唯一的特征平台产品入选 2023 Gartner 研究报告

在国际权威咨询与研究机构 Gartner 发布的重要研究报告《The Logical Feature Store: Data Management for Machine Learning》(《逻辑特征存储:机器学习的数据管理》,下文简称报告)中,OpenMLDB 荣幸作为中国唯一的特征平台代表产…

国产信创领跑者:暴雨信息的创新与实践

随着数字化转型的加速推进,信创产业作为数字经济发展的重要支柱,正日益受到社会各界的广泛关注。在这个大背景下,暴雨信息积极响应国家号召,全面适配国产化,推动信创产业的技术创新和应用拓展,成为了行业的…

Mybatis- plus 基本使用

目录 一. 引入依赖 二.定义Mapper 三.常见注解 3.1TableName 3.2.TableId 3.3TableField 3.4常见配置 一. 引入依赖 由于这个starter包含对mybatis的自动装配&#xff0c;因此完全可以替换掉Mybatis的starter。 <dependency><groupId>com.baomidou</gr…

前端JavaScript篇之数组的遍历方法有哪些?forEach和map方法有什么区别?

目录 数组的遍历方法有哪些&#xff1f;forEach和map方法有什么区别&#xff1f;forEach()map()filter()for…ofevery() 和 some()find() 和 findIndex()reduce() 和 reduceRight()forEach和map方法有什么区别总结 数组的遍历方法有哪些&#xff1f;forEach和map方法有什么区别…

U3D记录之FBX纹理丢失问题

今天费老大劲从blender建了个模型&#xff0c;然后导出进去unity 发现贴图丢失 上网查了一下 首先blender导出要改设置 这个path mode要copy 然后unity加载纹理也要改设置 这里这个模型的纹理load要改成external那个模式 然后就有了&#xff0c;另外这个导出还有好多选项可…

Spring如何扫描自定义的注解?

目录 一、Spring框架介绍 二、什么是自定义注解 三、如何扫描自定义的注解 一、Spring框架介绍 Spring框架是一个开源的Java应用程序框架&#xff0c;它提供了一种全面的编程和配置模型&#xff0c;用于构建现代化的企业级应用程序。Spring框架的核心原则是依赖注入&#x…

使用Softing edgeConnector模块将云轻松连接到Siemens PLC

一 工业边缘的连接解决方案 云服务提供商 (CSP) 引入了服务和功能&#xff0c;以简化基于云的工业物联网解决方案的实施。Azure Industrial IoT Platform或AWS IoT SiteWise支持标准协议和接口&#xff0c;例如OPC UA或MQTT。但是&#xff0c;如果您希望在典型的旧改项目中连接…

HttpServletResponse接口用于表示状态代码的字段

1. HttpServletResponse接口用于表示状态代码的字段 您已学习了状态代码以及可用于从servlet向客户机发送状态代码的HttpServletResponse接口的字段。下表列出了HttpServletResponse接口表示状态代码的一些其他字段。 字段状态代码描述SC_HTTP_VERSION_NOT_SUPPORTED505服务器…

Midjourney提示词风格调试测评

在Midjourney中提示词及风格参数的变化无疑会对最终的作品产生影响&#xff0c;那影响具体有多大&#xff1f;今天我我们将通过一个示例进行探究。 示例提示词&#xff1a; 计算机代码海洋中的黄色折纸船&#xff08;图像下方&#xff09;风格参考:金色长发的女人&#xff0c…

222. 完全二叉树的节点个数 - 力扣(LeetCode)

题目描述 给你一棵 完全二叉树 的根节点 root &#xff0c;求出该树的节点个数。 完全二叉树 的定义如下&#xff1a;在完全二叉树中&#xff0c;除了最底层节点可能没填满外&#xff0c;其余每层节点数都达到最大值&#xff0c;并且最下面一层的节点都集中在该层最左边的若干…

20240207-不要用摸鱼打发时间

20240207-不要用摸鱼打发时间 今天是农历年倒数第三天&#xff0c;很多人都已经回家过年了。我有其他出行计划&#xff0c;所以今年没有回家。其实这一点也有违背自己每年都要回家的原则&#xff0c;但相比往年&#xff0c;真的是更愿意出去不愿意回家了。 想家吗&#xff0c;…

FPGA_简单工程_无源蜂鸣器驱动实验

一 理论 蜂鸣器按其结构可分为电磁式蜂鸣器和压电式蜂鸣器2中类型&#xff0c;按其有无信号源&#xff0c;分为有源蜂鸣器和无源蜂鸣器。 有源蜂鸣器&#xff0c;内部装有集成电路&#xff0c;不需要音频驱动电路&#xff0c;就直接能发出声响&#xff0c;而无源蜂鸣器&#…

算法——前缀和算法

1. 什么是前缀和算法 前缀和算法&#xff08;Prefix Sum&#xff09;是一种用于快速计算数组元素之和的技术。它通过预先计算数组中每个位置前所有元素的累加和&#xff0c;将这些部分和存储在一个新的数组中&#xff0c;从而在需要计算某个区间的和时&#xff0c;可以通过简单…

C++ 内存管理(newdelete)

目录 本节目标 1. C/C内存分布 2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free 3. C内存管理方式 3.1 new/delete操作内置类型 3.2 new和delete操作自定义类型 4. operator new与operator delete函数 5. new和delete的实现原理 6. 定位new表达式(placem…

设置idea中放缩字体大小

由于idea没默认支持ctrl滚轴对字体调节大小&#xff0c;下面一起设置一下吧&#xff01; 点击 文件 -> 设置 按键映射 -> 编辑器操作 -> 搜索栏输入f 点击减小字体大小 -> 选择增加鼠标快捷键 按着ctrl键&#xff0c;鼠标向下滚动后&#xff0c;点击确定即可 然后…

微软.NET6开发的C#特性——类、结构体和联合体

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;看到不少初学者在学习编程语言的过程中如此的痛苦&#xff0c;我决定做点什么&#xff0c;下面我就重点讲讲微软.NET6开发人员需要知道的C#特性。 C#经历了多年发展&#xff0c; 进行了多次重大创新&#xf…

Hadoop搭建(完全分布式)

节点分布&#xff1a; bigdata-masterbigdata-slave1bigdata-salve2 NameNode NodeManager NodeManager SecondaryNameNodeDataNodeDataNodeResourceManagerNodeManagerDataNode 目录 一、jdk安装&#xff1a; 二、hadoop安装 一、jdk安装&#xff1a; jdk-8u212链接&am…

git 使用 (备查)

git忽略清单 添加忽略清单 SSH免登录 ssh协议可以实现免登录操作&#xff0c;身份验证通过密钥实现。 跨团队写作 解决冲突 拉取 克隆 拉取最新版本 推送 远程仓库别名 直接使用git push推送 多人协作开发 分支命令 合并分支命令在主分支使用&#xff0c;将develop分支合并到…