面试整理-springCloud-eureka

目录

一、Eureka心跳续约机制

二、Eureka的自我保护机制

三、erueka、zookeeper、consul的区别


eureka满足CAP原理的AP,可用性和分区容错性

eureka服务端:提供服务注册中心,需要定时检测服务提供者的状况状态

@EnableEurekaServe声明一个注册中心,eurekaServer集群中各服务端相互注册。通过注入HttpClient的对象加@LoadBalance注解的Bean配置,实现负载均衡(轮询)

eureka客户端:通过注册中心进行访问,在运行过程中需要定期更新注册信息

@EnabeEurekaClient声明一个客户端,连接euraka服务端注册中心并维持心跳链接


一、Eureka心跳续约机制

 eureka心跳续约机制

客户端启动时,会开启一个心跳任务,每隔30s(默认)向服务端发送一次心跳任务

eureka:
  client:
    service-url:
      defaultZone: http://cluster1:70700/eureka,http://cluster2:8080/eureka,http://cluster3:9090/eureka
  instance:
    # 客户端向注册中心发送心跳的时间间隔,(默认30秒)
    lease-renewal-interval-in-seconds: 1
    #Eureka注册中心(服务端)在收到客户端心跳之后,等待下一次心跳的超时时间,如果在这个时间内没有收到下次心跳,则移除该客户端。(默认90秒)
    lease-expiration-duration-in-seconds: 2

服务端启动时,会启动一个定时任务,该任务每隔60s(默认)执行一次,在检查到每个实例最后一心跳的时间是否超过90s(默认,且在客户端配置),超过则认为过期,需要剔除

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  server:
    #服务端是否开启自我保护机制 (默认true)
    enable-self-preservation: false
    #扫描失效服务的间隔时间(单位毫秒,默认是60*1000)即60秒
    eviction-interval-timer-in-ms: 2000

客户端启动时,会开启一个心跳任务,每隔30s(默认)向服务端发送一次心跳任务

客户端心跳发起流程

1.DiscoveryClient.initScheduledTasks方法中,renewalIntervalInSecs=30s, 默认每隔30s执行一次

2.HeartbeatThread线程调用renew方法续约,若续约成功,则更新最后一次心跳续约时间=当前系统时间

服务端接收心跳处理流程

在InstanceResource类的renewLease方法中调用registry.renew进行续约,主要分为分三步:

1.先从服务注册表中找到匹配当前请求的实例

2.再发布EurekaInstanceRenewedEvent事件

3.最后调用父类的续约方法(super.renew)进行续约,若续约成功,同步到集群的其他节点

在父类的renew方法中再调用leaseToRenew.renew方法进行心跳续约,即更新服务端收到最后一次收到心跳请求的时间

public void renew() {
    lastUpdateTimestamp = System.currentTimeMillis() + duration;//当前系统时间+过期间隔(默认90s)
}

但是在判断是否过期时还加了一次duration,why???

public boolean isExpired(long additionalLeaseMs) {
    return (evictionTimestamp > 0 || System.currentTimeMillis() > (lastUpdateTimestamp + duration + additionalLeaseMs));
}

二、Eureka的自我保护机制

心跳机制会有不确定性,如因为网络延迟或通信等问题导致90s内没有收到客户端服务的心跳请求,导致原本健康的服务被剔除,为空避免整个问题,eureka提供了自我保护机制

自我保护机制是否开启,可以通过配置实现

eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  server:
    #服务端是否开启自我保护机制 (默认true),一般开发环境是关闭的,线上环境是开启的
    enable-self-preservation: false

进入自我保护机制状态后,会出现几种情况:

1.eureka Server不再剔除因长期没收到心跳请求的服务,如在保护期间该服务提供者非正常下线,服务消费者就会请求到一个无效的服务,会调用失败,需要做相应的容错、重试等措施

2.eureka Server依然可以接收新服务的注册和查询请求,但不会同步到集群的其它节点,保证当前节点依然可用

如何保证是自我保护机制因网络原因导致,而非服务宕机?

如果低于85%的客户端没有正常的心跳请求,erueka Server则认为注册中心出现网络故障,并进入自我保护状态,85%即自我保护续约比例(默认0.85,且可配置)

# 自我保护续约百分比,默认是0.85
eureka.server.renewal-percent-threshold=0.85

自我保护阈值 = 服务总数 * 每分钟的续约次数(60s/默认30s) * 自我保护续约比例

自我保护阈值即预期的续约数量,如:有100个服务,默认客户端每各30s给注册中心发送一次心跳,自我保护续约比例为85%,那么预期续约服务数量为:

自我保护阈值 = 100 * (60/30) * 0.85 = 170

scheduleRenewalThresholdUpdateTask.updateRenewsPerMinThreshold 每隔15分钟刷新一次自我保护阈值

自我保护机制的触发

AbstractInstanceRegistry的postInit方法中开启EvictionTask任务(默认是60s执行一次),task的run方法中调用evict方法,在evict中调用判断是否开启自我保护机制的方法


public boolean isLeaseExpirationEnabled() {
    if (!isSelfPreservationModeEnabled()) {
        // The self preservation mode is disabled, hence allowing the instances to expire.
        return true;
    }
    //每分钟期望收到的心跳数阈值(自我保护阈值) > 0 && 上一分钟实际收到的心跳数 > 自我保护阈值  
    return numberOfRenewsPerMinThreshold > 0 && getNumOfRenewsInLastMin() > numberOfRenewsPerMinThreshold;
}

在1min内有超过15%的服务实例下线时,eureka Server会认为是自己的网络有问题导致无法接收心跳,从而进入自我保护机制,防止将大量服务实例下线。

三、erueka、zookeeper、consul的区别

主要大的区别就两个方面,上图圈出来的地方

1. zookeeper和consul遵循CP原则,强调数据的强一致性,在集群leader宕机后,会进行leader选举,选举期间整个集群不可用。

2. eureka遵循AP原则,强调系统的可用性。自我保护机制保证了只要有一个节点服务可用,即可保证系统可用,待网络恢复后,会把当前节点最新数据同步到其他节点,保证数据的最终一致性

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值