Eureka自我保护机制

概述

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

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

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

什么是自我保护模式

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

自我保护机制

默认情况下EurekaClient定时向EurekaServer端发送心跳包

如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间(90秒中)内丢失了大量的服务实例心跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通,但是EurekaClient未出现宕机,此时如果换做别的注册中心如果一定时间内没有收到心跳会将剔除该服务,这样就出现了严重失误,因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的)

禁止自我保护设置(默认是开启)

注册中心
eureka:
  instance:
    hostname: erueka7001.com #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。
      #defaultZone: http://erueka7002.com:7002/eureka/
      defaultZone: http://erueka7001.com:7001/eureka/
  server:
    enable-self-preservation: false #禁止自我保护
    eviction-interval-timer-in-ms: 2000 #由保护时间90秒限制改为2秒,单位毫秒
服务端
eureka:
  client:
    register-with-eureka: true #表示是否将自己注册进EurekaServer默认为true
    #是否从EurekaServer抓取已有的注册信息,默认为true。
    #单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://erueka7001.com:7001/eureka/,http://erueka7002.com:7002/eureka/
  instance:
    instance-id: payment8001 #主机名修改
    prefer-ip-address: true #访问路径可以显示ip地址
    #eureka客户端向服务端发送心跳的间隔,单位秒,默认30
    lease-renewal-interval-in-seconds: 1
    #eureka服务端在收到最后一次心跳后等待时间上限,单位为秒,默认90,,超时将剔除服务
    lease-expiration-duration-in-seconds: 2
原文地址:https://www.cnblogs.com/cowshed/p/12846700.html