因为是个人服务器,虽然采用集群的方式部署,但是Eureka的三个节点我都是部署在一台服务器上,在运行过程中会出现异常提示,Eureka已经进入自我保护模式。
那么首先我们来说下什么是自我保护模式:
当 Eureka Server 节点在短时间内丢失了过多实例的连接时(比如网络故障或频繁的启动关闭客户端),那么这个节点就会进入自我保护模式,一旦进入到该模式,Eureka server 就会保护服务注册表中的信息,不再删除服务注册表中的数据(即不会注销任何微服务),当网络故障恢复后,该 Ereaka Server 节点就会自动退出自我保护模式
默认情况下,如果 Ereaka Server 在一段时间内没有接受到某个微服务示例的心跳,便会注销该实例(默认90秒),而一旦进入自我保护模式,那么即使你关闭了指定实例,仍然会发现该 Ereaka Server 的注册实例中会存在被关闭的实例信息,如果你对该实例做了负载均衡,那么仅关闭了其中一个实例,则通过网关调用接口api
时很可能会发生如下异常:
{
"timestamp": 1507707671780,
"status": 500,
"error": "Internal Server Error",
"exception": "com.netflix.zuul.exception.ZuulException",
"message": "GENERAL"
}
遇到这个问题解决方法有很多种。
第一种:重启Eureka服务
第二种:修改自我保护系数
第三种:简单粗暴,直接关闭自我保护模式。
# 关闭自我保护模式
enable-self-preservation: false
# Eureka Server 自我保护系数,当enable-self-preservation=true时,启作用
# renewal-percent-threshold:
个人建议,在开发过程中关闭自我保护模式,但是在生成环境中不建议关闭,存在的目的就是为了对注册中心进行一种防护。
后语:在实际开发过程中,建议现在测试环境上搭建好注册中心的集群,开发人员不需要每次都启动本地的注册中心进行注册,所有的服务提供者和消费者都使用统一的注册中心进行注册,不管是对于联调,还是各种异常情况的处理还是有一定的好处的。