彻底搞懂Eureka——心跳发送源码探究

26 篇文章 1 订阅
16 篇文章 0 订阅

在DiscoveryClient里有这样一个方法:
在这里插入图片描述
在服务的启动时,会有一个服务的心跳包在这里发送出去,我们打个断点,看一下这部分心跳的逻辑,前面的代码我们先略过,直接跳到发送心跳的地方:
在这里插入图片描述
根据这个方法名,我们不难猜测,它应该是在后台通过定时触发的一个任务,我们进入这个方法:
在这里插入图片描述

在这里可以看到这个定时的任务不仅包含心跳,还有缓存的刷新,我们这部分先不看,继续往下走:
在这里插入图片描述
这里就和心跳有关系了,可以看出,在clientConfig.shouldRegisterWithEureka()为true的时候才会进来,
我们在服务注册中心的配置里对这一项指定了false:
在这里插入图片描述
而在eureka-client这里我们并没有指定这个值,所以它默认是true,我们继续往下走:
在这里插入图片描述
可以看到这里有一个renewalIntervalInSecs,值为30,也就是说30秒发一个请求。
继续往下看:
在这里插入图片描述
可以看到这里有个scheduler,也就是定时启动后台任务的,里面用到了 renewalIntervalInSecs,说明就是30秒启动一次。我们刚刚看到,其实还有一个叫expBackOffBound的属性,它是什么含义呢?
我们先进入到TimedSupervisorTask看一下:
在这里插入图片描述
这里有一个maxDelay,它是用刚刚的超时时间乘以expBackOffBound,因此这里的expBackOffBound就是用于计算最大延迟时间的。

但是这些属性都是和具体发送心跳包没关系的,我们再回到上面:
在这里插入图片描述
真正发送心跳包,是在这个HeartbeatThread()里面,我们点进去看看:
在这里插入图片描述
可以看到,它是实现了一个Runnable接口,然后再run方法里面实现心跳包,我们进入到这个renew()方法里看看:
在这里插入图片描述

通过这个方法名,我们看着好像是续约的意思,其实心跳和服务续约是一套相互作用的机制,这里的renew在客户端来说,它是发送了一个心跳,但是在服务端来说,它接受了这个心跳,就是完成了一次服务的续约。

这里我们看的是客户端的心跳逻辑,后续我们再探讨服务的续约逻辑。
在这里插入图片描述
这里和服务注册一样也是一层一层的嵌套,我们来看这里,它是嵌套了一个SessionedEurekaHttpClient,这里我们就不一层一层的过了,感兴趣的小伙伴自己debug看看这个流程,我们就直接走到最终的地方看看它的心跳包都发送了哪些内容:
在这里插入图片描述
这里我们直接进入到AbstractJerseyEurekaHttpClient#sendHeartBeat这个方法,
这里它是最后一层了,它的上层其实是JerseyApplicationClient:
在这里插入图片描述
其实服务注册也是一样的,都是一套机制,只有你搞懂了一个,看其他的流程其实举一反三很容易就通了。

我们看到这里第一行是定义了一个url:
在这里插入图片描述
这个url指定的是当前客户端的地址。
紧接着,下面构造了一个WebResource:
在这里插入图片描述
这里指定了当前注册中心的url,以及客户端的路径,还有一些当前实例状态等信息。
再往下看:
在这里插入图片描述
这里就把这些参数发送出去了:
在这里插入图片描述
可以看到返回的是200,说明已经发送成功了。
我们回到renew方法里:
在这里插入图片描述
这里返回的也是200,最后进行了返回:
在这里插入图片描述

走到这里,其实整个心跳发送的流程就已经完成了,看到这里感觉这个流程还是比较简单的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值