eureka 自我保护机制

Eureka Client 通过向Eureka Server 发送心跳(每30 秒一次)来续约服务。如果某个客户端不能持续续约,那么Eureka Server 断定该客户端不可用, 该不可用的客户端将在大约90 秒后从Eureka Serve 服务注册列表中删除。但如果是注册中心发生故障,服务就有可能不能正常续约。而此时服务仍然是可以正常使用的,如果Eureka将其剔除,则会造成误杀。当大量的服务续约超时时,Eureka Server即认为是自己出现问题了。开启自我保护不在剔除服务。自我保护模式被激活后,Eureka不会从注册列表中剔除因长时间没收到心跳导致租期过期的服务,而是等待修复,直到心跳恢复正常之后,自动退出自我保护模式。

Eureka 会定时清理续约超时的服务:

if(没有开启自我保护){
    不开启自我保护,正常进行服务剔除;
}else(开启了自我保护){
    if(上一分钟的续约数(count * 2) < 自我保护阀值(int(count * 2 * 85%))){
        开启自我保护,不在进行服务剔除;
    }
}

解决方式有三种:

  1. 关闭自我保护模式
eureka:
  server:
    enable-self-preservation: false
  1. 降低renewalPercentThreshold的比例
#设置为0.5以下,比如:
eureka:
  server:
    renewal-percent-threshold: 0.49
  1. 部署多个 Eureka Server 并开启其客户端行为,即构建高可用的集群:
eureka:
  client:
    register-with-eureka: true

在项目中, 可能成千上百的微服务实例,这时Eureka Server 承担了非常高的负载。因此构建Eureka Server高可用集群:
bootstrap.yml

spring:
  application:
    name: eureka-server
  profiles:
    active: peer1

application-peer1.yml

server:
  port: 8761
eureka:
  instance:
    hostname: peerl
  client:
    serviceUrl:
      defaultZone: http://peer2:8762/eureka/

application-peer2.yml

server:
  port: 8762
eureka:
  instance:
    hostname: peer2
  client:
    serviceUrl:
      defaultZone: http://peer1:8761/eureka/

上述代码定义了两个profile 文件,分别为peer1 和peer2,它们的hostname 分别为peer1和peer2,端口分别为8761 和8762 。在本地搭建Eureka Server 集群,需要修改本地的host。Windows 系统的电脑在C:/windows/systems/drivers/etc/hosts 中修改:

127.0.0.1 peer1
127.0.0.1 peer2

或者使用yml文件分段,指定生效段落:

--spring.profiles.active=peer1
--spring.profiles.active=peer2

启动eureka- client 工程,配置文件中仅向 http://peer1:8761/eureka/ 的Eureka Server 注册,peer1的注册列表信息会同步到了peer2节点。

你可能感兴趣的:(eureka 自我保护机制)