四、Eureka源码解析:服务续约(心跳)

1、Eureka client每隔三十秒发送一次心跳到Eureka server,这就是续约;

2、Eureka client续约的目的是告诉Eureka server自己还活着;

3、Eureka server若90秒内未收到心跳,就从自己的服务列表中剔除该Eureka client;

4、建议不要改变心跳间隔,因为Eureka server是通过心跳来判断Eureka client是否正常;

 

首先回顾一下EurekaClient端启动时候初始化的这个定时任务:

// 10秒

int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();

// 心跳(续约)频率,默认30秒

int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();

logger.info("Starting heartbeat executor: " + "renew interval is: {}", renewalIntervalInSecs);

 

// Heartbeat timer

// 实际是一个心跳(续约)定时任务,后面会有详细解析

scheduler.schedule(

    new TimedSupervisorTask(

            "heartbeat",

            scheduler,

            heartbeatExecutor,

            renewalIntervalInSecs,

            TimeUnit.SECONDS,

            expBackOffBound,

            // new一个续约线程,最终调用到renew()方法

            new HeartbeatThread()

        ),

        renewalIntervalInSecs, TimeUnit.SECONDS);

发现new了一个名叫HeartbeatThread的线程,赶紧看一下run()方法

public void run() {

    if (renew()) {

        // 最后成功心跳(续约)时间

        lastSuccessfulHeartbeatTimestamp = System.currentTimeMillis();

    }

}

run发现在run()里调用了一个名字为renew()的方法,到了这里更加确信了服务续约和心跳检测是一个东西。。。这个renew()方法便是发起续约(心跳)请求的方法。看一下具体代码:

// 心跳(续约)

boolean renew() {

    EurekaHttpResponse<InstanceInfo> httpResponse;

    try {

        // 使用Jersey构建Rest调用EurekaServer端

        // AbstractJerseyEurekaHttpClient-sendHeartBeat(appName, id, info, overriddenStatus)方法

        // 通过sendHeartBeat方法调用eureka-core中的方法

        // 具体为调用

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值