这是我参与11月更文挑战的第29天,活动详情查看:2021最后一次更文挑战
前言
所谓心跳, 即在 TCP 长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性.
这三个参数的含义:
- readerIdleTimeSeconds
读超时. 即当在指定的时间间隔内没有从 Channel 读取到数据时, 会触发一个 READER_IDLE 的IdleStateEvent 事件. - writerIdleTimeSeconds
写超时. 即当在指定的时间间隔内没有数据写入到 Channel 时, 会触发一个 WRITER_IDLE 的IdleStateEvent 事件. - allIdleTimeSeconds
读/写超时. 即当在指定的时间间隔内没有读或写操作时, 会触发一个 ALL_IDLE 的 IdleStateEvent 事件.
注:这三个参数默认的时间单位是秒。若需要指定其他时间单位,可以使用另一个构造方法:
IdleStateHandler(boolean observeOutput, long readerIdleTime, long writerIdleTime, long allIdleTime, TimeUnit unit)
源码分析
要实现Netty服务端心跳检测机制需要在服务器端的ChannelInitializer中加入如下的代码:
1 | java复制代码pipeline.addLast(new IdleStateHandler(3, 0, 0, TimeUnit.SECONDS)); |
1. IdleStateHandler#channelRead
IdleStateHandler#channelRead方法,msg消息透传,不做任何业务了逻辑处理,让channelPipe中的下一个handler处理channelRead方法。
2.IdleStateHandler#channelActive
channelActive方法, 1. 初始化 2. channelActive 事件
initialize方法
1 | java复制代码private void initialize(ChannelHandlerContext ctx) { |
Netty心跳检测案例
HeartBeatServer
1 | java复制代码public class HeartBeatServer { |
HeartBeatClient
1 | java复制代码public class HeartBeatClient { |
HeartBeatServerHandler
1 | java复制代码public class HeartBeatServerHandler extends SimpleChannelInboundHandler<String> { |
演示结果:
常见的心跳检测
比如说Nacos注册中心, Eureka注册中心等等,都有自己的心跳检测机制。
本文转载自: 掘金