Spring Cloud Eureka的自我保护模式与实例下线剔除

之前我说明了Eureka注册中心的保护模式,由于在该模式下不能剔除失效节点,故按原有配置在实际中不剔除总感觉不是太好,所以深入研究了一下。当然,这里重申一下,不管实例是否有效剔除,消费端实现Ribbon重试机制也是必须的。

说下背景,在微服务架构中,有个CAP原则(一致性,可用性,可靠性),三者由于存在互斥,只能同时满足其二,第三点需要有一定舍弃。Eureka舍弃了强一致性,所以在进入保护模式后,失效节点的一致性不能得到保证。

以下是我验证后的几种方式,可以实现服务的及时剔除。

1、关闭自我保护模式eureka.server.enable-self-preservation=false来关闭。但是,这种方式有违eureka的CAP原则,所以,我并不推荐这种方式。

2、在说明之前,我们先看下源码。

以下代码判断是否进入刷新服务列表的步骤。该代码在AbstractInstanceRegistry.java和PeerAwareInstanceRegistryImpl.java中。

public void evict(long additionalLeaseMs) {
        logger.debug("Running the evict task");
        //主要是看isLeaseExpirationEnabled返回值
        if (!isLeaseExpirationEnabled()) {
            logger.debug("DS: lease expiration is currently disabled.");
            return;
        }
        //进入筛选过期实例的方法。这里省略
}   
public boolean isLeaseExpirationEnabled() {
        //isSelfPreservationModeEnabled由是否开启保护模式配置决定,默认为true
        if (!isSelfPreservationModeEnabled()) {
            return true;
        }
        return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
    }

主要看numberOfRenewsPerMinThreshold和getNumOfRenewsInLastMin()方法。我们主要看numberOfRenewsPerMinThreshold初始化的地方。getNumOfRenewsInLastMin()方法是统计最后一分钟内的心跳统计总数。

//PeerAwareInstanceRegistryImpl.java
 public void openForTraffic(ApplicationInfoManager applicationInfoManager, int count) {
        // Renewals happen every 30 seconds and for a minute it should be a factor of 2.
        this.expectedNumberOfRenewsPerMin = count * 2;
        this.numberOfRenewsPerMinThreshold =
                (int) (this.expectedNumberOfRenewsPerMin * serverConfig.getRenewalPercentThreshold());
//....
}

count是注册在注册中心的实例总数,包括高可用的另外注册中心。我们可以看到,这里是以硬编码的方式初始化expectedNumberOfRenewsPerMin,通过 实例数*2。为什么*2,因为实例默认发送心跳时间是30s,所以通过*2统计一分钟类应收到的总的心跳次数,因为是硬编码,所以不建议修改实例端心跳周期时间!。numberOfRenewsPerMinThreshold是通过总的心跳数乘以允许失败的比例。默认为0.85。expectedNumberOfRenewsPerMin在默认情况下,会每隔15分钟刷新一次。

通过上面分析,我们大致了解了不通过关闭自我保护模式下触发服务剔除操作的条件。得出以下两种方案来实现失效节点的剔除(亲测有效)。

  1. 通过修改每分钟心跳成功最低比例来控制注册中心不进入自我保护模式,实时剔除节点(需要等到实例定义的过期时间,且注册中心触发刷新周期)。eureka.server.renewal-percent-threshold来配置比例。举个例子,当前我们有4个服务实例,计算所知,每分钟有4*2=8个心跳,当需要实现一个实例意外掉线后,则每分钟实际收到心跳为6个,8*x<6时不会进入保护模式,则x<0.75,配置为0.75以下大致可以实现剔除操作,但是由于网络不稳定因素,存在心跳异常,所以该值尽量设置小于0.75多点,如0.5。为什么默认会0.85呢,我觉得应该是有算法支撑,但从结果来看,保护模式还是适用于大规模的服务集群,当一台或几台挂掉之后,也不会进入保护模式,默认比例下,可以实现实例的剔除。如果集群较小,如2台,挂掉一台就会进入保护模式,且保护模式意义不大,可以关闭自我保护模式。
  2. 通过设置实例的心跳时间,改为较小的周期。由于需要判断每分钟实际心跳数>实例总数*2*0.85,才不会进入自我保护模式,所以设置心跳周期较小,使实际心跳数多于比例下的心跳数,可以实现实例的及时剔除。实例的心跳周期设置:eureka.instance.lease-renewal-interval-in-seconds,如设置为5等等,具体可根据以上算法来计算合适的值。

原文地址:https://www.cnblogs.com/ibethfy/p/9593732.html

时间: 2024-10-07 15:53:03

Spring Cloud Eureka的自我保护模式与实例下线剔除的相关文章

springCloud(6):Eureka的自我保护模式、多网卡下的IP选择、Eureka的健康检查

一.Eureka的自我保护模式 进入自我保护模式最直观的体现就是Eureka Server首页的警告,如下图: 默认情况下,如果Eureka Server在一定时间内没有接收到某个微服务实例的心跳,Eureka Server将会注销该实例(默认90秒).但是当网络分区故障发生时,微服务与Eureka Server之间无法正常通信,这就可能变得非常危险了----因为微服务本身是健康的,此时本不应该注销这个微服务. Eureka Server通过"自我保护模式"来解决这个问题----当Eu

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka

基于Spring Cloud的微服务构建学习-3 服务治理:Spring Cloud Eureka 什么是服务治理 服务治理可以说是微服务架构中最为核心和基础的模块,它主要用来实现各个微服务实例的自动化注册与发现. 为什么需要服务治理模块 在最初构建微服务系统的时候可能服务并不多,我们可以通过做一些静态配置来完成服务调用 此时看着一切都还正常. 随着项目逐渐接近尾声,维护人员需要维护的服务越来越多,越来越复杂,最终形成大量的配置文件,维护将会变得越来越困难.此时,微服务应用实例自动化管理框架变得

四、Spring Cloud Eureka——简介

Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能.Spring Cloud通过为Eureka增加了Spring Boot风格的自动化配置,我们只需要通过简单引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松地与Eureka服务治理体系进行整合. Spring Cloud Eureka,使用Netflix Eureka来实现服务注册与发现,它既

1 Spring Cloud Eureka服务治理

注:此随笔为读书笔记.<Spring Cloud微服务实战> 什么是微服务? 微服务是将一个原本独立的系统拆分成若干个小型服务(一般按照功能模块拆分),这些小型服务都在各自独立的进程中运行,服务之间通过基于HTTP的RESTful API进行通信协作.每个微服务维护自身的数据存储.业务开发.自动化测试案例以及独立部署机制.维护自身的数据存储称为数据管理的去中心化.由于数据管理的去中心化,各个微服务的数据一致性成为一个难题,因此,需要强调的是各个服务之间进行无"事务"的调用.

第三章 服务治理:Spring Cloud Eureka

Spring Cloud Eureka是Spring Cloud Netflix 微服务套件中的一部分,它基于Netflix Eureka做了二次封装,主要负责完成微服务架构中的服务治理功能.Spring Cloud 通过为Eureka增加了Spring Boot风格的自动化配置,我们只需通过引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松的与Eureka服务治理体系进行整合. 服务治理: 服务治理可以说是微服务架构中最为核心和基础的模块,主要用来实现各个微服务实例的自动化注册

微服务架构之spring cloud eureka

Spring Cloud Eureka是spring cloud的核心组件,负责服务治理功能,起到中心枢纽作用,其它组件都依赖eureka来获取服务,然后再根据项目需求实现自己的业务,eureka在整个微服务架构中的位置绝对是核心地位. (一)   版本说明 a)         Spring boot   2.0.6.RELEASE b)        Spring cloud  Finchley.SR2 c)         Java version   1.8 (二)   项目设置 Pom

Spring Cloud(二):服务治理——Spring Cloud Eureka

服务治理是微服务架构中最为核心和基础的模块,主要作用是实现各个微服务实例的自动化注册和发现.Spring Cloud Eureka是Spring Cloud Netflix微服务套件中的一部分,基于Netflix EureKa做了二次封装,主要负责微服务架构中的服务治理功能. Eureka的服务发现包含两大组件,服务端发现组件(Eureka Server)和客户端发现组件(Eureka Client).服务端发现组件也被称为服务注册中心,主要提供了服务的注册功能,客户端发现组件主要用于处理服务的

Spring Cloud微服务实战-服务治理(Spring Cloud Eureka)

1. Spring Cloud Eureka简介 Spring Cloud Eureka主要用来完成微服务中的服务治理.是基于Netflix Eureka做的二次封装,Spring Cloud通过为Eureka增加了Spring Boot风格的自动化配置,我们只需要通过引入依赖和注解配置就能让Spring Boot构建的微服务应用轻松地与Eureka服务治理体系进行整合. 2. 服务治理背景 在微服务开发工程中,整个系统微服务应用非常多,并且随着业务的发展,微服务的数量在不断增加.而微服务之间的

基于Spring Cloud的微服务构建学习-3 服务治理-Spring Cloud Eureka之高可用注册中心

什么叫高可用 高可用一般指服务的冗余,一个服务挂了,可以自动切换到另一个服务上,不会影响到客户体验. 高可用注册中心 在微服务架构这样的分布式环境中,我们需要充分考虑发生故障的情况,所以在生产环境中必须对各个组件进行高可用部署,对于微服务如此,对于服务中心也一样. Eureka Server的设计一开始就考虑了高可用问题,在Eureka的服务治理设计中,所有节点既是服务提供方,也是服务消费方,服务注册中心也不例外.在前一篇随笔中用到过这样的配置: eureka.client.register-w