public boolean onDemandUpdate() {
if (rateLimiter.acquire(burstSize, allowedRatePerMinute)) {
if (!scheduler.isShutdown()) {
// 提交
scheduler.submit(new Runnable() {
@Override
public void run() {
logger.debug("Executing on-demand update of local InstanceInfo");
Future latestPeriodic = scheduledPeriodicRef.get();
if (latestPeriodic != null && !latestPeriodic.isDone()) {
logger.debug("Canceling the latest scheduled update, it will be rescheduled at the end of on demand update");
// 取消定时任务
latestPeriodic.cancel(false);
}
// todo 执行 向 Server端重新 注册的请求
InstanceInfoReplicator.this.run();
}
});
return true;
} else {
logger.warn("Ignoring onDemand update due to stopped scheduler");
return false;
}
} else {
logger.warn("Ignoring onDemand update due to rate limiter");
return false;
}
}
InstanceInfoReplicator#onDemandUpdate 方法中调用 InstanceInfoReplicator#run 方法检查服务实例信息和服务状态的变化,并在服务实例信息和服务状态发生变化的情况下向 Eureka Server 发起重新注册的请求,为了防止重新执行 run 方法,onDemandUpdate 方法还会取消执行上次已经提交且未完成的 run方法,执行最新的按需注册任务。
4.4 总结
服务注册的时机
Client提交register()请求的情况有三种:
- 在应用启动时就可以直接进行register(),不过,需要提前在配置文件中配置
- 在renew时,如果server端返回的是NOT_FOUND,则提交register()
- 当Client的配置信息发生了变更,则Client提交register()
Client实例化
Eureka Client 实例化的时候有几个重要步骤,分别如下:
- 全量拉取注册表信息,放入自己本地注册表中。
- 创建定时任务, 定时服务续约任务,默认是30s, 定时更新 客户端注册表信息,默认是30s, 定时更新Client信息给Server端,重新服务注册,默认是40s。
参考文章
eureka-0.10.11源码(注释)
springcloud-source-study学习github地址
Eureka源码解析
SpringCloud技术栈系列文章