文章

Netty 如何实现重连?

Netty 如何实现重连?

Netty 如何实现重连?

  • 客户端,通过 IdleStateHandler 实现定时检测是否空闲,例如说 15 秒。
    • 如果空闲,则向服务端发起心跳。
    • 如果多次心跳失败,则关闭和服务端的连接,然后重新发起连接。
  • 服务端,通过 IdleStateHandler 实现定时检测客户端是否空闲,例如说 90 秒。
    • 如果检测到空闲,则关闭客户端。
    • 注意,如果接收到客户端的心跳请求,要反馈一个心跳响应给客户端。通过这样的方式,使客户端知道自己心跳成功。

如下艿艿在自己的 TaroRPC 中提供的一个示例:

  • NettyClient.java 中,设置 IdleStateHandler 和 ClientHeartbeatHandler。核心代码如下:
1
2
3
// NettyHandler.java
.addLast("idleState", new IdleStateHandler(TaroConstants.TRANSPORT_CLIENT_IDLE, TaroConstants.TRANSPORT_CLIENT_IDLE, 0, TimeUnit.MILLISECONDS))
.addLast("heartbeat", new ClientHeartbeatHandler())

NettyServer.java中,设置 IdleStateHandler 和 ServerHeartbeatHandler。核心代码如下:

1
2
3
// NettyServer.java
.addLast("idleState", new IdleStateHandler(0, 0, TaroConstants.TRANSPORT_SERVER_IDLE, TimeUnit.MILLISECONDS))
.addLast("heartbeat", new ServerHeartbeatHandler())
  • ClientHeartbeatHandler.java 中,碰到空闲,则发起心跳。不过,如何重连,暂时没有实现。需要考虑,重新发起连接可能会失败的情况。具体的,可以看看 《一起学Netty(十四)之 Netty生产级的心跳和重连机制》 文章中的,ConnectionWatchdog 的代码。
  • ServerHeartbeatHandler.java 中,检测到客户端空闲,则直接关闭连接。
本文由作者按照 CC BY 4.0 进行授权