Eureka的自我保护机制(eureka自我保护机制原理)
bigegpt 2025-06-12 10:55 6 浏览
最近遇到一个问题,服务之间调用报错,显示无法路由到指定服务,但是对应的服务是启动的,查询eureka,结果eureka上显示如下,所有实例均消失,我个人对注册中心并没有什么研究,进行正好借此机会简单总结一下。
先说一下Eureka上三种提示信息:
1.在配置上,自我保护机制关闭
RENEWALS ARE LESSER THAN THE THRESHOLD. THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
2.自我保护机制开启了
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
3.在配置上,自我保护机制关闭了,但是一分钟内的续约数没有达到85% ,可能发生了网络分区
THE SELF PRESERVATION MODE IS TURNED OFF.THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.
自我保护机制是个啥?
Eureka自我保护机制是一种防御性的机制,旨在防止集群中出现“脑裂”现象。当Eureka服务器节点在短时间内丢失过多的客户端时(可能是因为网络分区故障、短暂的网络问题或者客户端并未正常关闭),会触发自我保护机制。在这种模式下,Eureka不会立即将服务实例从注册列表中移除,以防止因为网络分区故障导致服务不可用。
那关闭自动保护机制会发生什么?
eureka关闭了自我保护机制后,遇到网络波动等不可控因素导致微服务心跳没及时响应时,会立即从eureka中剔除微服务,即使这些实例可能还正常运行。如果这个服务器重新恢复联系,那么这些实例就会重新注册,可能会导致服务注册的不一致性,从而导致有大量的无效服务实例保留在Eureka服务器上,浪费资源。
相反,eureka打开了自我保护机制,微服务还能有时间缓冲一下,待心跳重新连接上后,继续提供服务;因此,在生产环境中通常推荐保留自我保护机制,并适当调整Eureka的自我保护阈值,以达到最佳的稳定性和可用性。如果确实需要关闭,可以通过设置
eureka.server.enable-self-preservation=false来关闭自我保护机制。对于开发环境的Eureka,个人更建议关闭它的自我保护模式,因为你可能需要不断的开启与关闭实例,如果并未关闭自我保护模式,那么很容易就会触发自我保护模式,此时对调试会相对比较麻烦。
服务续约任务的调用间隔时间即心跳续约,默认为30秒
eureka.instance.lease-renewal-interval-in-seconds=30
服务失效的时间即指定时间内没有心跳则注销此实例,默认为90秒。
eureka.instance.lease-expiration-duration-in-seconds=90
自动保护机制的工作机制是什么样的?
如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:
- Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
- Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
- 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
Eureka控制台参数说明
页面上的控制面板中总体分为这几部分:System Status、DS Replicas、Instances currently registered with Eureka、General Info、Instance Info
- System Status(系统状态):
Environment | 环境,默认为test,该参数在实际使用过程中,可以不用更改,可以通过eureka.environment更改 |
Data center | 数据中心,使用的是默认的是 “default”,可以通过eureka.datacenter更改 |
Current time | 当前的系统时间 |
Uptime | 已经运行了多少时间 |
Lease expiration enabled | 是否启用租约过期 ,自我保护机制关闭时,该值默认是true, 自我保护机制开启之后为false |
Renews threshold | 每分钟最少续约数,Eureka Server 期望每分钟收到客户端实例续约的总数 |
Renews (last min) | 最后一分钟的续约数量(不含当前,1分钟更新一次),Eureka Server 最后 1 分钟收到客户端实例续约的总数 |
- DS Replicas(副本):
这个下面的信息是这个Eureka Server相邻节点,互为一个集群
- Instances currently registered with Eureka:
当前注册在eureka上的实例名称、状态以及地址
- General Info(系统基础信息):
total-avail-memory | 总共可用的内存 |
environment | 环境名称,默认test |
num-of-cpus | CPU的个数 |
current-memory-usage | 当前已经使用内存的百分比 |
server-uptime | 服务启动时间 |
registered-replicas | 相邻集群复制节点 |
unavailable-replicas | 不可用的集群复制节点,如何确定不可用? 主要是server1 向 server2和server3发送接口查询自身的注册信息,如果查询不到,则默认为不可用,也就是说如果Eureka Server自身不作为客户端注册到上面去,则相邻节点都会显示为不可用。 |
available-replicas | 可用的相邻集群复制节点 |
- Instance Info(实例信息):
ipAddr | eureka服务端IP |
status | eureka服务端状态 |
相关推荐
- 为3D手游打造, Visual Studio Unity扩展下载
-
IT之家(www.ithome.com):为3D手游打造,VisualStudioUnity扩展下载7月30日消息,微软正式发布升级版VisualStudioToolsforUnity扩...
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
-
1.前言前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQLServer中对于数值型字段可以设置自增。所以我打开ArcCatalog查看发现只提供默认值,没办法只能看...
- 微软首次回答 HoloLens 相关问题,终于爆料了
-
fengo2015/04/2115:11注:本文作者张静是NVIDIAGPU架构师,微信公众号“黑客与画家”(HackerAndPainter),知乎专栏地址。欢迎各位童鞋与他交流探讨。...
- C#指针的应用(c#指针类型)
-
C#在有限的范围内支持指针。C#的指针只不过是一个持有另一类型内存地址的变量。但是在C#中,指针只能被声明为持有值类型和数组的内存地址。与引用类型不同,指针类型不被默认的垃圾收集机制所跟踪。出于同...
- C# 堆栈(Stack)(c# 堆栈中定位调用messagebox 的地方)
-
C#集合在C#中,堆栈(Stack)是一种后进先出(LIFO,LastInFirstOut)的数据结构。堆栈(Stack)适用于存储和按顺序处理数据,其中最新添加的元素会最先被移除。堆...
- 欢迎回来:Fortran意外重回流行编程语言20强榜单
-
TIOBE指数是用来确定一种编程语言受欢迎程度的指标之一。它并不表明哪种编程语言是最好的,也不表明哪种编程语言写的代码行数最多,而是利用在谷歌、维基百科、必应、亚马逊、YouTube等各种引擎和网站上...
- C#+NET MAUI实现跨平台/终端(linux,win,ios等)解决方案
-
简介.NETMulti-platformAppUI(.NETMAUI)是一个跨平台的框架,用于使用C#和XAML创建移动和桌面应用程序。使用.NETMAUI,您可以用一套代码库开发可以在A...
- C#代码安全红线:SQL注入防护终极方案,让你的系统固若金汤
-
在数字化时代,应用系统的安全性至关重要。而SQL注入攻击,长期盘踞在OWASP(OpenWebApplicationSecurityProject)漏洞榜单的前列,成为众多基于数据库的应用系统...
- C# (一)状态机模式(状态机代码实现)
-
最近空闲,炒炒隔夜饭,以前这些模式在自己项目种应用过不少,但一直没有像别人那样写一个系列,最近年纪大了,很多东西都忘记了,特别AI的兴起,更少写代码了,反正没什么事情,自己在重写一遍吧。创建型模式(5...
- C# 中 Predicate 详解(c#中的replace)
-
Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由Array和List类的几种方法使用,用于在集合中搜索元素。Predicate<T>...
- C#中$的用法?(c#中&&什么意思)
-
文章来自AI问答。在C#中,$符号用于字符串插值(StringInterpolation)。字符串插值是C#6.0引入的一种特性,它允许你在字符串中直接嵌入表达式,而不需要使用string.For...
- C#并行编程:Parallel类(c# 并行处理)
-
在Parallel类中提供了三个静态方法作为结构化并行的基本形式:Parallel.Invoke方法:并行执行一组委托。Parallel.For方法:执行与C#for循环等价的并行方法。Parall...
- 颠覆认知!用Span重构foreach循环竟让数据处理快如闪电
-
在C#编程的世界里,数据处理效率始终是开发者们关注的焦点。随着项目规模的扩大和数据量的激增,哪怕是细微的性能提升,都可能对整个应用的响应速度和用户体验产生深远影响。近年来,C#引入的Span<T...
- Unity3D手游开发实践《腾讯桌球》客户端开发经验总结
-
本次分享总结,起源于腾讯桌球项目,但是不仅仅限于项目本身。虽然基于Unity3D,很多东西同样适用于Cocos。本文从以下10大点进行阐述:1.架构设计2.原生插件/平台交互3.版本与补丁4.用脚本,...
- .NET 7 AOT 的使用以及 .NET 与 Go 互相调用
-
目录背景C#部分环境要求创建一个控制台项目体验AOT编译C#调用库函数减少体积C#导出函数C#调用C#生成的AOTGolang部分安装GCCGolang导出函数.NETC#...
- 一周热门
- 最近发表
- 标签列表
-
- mybatiscollection (79)
- mqtt服务器 (88)
- keyerror (78)
- c#map (65)
- resize函数 (64)
- xftp6 (83)
- bt搜索 (75)
- c#var (76)
- mybatis大于等于 (64)
- xcode-select (66)
- mysql授权 (74)
- 下载测试 (70)
- linuxlink (65)
- pythonwget (67)
- androidinclude (65)
- logstashinput (65)
- hadoop端口 (65)
- vue阻止冒泡 (67)
- oracle时间戳转换日期 (64)
- jquery跨域 (68)
- php写入文件 (73)
- kafkatools (66)
- mysql导出数据库 (66)
- jquery鼠标移入移出 (71)
- 取小数点后两位的函数 (73)