《重新定义Spring Cloud实战》——3.6.3 Eureka高可用原理

举报
华章计算机 发表于 2019/06/04 15:28:31 2019/06/04
【摘要】 本书摘自《重新定义Spring Cloud实战》——书中第3章,第3.6.3节,作者是许进、叶志远、钟尊发、蔡波斯、方志朋、郭芳碧、朱德明。

3.6.3 Eureka高可用原理

由于Eureka是基于部署在Amazon的背景下设计的,因此其原生支持了Amazon的Region及AvailabilityZone。

这里分为如下几点来阐述一下:

1)Region,默认情况下资源在Region之间是不会复制的。不过Eureka Client提供了fetch-remote-regions-registry配置,这个配置在dataCenterInfo是Amazon时才生效,其作用是拉取远程Region的注册信息到本地。

2)AvailabilityZone,默认Eureka Client的eureka.client.prefer-same-zone-eureka配置为true,也就是在拉取serviceUrl的时候,优先选取与应用实例处于同一个zone的Eureka Server列表。

eureka:

    client:

        register-with-eureka: true

        fetch-registry: true

        region: region-east

        service-url:

            zone1: http://localhost:8761/eureka/

            zone2: http:// localhost:8762/eureka/

        availability-zones:

            region-east: zone1,zone2

    instance:

        metadataMap.zone: zone1

比如上述配置,client端配置了一个region,该region下面有两个zone,分别是zone1和zone2,而该应用实例的metadataMap信息中zone为zone1,即该应用实例会选取service-url.zone这个server列表来进行注册及查询等操作。

如果eureka.client.prefer-same-zone-eureka配置为false,则默认返回的ZoneOffset为0,即取availZones的第一个zone。

1. Client端高可用

从上面的故障演练,我们可以看到Client端的高可用可以分为如下几点。

1)在Client启动之前,如果没有Eureka Server,则可以通过配置eureka.client.backup-registry-impl从备份registry读取关键服务的信息。

2)在client启动之后,若运行时出现Eureka Server全部挂掉的情况:本地内存有localRegion之前获取的数据,在Eureka Server都不可用的情况下,从Server端定时拉取注册信息回来更新的线程CacheRefreshThread会执行失败,本地localRegion信息不会被更新。

3)在client启动之后,若运行时出现Eureka Server出现部分挂掉的情况:这种情况,如果预计恢复时间比较长,可以人工介入,可以通过配置文件剔除挂掉的Eureka Server地址,Client端会定时刷新serviceUrl,不过一般Client太多,这类操作不太方便,所以一般也不需要这样做,因为Client端维护了一个Eureka Server的不可用列表,一旦请求发生Connection error或者5xx的情况则会被列入该列表,当该列表的大小超过指定阈值则会重新清空。在重新清空的情况下,Client默认是采用RetryableEurekaHttpClient进行请求,numberOfRetries为3,因此也能够在一定程度保障Client的高可用。

2. Server端高可用

由于Eureka Server采用的是peer to peer的架构模式,因而也就无所谓Server端的高可用,主要的高可用都在Client端进行处理了。不过Server端也支持了跨region基本的高可用,可以通过配置remoteRegionUrlsWithName来支持拉取远程region的实例信息,如果当期region要访问的服务实例都挂了,那么Server端就会fallback到远程region的该服务实例。具体在这段代码中:eureka-core-1.9.2-sources.jar!/com/netflix/eureka/registry/AbstractInstanceRegistry.java,disableTransparentFallback默认为false,有兴趣的读者可以深入了解下。

public Applications getApplications() {

    boolean disableTransparentFallback = serverConfig.disableTransparentFallbackToOtherRegion();

    if (disableTransparentFallback) {

        return getApplicationsFromLocalRegionOnly();

    } else {

        return getApplicationsFromAllRemoteRegions();  // Behavior of falling back to remote region can be disabled.

    }

}

另外一点就是Eureka Server有SELF PRESERVATION机制,在现实环境中,网络抖动、闪断等因素可能会造成Client端未能及时向Server端续约,按照租约的相关约定,Server端就需要剔除该实例信息,如果大面积出现这类情况,那么可能是误判,因此SELF PRESERVATION机制引入一个阈值,如果最近一分钟接收到的续约的次数小于指定阈值的话,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。