Netty实现心跳检测

一、前言

上一篇 心跳检测机制  讲了心跳检测基本概念以及用原始的Socket来实现心跳检测机制,其实Netty已经为我们提供了重要的心跳机制,Netty是非常非常优秀的网络框架,很多RPC框架比如Dubbo、客户端消息推送MPush、股票行情推送都用到Netty。

二、 IdleStateHandler

Netty的IdleStateHandler是实现心跳检测最重要的类,当连接的空闲时间(读/写)太长时,会触发IdleStateHandler事件,然后你可以通过重写ChannelInboundHandler的userEventTriggered方法来处理该事件.

public IdleStateHandler(long readerIdleTime, 
long writerIdleTime, 
long allIdleTime, TimeUnit unit)
  • readerIdleTime:读空闲时间.
  • writerIdleTime:写空闲时间.
  • allIdleTime:读写总的空闲时间.

IdleStateHandler是一个ChannelHandler,需要被加入到ChannelPipeline才能起作用。

三、使用IdleStateHandler心跳检测例子

客户端持续向服务端发送数据包(间隔时间在0~4秒),如果服务端读空闲时间超过2秒并且超过三次则认为客户端已经挂掉。下面代码大多数是Netty网络通讯基础模板代码,关于心跳的代码就红框标出的那么几行。

1、NettyHeartBeatServer.java

Netty实现心跳检测_第1张图片

Netty实现心跳检测_第2张图片 Netty实现心跳检测_第3张图片

2、NettyHeartBeatClient.java

Netty实现心跳检测_第4张图片

Netty实现心跳检测_第5张图片 3、服务端日志输出

Netty实现心跳检测_第6张图片

 注:可以明显发现当三次超时后连接关闭,在三次超时后就可以做重连或者将服务提供者从注册中心移除等操作。

四、IdleStateHandler源码剖析

注:我们只看一下读空闲超时IdleStateHandler的处理逻辑,写超时逻辑类似。

1、initialize方法

Netty实现心跳检测_第7张图片

启动ReaderIdleTimeoutTask定时器。

2、ReaderIdleTimeoutTask定时器

Netty实现心跳检测_第8张图片

当前时间减去最后一次读数据时间大于指定的读超时时间,调用channelIdle方法。

3、ChannelIdle方法

6ec78c1aa3f14bf6ba471a52f62543cb.png

然后经过N层调用,最终会调HeadBeatHandler的userEventTriggered方法。

你可能感兴趣的:(网络通讯,Java,rpc,zookeeper,java)