SpringCloud系列之服务治理Eureka·9-Eurek
服务自保与服务剔除这两种模式只能选择一种,不能同时选择
注意在实际应用里,并不是所有无心跳的服务都不可用,也许因为短暂的网络抖动等原因,导致服务节点与注册中心之间续约不上,但服务节点之间的调用还是属于可用状态,这时如果强行剔除服务节点,可能会造成大范围的业务停滞,可见两种方式都是各走极端,只有相互搭配使用才能保障最好的效果
image.png服务自保的触发机关
服务自保由两个开关进行控制
- 自动开关
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.
这就是服务自保开启后的警告,意思是说,挂掉的服务有可能会被错误的当做UP,(在一定时间内)续约成功的节点个数占已注册总服务的比值,已经低于限定值,因此所有节点都不会过期,服务自保开启。
这是一个服务自保的自动触发开关,简单来说,服务自保机制会检查过去15分钟以内,所有成功续约的节点,占所有注册节点的比例,如果低于一个限定值(比如85%)就开启服务自保模式。
服务自保模式往往是为了应对短暂的网络环境问题,在理想情况下服务节点的续约成功率应该接近100%,如果突然发生网络问题,比如一部分机房无法连接到注册中心,这时候续约成功率有可能大幅降低。但考虑到Eureka采用客户端的服务发现模式,客户端手里有所有节点的地址,如果服务节点只是因为网络原因无法续约但其自身服务是可用的,那么客户端仍然可以成功发起调用请求。这样就避免了被服务剔除给错杀。
- 手动开关
这是服务自保的总闸,以下配置将强制关闭服务自保,即便上面的自动开关被触发,也不能开启自保功能
eureka.server.enable-self-preservation=false
服务方配置
#每隔5秒,向服务注册中心发送一条续约指令
eureka.instance.lease-renewal-interval-in-seconds=5
#如果30秒以内,依然没有收到续约请求,判定服务过期
eureka.instance.lease-expiration-duration-in-seconds=30
注册中心配置
#强制关闭服务自保(自动开关不起作用)
eureka.server.enable-self-preservation=false
#每隔多久触发一次服务剔除 10秒
eureka.server.eviction-interval-timer-in-ms=10000
配置参数这块需要多多注意,这里是把服务的自保机制给关闭掉了,也就是说如果有服务在一定期限内收不到续约请求就会被剔除掉注册中心,所以这就使得配置参数有问题就会导致服务一直被剔除,例如 每隔30秒发送一条续约,然后5秒没收到就认为是过期,这样服务就会一直被剔除了。