Eureka的自我保护机制

一:Eureka的自我保护机制是什么?

保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。

简单一句话:(好死不如赖活着)

用电视剧新三国中,曹操说的:"宁可天下人负我,我不负天下人"即:Eureka服务端,进入自我保护模式,就算所有的微服务真的都出问题了,也不会里面删除它们的。

二:为什么会出现自我保护机制?

一句话:某时刻某一个微服务不可用了,Eureka不会立刻清理,依旧会对该服务的信息进行保存。属于CAP里面的AP分支,也即是:保证可用性、分区容错性。

PS:CAP原则:分布式系统中,C:一致性;A:可用性;P:分区容错性。

我们来看看百度百科对CAP原则的详细介绍,如下图:

为什么会产生Eureka自我保护机制?

为例防止EurekaClient可以正常运行,但是与Eureka Server网络不通情况下,EurekaServer 不会立刻将EurekaClient服务剔除

默认情况下,如果EurekaServer在一定时间内没有收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90s).但是当网络分区故障发生(延时、卡顿、拥挤)时候,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险了--因为微服务本身其实是健康的。此时本不应该注销这个微服务的。Eureka通过"自我保护模式"来解决这个问题--当EurekaServer节点在短时间内丢失过多客户端时候(可能发生了网络分区故障),那么这个节点就会进入自我保护模式了。

综上,自我保护是一种应对网络异常的安全保护措施。它的架构哲学是宁可同时保留所有微服务(健康的、不健康的微服务都会保留),也不盲目注销任何健康的微服务。

职用自我保护模式,可以让Eureka集群更加的健壮和稳定

三:怎么禁止Eureka的自我保护?

出厂默认,自我保护机制是开启的:eureka.server.enable-self-preservation=true

3.1:来看看开启自我保护模式的时候,Eureka服务端提示:

3.2:修改服务导关闭自我保护

修改Eureka Server项目:7001项目的yml配置:

关闭自我保护机制,同时修改心跳时间为2s.如下图:

java 复制代码
server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
    #集群指向其它eureka
      #defaultZone: http://eureka7002.com:7002/eureka/
    #单机就是7001自己
      defaultZone: http://eureka7002.com:7002/eureka/
  server:
    #关闭自我保护机制,保证不可用服务被及时踢除
    enable-self-preservation: false
    # 设置心跳时间(eureka默认心跳时间是30秒)
    eviction-interval-timer-in-ms: 2000

重启Eureka服务项目,来看看关闭自我保护模式后提示:

我们来修改客户端(payment8001项目)的yml配置文件:

Eureka客户端向服务端发送心跳的时间间隔-单位秒(默认30s),修改为1s.

Eureka服务导在收到最后一次心跳后等待时间上限,超时将剔除服务单位秒,默认90s,修改值为2s.如下图:

java 复制代码
#eureka配置
eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true。
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetchRegistry: true
    service-url:
      #defaultZone: http://localhost:7001/eureka # 单机版
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka # 集群版
  instance:
    instance-id: payment8001
    prefer-ip-address: true #访问路径可以显示IP地址
    #Eureka客户端向服务端发送心跳的时间间隔,单位为秒(默认是30秒)
    lease-renewal-interval-in-seconds: 30
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位为秒(默认是90秒),超时将剔除服务
    lease-expiration-duration-in-seconds: 90
  server:
    #关闭自我保护机制,保证不可用服务被及时踢除
    enable-self-preservation: false
    # 设置心跳时间(eureka默认心跳时间是30秒)
    eviction-interval-timer-in-ms: 2000

测试关闭自我保护机制:

启动服务端7001项目,再启动客户端8001项目,我们可以在页面查看客户端成功注册到服务端了。如下图:

我们关闭客户端8001项目后,间隔2秒+以后,在刷新页面.可以看到客户端被移除了。如下图:

当出现这个效果,说明,我们测试成功了

当eureka关闭自我保护模式后,只要检查到客户端没有发送心跳检测,就将客户端从注册列表中移除了,这是很危险的。

用一句话来形容,关闭自我保护模式的Eureka服务:曹孟德曰:宁可我负天下人,不可天下人负我。

为什么说,没有了自我保护机制很危险?

有可能因为网络原因,没有发送心跳成功,但是实际上客户端是正常运行的。如果这个时候,直接移除掉客户端,可能造成服务大面积不能使用。是很危险的一个操作。所以,最好别关闭自我保护机制

相关推荐
Chan1610 小时前
【 SpringCloud | 微服务 MQ基础 】
java·spring·spring cloud·微服务·云原生·rabbitmq
movie__movie11 小时前
Eureka REST 相关接口
eureka·注册中心
2201_7611990411 小时前
k8s4部署
云原生·容器·kubernetes
慌ZHANG12 小时前
云原生技术驱动 IT 架构现代化转型:企业实践与落地策略全解
云原生
西京刀客13 小时前
k8s热更新-subPath 不支持热更新
云原生·容器·kubernetes·configmap·subpath
爱瑞瑞17 小时前
云原生学习笔记(五) 构建 Docker 镜像与运行容器
云原生
大咖分享课17 小时前
云原生监控体系建设:Prometheus+Grafana的企业级实践
云原生·grafana·prometheus
藥瓿亭18 小时前
K8S认证|CKS题库+答案| 7. Dockerfile 检测
运维·ubuntu·docker·云原生·容器·kubernetes·cks
容器魔方18 小时前
KubeCon 抢鲜 | Kmesh与你共创高性能流量治理更优方案
云原生·容器·云计算
Gold Steps.20 小时前
Docker容器部署elasticsearch8.*与Kibana8.*版本使用filebeat采集日志
运维·docker·云原生·es