首页 > 其他分享 >Eureka vs. Nacos:注册中心角色之间的不同特性

Eureka vs. Nacos:注册中心角色之间的不同特性

时间:2024-04-02 12:32:49浏览次数:14  
标签:服务 实例 提供者 Nacos Eureka vs 加载

此文章简要介绍一下Eureka和Nacos在注册中心功能上规则、功能的不同

服务拉取机制

这一部分内容我们可以引入两个远程调用最初的问题来引入

  • 消费者如何得知提供者信息,包括url,健康状态等?
  • 当程序并发量大,提供者以集群部署时,应该如何选择?

根据此二问题,衍生出了服务拉取等环节(服务拉取:经过负载均衡的服务调用)

也为了应对这样的问题,我们需要一个统一的中介角色,来管理提供者和消费者,并且登记提供者的地址等信息。同时,在出现集群时,有对应的算法均衡负载。Eureka便是这样的一个角色。在微服务启动时,提供者将自己的集群信息发送到Eureka中,并每隔30s向Eureka发送心跳响应,保证提供者的健康状态。(若提供者宕机则剔除出注册中心)。

但是这个拉取并不是每一次需要远程调用时都需触发的。Eureka中规定了定时拉取&缓存的机制,用以提高服务的效率。每一次拉取之后,所有的服务都将缓存在一个服务列表中。同时若长时间多次使用此服务时。也需要对提供者的健康状态等信息做出更新。于是Eureka中规定,对统一服务的列表缓存每隔30s做出更新。 (前提是过了30s中此提供者仍需再次提供服务)

而在Nacos中,其规则不尽相同

Nacos会将实例区分为临时实例非临时实例

  • 对于临时实例,其心跳响应机制跟Eureka大致相同,但是其响应频率更高。若其宕机,Nacos直接将其从服务列表中剔除
  • 对于非临时实例,其不会对Nacos进行心跳相应。而是由Nacos主动发送请求,并确认对应状态。(有点像是变相的心跳响应)若其宕机,Nacos也不会剔除,仅仅标记其为不健康服务

在Eureka中,服务消费者会对Eureka定时拉取 (pull) ,拉取更新服务列表的信息。而由于Nacos与服务提供者的不同特性,相比之下服务更新的状态时效性较差。于是Nacos中增加了新的特性。在提供者和Nacos的状态更新中,若有实例宕机或健康状态改变,Nacos会主动推送(push)实例的变更信息。 从而保证服务列表中状态的一致性。

但是主动推送这一特性,对服务器带来的压力会较大。所以需结合使用场景,斟酌好使用临时实例或非临时实例。

如何将服务配置为临时或 非临时实例?

修改配置文件如:

spring.cloud.nacos.discovery.ephemeral: flase
# 非临时实例
spring.cloud.nacos.discovery.ephemeral: true
# 临时实例

CAP

Eureka和Nacos在CAP模式规则设计上的差别

CAP 定理,也称为 Brewer 定理,是分布式系统中的一个基本原则,它阐明了三个关键属性之间的固有权衡:一致性、可用性和分区容错性。CAP 定理由计算机科学家 Eric Brewer 于 2000 年提出,现已成为架构师和工程师设计分布式系统的基石概念。这些模式描述了在分布式系统中不同的设计目标和优先级。

  • C -> 一致性(Consistency)

一致性强调在所有分布式节点具有同时的数据视图,当需要修改时,确保修改后的最新数据能同步到所有节点当中。

  • A -> 可用性(Availability)

可用性强调在系统面对故障or宕机等特殊情况时,整个分布式系统仍能继续处理请求,返回响应,不会因部分节点的故障导致整体宕机。但此时不能保证其含有最新版本的数据

  • P -> 分区容忍性(Partition Tolerance)

指即使部分服务出现故障宕机,从而导致节点之间时区通信。但系统仍能维持其运行的能力。

实际开发中,根据应用场景的不同,以及业务功能的要求不同。我们需要在一致性和可用性之间做平衡取舍。而CAP定理可以给我们带来一份范本。

而在Eureka和Nacos的集群部署当中

  • Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;
  • Eureka采用AP方式

注意,虽然两者默认采用的都是AP模式,但并不代表同时就牺牲了一致性。两者的心跳机制便是保证数据一致性的重要规则。另外还有注册表同步,集群选举等保证一致性的重要措施。

数据存储方式

  1. Eureka的数据存储方式

    • Eureka使用内存中的数据结构来存储服务实例信息,例如使用HashMap等数据结构。
    • 默认情况下,Eureka并不提供对服务实例信息的持久化支持,这意味着当Eureka服务器重启或者发生故障时,原有的服务实例信息将会丢失,需要重新注册。
  2. Nacos的数据存储方式

    • Nacos提供了多种数据存储方式,可以根据实际需求选择合适的存储方式来存储服务实例信息,包括内嵌数据库、MySQL、Redis等。
    • 内嵌数据库是Nacos的默认存储方式,可以在启动Nacos时自动创建并初始化数据库表,将服务实例信息持久化到数据库中。
    • 使用外部数据库(如MySQL、Redis)可以提供更高的可靠性和扩展性,保证了服务实例信息的持久化和高可用性,同时也方便了数据的管理和备份。

相较之下,Eureka的这种设计适合于轻量级的应用场景。其本身并没有内置的持久化机制,这种设计灵活性较高,用户可以根据自己的实际情况选择合适的持久化方式,并自定义持久化的规则。但同时也需要具备更多的开发能力,自行实现对Eureka Server的持久化支持。

在自定义配置项中,可以通过配置Eureka Server示例信息的过期时间eureka.server.eviction-interval-timer-in-ms,以及自我保护模式下的过期时间eureka.server.renewal-percent-threshold,确保示例信息不会因未更新而被删除。另外也可以结合Redis等配置持久化缓存,但没有直接的接口使Eureka进行持久化。

加载策略

在Eureka中,默认采用的是饥饿加载,Nacos则默认使用惰性加载

两者定义:

  1. 饥饿加载(Eager Loading)

    • 饥饿加载是指在需要使用对象或数据之前就提前加载它们到内存中。
    • 在关系数据库中,饥饿加载可以通过一次性查询所有相关数据来实现,例如使用 SQL 中的 JOIN 操作,将多个表的数据一次性加载到内存中。
    • 在对象关系映射(ORM)中,饥饿加载可以通过在查询对象时同时加载其关联对象的数据来实现,例如使用 Hibernate 中的 Fetch 操作。
    • 减少后续查询或访问时的延迟,提高系统性能和响应速度。
    • 可能会导致不必要的数据加载和内存消耗。

一次性把所有数据和服务都加载到内存当中,启动时缓慢,但是减少使用对应服务时的加载时间。

  1. 惰性加载(Lazy Loading)

    • 惰性加载是指在需要使用对象或数据时才进行加载,延迟加载到最后可能需要使用的时候。
    • 在关系数据库中,惰性加载可以通过延迟执行查询来实现,例如在 ORM 中使用延迟加载的关联对象,在需要访问关联对象数据时才真正执行查询。
    • 在前端开发中,惰性加载也常用于延迟加载页面内容或组件,例如使用懒加载技术来减少初始页面加载时的资源消耗。
    • 节省了不必要的资源消耗和加载时间。
    • 增加访问时的延迟。

用到什么再加载什么,大量使用不同的未加载的服务可能导致效率非常低

当Eureka Server启动时,它会立即尝试从所有注册的服务中心获取服务实例信息,并将这些信息加载到内存中。这一方式确保在系统启动后尽快获取和管理服务实例的信息,以便其他服务可以快速地发现和调用这些服务。

在Nacos中,服务注册和发现是惰性加载的。当Nacos Server启动时,并不会立即加载所有服务实例信息到内存中,而是在有具体的服务实例注册或者查询时才会进行加载和处理。节省了不必要的资源和内存消耗。

一般来说,Eureka的饥饿加载适合于对服务实例信息实时性要求较高的场景,如支付服务等,与内存资源充足的场景,如云原生应用。

而Nacos的惰性加载则适合于对系统资源消耗和加载时间有一定要求的场景,如电子商城中所有的商品具体信息。

标签:服务,实例,提供者,Nacos,Eureka,vs,加载
From: https://blog.csdn.net/m0_62551536/article/details/137105058

相关文章

  • [实验室服务器使用]使用VSCode、PyCharm、MobaXterm和CMD连接远程服务器
    实验室服务器使用:使用VSCode、PyCharm、MobaXterm和CMD连接远程服务器在进行实验室工作时,远程连接服务器是常见的需求之一。本篇文章根据个人的一些使用介绍使用不同工具连接服务器的方法,并提供优化功能,使服务器能够使用本机代理的说明。准备服务器账号信息Host(主机):10.......
  • VSCode快捷键
    快捷键tab名称英文快捷键注释commentsectionCtrl+/取消注释uncommentsection函数参数提示ctrl+shift+space代码格式化对其ctrl+kctrl+f跳转指定行ctrl+g跳转到上一步alt+左方向跳转到下一步atl+右方向......
  • vscode开发flutter
    Flutter开发app配置国内镜像,或使用vpn,文档在中国网络环境下使用Flutter|Flutter中文文档-Flutter中文开发者网站-Flutter先从官网下载AndroidStudio,下载完成后,命令行运行flutterdoctor指令将检查Windows完整的Flutter开发环境的所有组件。显示缺少......
  • Nacos注册中心
    1.Nacos介绍Nacos是阿里巴巴的产品,现在是SpringCloud中的一个组件,相对于Eureka功能更加丰富,在国内受欢迎程度高。Nacos安装地址Release1.4.7(Jan15th,2024)·alibaba/nacos·GitHub2.Nacos安装过程下载安装包之后,解压到没有中文的路径下,我这里安装在D盘Nacos默认......
  • vscode中python下面的代码都变暗了
     现象: 分析在VisualStudioCode(VSCode)中,如果Python代码变暗,这通常是因为编辑器将这些代码识别为未使用或未激活的代码。这可能是由几个原因引起的:代码未被执行或引用:如果代码块没有被函数、类或其他代码结构所引用,VSCode可能会将其视为未使用的代码。代码被......
  • vscode 必装插件
    AutoCompleteTag集合了AutoCloseTag和AutoRenameTagAutoCloseTag:自动补全结束标签AutoRenameTag:修改前面的htmltag后面</>里面的也会同步修改只需要装一个插件就能得到之前2个插件的能力CommentTranslate鼠标选中能够直接浮窗翻译.(win系统好像是墙的原因......
  • vsphere API 调用创建虚拟机
    1.版本介绍vsphere:vSphereClient版本7.0.3.01100VsphereAPI参考地址:vSphereWebServicesAPI-VMwareAPIExplorervsphereAPI github给的参考例子地址:pyvmomi-community-samples/samples/tools/service_instance.pyatmaster·vmware/pyvmomi-c......
  • vscode --- 某些文件夹为灰色全局搜索搜不到该文件夹的内容
    一,简介本文主要介绍在VSCode使用过程中,出现文件夹为灰色,且搜索内容时灰色文件夹中的字符串检索不到问题的原因和解决方法,从而提高工作效率。供参考。二,问题现象VSCode中部分文件夹显示为灰色,全局搜索,检索不到这些文件夹的内容。三,问题原因灰色的目录和文件表示在.gitignor......
  • vsftpd服务匿名检查
    #!/bin/bash#HostIP/主机ipipaddr="$1"#ChangeLANGToC#oldLANG=$LANG#exportLANG=CLANG=en_us#$1临时数据存放点root_time=`chage-lroot|head-1|awk-F':''{print$2}'|sed's///g'|sed's/,/-/g'`dnt_t......
  • vscode远程连接docker容器打断点调试python项目
    vscode远程连接服务器docker容器前提:本地和远程都安装docker插件。1.安装完docker插件后点击插件图标2.如果登录的账号没有docker权限的会会报权限不足,使用以下命令把用户加到docker权限组中sudogpasswd-a<当前登陆用户名>docker#从用户组中删除:sudogpasswd-d<当前......