行业资讯 2025年08月6日
0 收藏 0 点赞 709 浏览 1838 个字
摘要 :

文章目录 一、自我保护背景 二、什么是自我保护机制 三、理论支撑 四、如何禁用自我保护机制 在之前的单机版Eureka环境搭建中,我们在访问浏览器时会看到如图的一串红……




  • 一、自我保护背景
  • 二、什么是自我保护机制
  • 三、理论支撑
  • 四、如何禁用自我保护机制

在之前的单机版Eureka环境搭建中,我们在访问浏览器时会看到如图的一串红字:
Eureka自我保护机制—SpringCloud(H版)微服务学习教程(13)

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.

出现这串红字就表明Eureka启动了自我保护机制。

一、自我保护背景

首先对Eureka注册中心需要了解的是Eureka各个节点都是平等的,没有ZooKeeper(ZK)中角色的概念, 即使N-1个节点挂掉也不会影响其他节点的正常运行。

默认情况下,如果Eureka Server在一定时间内(默认90秒)没有接收到某个微服务实例的心跳,Eureka Server将会移除该实例。但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,而微服务本身是正常运行的,此时不应该移除这个微服务,所以引入了自我保护机制。在自我保护模式中,Eureka Server会保护服务注册表中的信息,不再注销任何服务实例。它的设计哲学就是宁可保留错误的服务注册息,也不盲目注销任何可能健康的服务实例。

二、什么是自我保护机制

官方对应自我保护机制的定义如下:

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

自我保护机制的工作机制是:

如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

1)Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。

2)Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。

3)当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

三、理论支撑

Eureka自我保护机制遵循CAP理论中的AP,即高可用和分区容错性

CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

四、如何禁用自我保护机制

1)如果你不需要使用Eureka的自我保护机制,我们可以通过配置来实现,以单机版Eureka中的7001注册中心为例,我们在cloud-eureka-server7001模块中对其application.yml配置eureka.server.enable-self-preservationfalse,我们可添加如下即可:

eureka:
  server: 
   # 禁用自我保护机制
    enable-self-preservation: false
   # 修改检查失效服务的时间(单位ms)
    eviction-interval-timer-in-ms: 3000

2)测试
启动7001,访问后我们会发现如下:
Eureka自我保护机制—SpringCloud(H版)微服务学习教程(13)
3)另外,我们可以修改客户端减短发送服务心跳和服务端收到最后一次心跳的等待时间,我们在单机版cloud-provider-payment8001application.yml添加如下配置:

eureka:
  instance:
    #让Eureka服务端在收到最后一次心跳后等待的时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 5
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 2

注意:以上配置只是用于学习演示,建议在生产环境使用默认的时间配置

4)测试
此时,在7001启动的情况下,我们再启动8001,然后访问发现注册成功,接着停掉8001服务,过了5~10秒左右,8001实例会被移除。这就说明我们的自我保护机制关闭了,并且修改时间的配置生效了。

微信扫一扫

支付宝扫一扫

版权: 转载请注明出处:https://www.zuozi.net/7852.html

管理员

相关推荐
2025-08-06

文章目录 一、Reader 接口概述 1.1 什么是 Reader 接口? 1.2 Reader 与 InputStream 的区别 1.3 …

988
2025-08-06

文章目录 一、事件溯源 (一)核心概念 (二)Kafka与Golang的优势 (三)完整代码实现 二、命令…

465
2025-08-06

文章目录 一、证明GC期间执行native函数的线程仍在运行 二、native线程操作Java对象的影响及处理方…

348
2025-08-06

文章目录 一、事务基础概念 二、MyBatis事务管理机制 (一)JDBC原生事务管理(JdbcTransaction)…

456
2025-08-06

文章目录 一、SnowFlake算法核心原理 二、SnowFlake算法工作流程详解 三、SnowFlake算法的Java代码…

517
2025-08-06

文章目录 一、本地Jar包的加载操作 二、本地Class的加载方法 三、远程Jar包的加载方式 你知道Groo…

832
发表评论
暂无评论

还没有评论呢,快来抢沙发~

助力内容变现

将您的收入提升到一个新的水平

点击联系客服

在线时间:08:00-23:00

客服QQ

122325244

客服电话

400-888-8888

客服邮箱

122325244@qq.com

扫描二维码

关注微信客服号