dubbo的心跳机制是用来检测provider和consumer之间的connection链接是否还存在,如果不存在做什么处理。心跳机制的原理是:
提供者:如果60s内没有接收到消息,则发送心跳消息,如果连续三次(180s)没有接收到消息,则关闭channel。
消费者:如果在60s内没有接收到消息,则发送心跳消息,如果连着三次没有收到心跳消息,消费者就会重连。
我们在学习服务暴露时,其中会创建netty客户端来进行通信,其中有一个createServer方法,在这个方法中会给url设置心跳时间,默认是60s。设置方法是:

现在我们来看下提供端心跳机制的调用路径:



public void run() {try {long now = System.currentTimeMillis();Iterator i$ = this.channelProvider.getChannels().iterator();while(true) {Channel channel;/* channel是不可以被关闭的 */do {if (!i$.hasNext()) {return;}channel = (Channel)i$.next();} while(channel.isClosed());try {/* 获取最后一次读写的时间 */Long lastRead = (Long)channel.getAttribute(HeaderExchangeHandler.KEY_READ_TIMESTAMP);Long lastWrite = (Long)channel.getAttribute(HeaderExchangeHandler.KEY_WRITE_TIMESTAMP);/* 如果最后一次读写的时间距离现在时间已经超过心跳时间,则发送心跳请求 */if (lastRead != null && now - lastRead > (long)this.heartbeat || lastWrite != null && now - lastWrite > (long)this.heartbeat) {Request req = new Request();req.setVersion("2.0.0");req.setTwoWay(true);req.setEvent(Request.HEARTBEAT_EVENT);channel.send(req);if (logger.isDebugEnabled()) {logger.debug("Send heartbeat to remote channel " + channel.getRemoteAddress() + ", cause: The channel has no data-transmission exceeds a heartbeat period: " + this.heartbeat + "ms");}}/* 正常消息和心跳消息都未接收到 */if (lastRead != null && now - lastRead > (long)this.heartbeatTimeout) {logger.warn("Close channel " + channel + ", because heartbeat read idle time out: " + this.heartbeatTimeout + "ms");/* 如果是consumer端则重连,provider端则关闭链接 */if (channel instanceof Client) {try {((Client)channel).reconnect();} catch (Exception var8) {}} else {channel.close();}}} catch (Throwable var9) {logger.warn("Exception when heartbeat to remote channel " + channel.getRemoteAddress(), var9);}}} catch (Throwable var10) {logger.warn("Unhandled exception when heartbeat, cause: " + var10.getMessage(), var10);}}

通过请求和响应的调用顺序图,我们可以看到consumer端是建立了长连接,最后的实现是在HeaderExchangeClient类,现在就让我们来看一下:

我们可以看到创建这个类时的步骤和提供者是相似的,下面我们来看下startHeatTimer方法,代码如下:

可以看到会先暂停现有的心跳检测器,然后创建一个新的,但是和提供者创建心跳检测器不同的是consumer只会获取当前实例。
通过对提供者和服务者的心跳机制的学习,我们对dubbo的心跳机制就会有一个更深的理解。心跳机制主要是通过心跳线程来进行检测,并且当最后一次的读写时间超过心跳时间后,就会进行重连。如果最后一次写的时间超过心跳超时时间就会提供者就会执行关闭操作,而消费者就会进行重连操作。
文章转载自Lord Lean Notes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




