SpringCloud -- 自我保护

最近在读《SpringCloud微服务实战》一书,记录一下知识点

  当我们在本地调试基于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_Server的自我保护机制,服务注册到Eureka_Server之后,会维护一个心跳连接,告诉Eureka_Server自己还活着。Eureka Server在运行期间,会统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况(在单机调试的时候很容易满足,实际在生产环境上通常是由于网络不稳定导致),Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期,尽可能保护这些注册信息,同时提示这个警告。   但是,在这段保护期间内若实例出现问题,那么客户端很容易拿到实际已经不存在的服务实例,会出现调用失败的情况,所以客户端必须要有容错机制,比如可以使用请求重试,断路器等机制。   由于本地调试很容易触发注册中心的保护机制,这会使得注册中心维护的服务实例不那么准确。所以在本地开发的时候,可以使用如下参数来关闭保护机制,以确保注册中心可以将不可用的实例正确剔除。

eureka.server.enable-self-preservation=false