我是靠谱客的博主 天真故事,最近开发中收集的这篇文章主要介绍springcloud源码之eureka-client服务注册/心跳机制springcloud源码之eureka-client服务注册/心跳机制,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
文章目录
- springcloud源码之eureka-client服务注册/心跳机制
- 前言
- 入口
- 服务注册+心跳机制
- 总结
springcloud源码之eureka-client服务注册/心跳机制
前言
之前写过四篇关于eureka源码的博客,不过都是基于eureka-server来写的,本篇基于eureka-client来聊一聊客户端
是如何服务注册和发送心跳的
入口
从这个文件点开EurekaClientAutoConfiguration
EurekaClientAutoConfiguration#eurekaClient(ApplicationInfoManager manager,
EurekaClientConfig config) {
return new CloudEurekaClient(manager, config, this.optionalArgs,
this.context);
}
————————————————————————————————————————————————————>
CloudEurekaClient#CloudEurekaClient(省略) {
super(applicationInfoManager, config, args);
//省略
}
————————————————————————————————————————————————————>
DiscoveryClient# DiscoveryClient(省略) {
this(applicationInfoManager, config, args, new Provider<BackupRegistry>() {
private volatile BackupRegistry backupRegistryInstance;
//这个get是拿备用服务,eureka-client不仅仅可以配置集群服务,还可以配置一些备用的服务,
//如果集群服务拿不到会去备用服务拿
@Override
public synchronized BackupRegistry get() {
//省略
}
}, randomizer);
}
————————————————————————————————————————————————————>
DiscoveryClient最终的构造器,在DiscoveryClient代码320行
DiscoveryClient# DiscoveryClient(){
//如果客户端配置了 既不要注册到服务中心,也不要从服务中心拿数据,那么本eureka-client其实就失去了意义,直接return
if (!config.shouldRegisterWithEureka() && !config.shouldFetchRegistry()) {
//省略 把很多值置为null
//直接return
return;
}
//下面是几行伪代码
//核心池大小为2的线程池
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(2);
//心跳机制执行,其实就是定时发送心跳请求给eureka-server告诉它我还活着,不要把我剔除
ThreadPoolExecutor heartbeatExecutor = new ThreadPoolExecutor();
//服务发现机制执行,其实就是定时去eureka-server拿微服务实例数据
ThreadPoolExecutor cacheRefreshExecutor = new ThreadPoolExecutor();
//如果客户端配置应该从注册中心拿数据,并且这次fetchRegistry(即服务发现)失败了,则会从备用服务拿
if (clientConfig.shouldFetchRegistry() && !fetchRegistry(false)) {
fetchRegistryFromBackup();
}
//如果配置了应该注册到注册中心(默认true)&&初始化的时候强制注册(默认false),所以不做配置的情况下,不会进if
//但没关系,心跳的时候会注册的,这个看到后面就懂了
if (clientConfig.shouldRegisterWithEureka() && clientConfig.shouldEnforceRegistrationAtInit()) {
if (!register()) {
throw new IllegalStateException("");
}
}
initScheduledTasks();
}
上面这些代码就是eureka-client初始化的代码,到此为止在默认配置的情况下只进行了一次服务发现,还没有进行服务注册
服务注册+心跳机制
private void initScheduledTasks() {
//省略cacheRefreshTask ,因为这个是服务发现的任务,下篇博客说
//应该注册到注册中心
if (clientConfig.shouldRegisterWithEureka()) {
//心跳的间隔(单位s)
int renewalIntervalInSecs = instanceInfo.getLeaseInfo().getRenewalIntervalInSecs();
int expBackOffBound = clientConfig.getHeartbeatExecutorExponentialBackOffBound();
//心跳任务
heartbeatTask = new TimedSupervisorTask(
"heartbeat",
scheduler,
heartbeatExecutor,
renewalIntervalInSecs,
TimeUnit.SECONDS,
expBackOffBound,
new HeartbeatThread()
);
//默认30s执行一次心跳
scheduler.schedule(heartbeatTask,renewalIntervalInSecs, TimeUnit.SECONDS);
HeartbeatThread
private class HeartbeatThread implements Runnable {
public void run() {
if (renew()) {
lastSuccessfulHeartbeatTimestamp = System.currentTimeMillis();
}
}
}
boolean renew() {
//这里就是访问eureka-server的renew续期接口了,在之前的博文说过,不再赘述
EurekaHttpResponse<InstanceInfo> httpResponse =
eurekaTransport.registrationClient.sendHeartBeat
(instanceInfo.getAppName(), instanceInfo.getId(), instanceInfo, null);
//如果续期失败(失败原因:没有找到要续期的微服务,该微服务已过期)
if (httpResponse.getStatusCode() == Status.NOT_FOUND.getStatusCode()) {
//续期失败就转为注册
boolean success = register();
return success;
}
return httpResponse.getStatusCode() == Status.OK.getStatusCode();
}
总结
1:@EnableEurekaClient此注解可加可不加,有点鸡肋这个
2:eureka-client初始化过程中会先服务发现,如果失败会去备用服务拿
3:可以配置EnforceRegistrationAtInit属性强制初始化的时候就进行服务注册
4:初始化过程开启定时器30s执行一次心跳续约,如果心跳续约失败会进行服务注册
最后
以上就是天真故事为你收集整理的springcloud源码之eureka-client服务注册/心跳机制springcloud源码之eureka-client服务注册/心跳机制的全部内容,希望文章能够帮你解决springcloud源码之eureka-client服务注册/心跳机制springcloud源码之eureka-client服务注册/心跳机制所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复