微服务 – Spring Cloud – Eureka自我保护机制

作者: 太阳上的雨天 分类: Java 发布时间: 2023-06-21 00:16

自我保护是什么?

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

因为 Eureka 客户端会定时的向 Eureka 服务端 发送心跳检测包, 默认30秒发送一次。发送目的是为了通知 Eureka 服务端 你好,老六。我还在,别删我!。如果超过90秒(默认90秒),服务端没有收到 Eureka 客户端发送的心跳包,就会认为  My son, you are dead! 我要把你踢出去! 但是如果短时间内丢失了Eureka 客户端发送的心跳包, Eureka 服务端便会触发自我保护机制。而且 Eureka 服务端的自我保护机制是默认开启的。触发自我保护机制会出现红色字体警告:

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 服务端的配置

  server:
    enable-self-preservation: false # 禁用自我保护机制
    eviction-interval-timer-in-ms: 2000 # 2秒钟

Eureka客户端配置:

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

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注