开始吧
现象:
简单理解:EurekaServer不会将EurekaClient服务及时剔除
解释:默认情况下,如果Eureka在一定时间内没有收到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区发生故障(延时,卡顿,拥挤)
作用:如果EurekaClient可以正常运行,但是与Eureka网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除。
概述
保护模式主要用于一组客户端和Eureka Server之间存在网络分区场景下的保护。一旦进入保护模式,Eureka Server将会尝试保护其服务注册表中的信息,不再删除服务注册表中的数据,也就是不会注销任何微服务。
为什么会产生Eureka自我保护机制
为了防止EurekaClient可以正常运行,但是与Eureka网络不通情况下,EurekaServer不会立刻将EurekaClient服务剔除。
什么是自我保护模式
默认情况下,如果EurekaServer在一定时间内没有接受到某个微服务实例的心跳,EurekaServer将会注销该实例(默认90秒)。但是当网络分区故障发生(延时、卡顿、拥挤)时,微服务与EurekaServer之间无法正常通信,以上行为可能变得非常危险--因为微服务本身其实是健康的,此时本不应该注销这个微服务。Eureka通过“自我保护模式”来解决这个问题--当EurekaServer节点在短时间内丢失过多客户端时(可能发生了网络分区故障),那么这个节点就会进入自我保护模式。
自我保护机制
默认情况下EurekaClient定时向EurekaServer端发送心跳包
如果Eureka在server端在一定时间内(默认90秒)没有收到EurekaClient发送心跳包,便会直接从服务注册列表中剔除该服务,但是在短时间(90秒中)内丢失了大量的服务实例心跳,这时候EurekaServer会开启自我保护机制,不会剔除该服务(该现象可能出现在如果网络不通,但是EurekaClient未出现宕机,此时如果换做别的注册中心如果一定时间内没有收到心跳会将剔除该服务,这样就出现了严重失误,因为客户端还能正常发送心跳,只是网络延迟问题,而保护机制是为了解决此问题而产生的)
禁止自我保护设置(默认是开启)
代码实现
1、 Eureka服务器端添加配置信息
eureka:
instance:
hostname: eureka7001.com # eureka 服务器的实例名称
client:
# false 代表不向服务注册中心注册自己,因为它本身就是服务中心
register-with-eureka: false
# false 代表自己就是服务注册中心,自己的作用就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
# 设置与 Eureka Server 交互的地址,查询服务 和 注册服务都依赖这个地址
defaultZone: http://eureka7001.com:7001/eureka/ #Eureka单机
# defaultZone: http://eureka7002.com:7002/eureka/ # Eureka集群
server:
# 关闭自我保护机制,保证不可用服务及时剔除
enable-self-preservation: false
# 设置剔除间隔毫秒:2秒内微服务没有心跳就剔除,默认是90s的
eviction-interval-timer-in-ms: 2000
2、 Eureka客户端添加配置信息
eureka:
client:
# 注册进 Eureka 的服务中心
register-with-eureka: true
# 检索 服务中心 的其它服务
fetch-registry: true
service-url:
# 设置与 Eureka Server 交互的地址
defaultZone: http://localhost:7001/eureka/ # 单机版
# defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/ # 集群版
instance:
# 修改在Eureka 注册中心显示的 主机名
instance-id: payment8001
# 显示微服务所在的主机地址
prefer-ip-address: true
# Eureka客户端向服务端发送心跳时间的间隔,单位为秒(默认是30秒)
lease-renewal-interval-in-seconds: 1
# Eureka服务端在收到最后一次心跳后等待时间的一个上限,单位为秒(默认是90秒),超市将剔除服务
lease-expiration-duration-in-seconds: 2
3、 测试即可