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中的方法
// 具体为调用