Netty私有栈协议

来源:互联网 发布:酷q机器人php源码 编辑:程序博客网 时间:2024/06/05 04:08

1.用于内部各模块之间的通信,基于TCP/IP协议栈,类HTTP应用层协议
2.网络拓扑图:
分布式组网环境下,每个netty节点之间建立长连接,使用Netty协议进行通信,每个节点可以同时做为服务端和客户端
这里写图片描述
3.功能描述:
承载业务内部各模块之间的消息交互和服务调用
<1>提供高性能的异步通信能力
<2>提供消息的编解码框架,可以实现的POJO的序列化和反序列化;
<3>提供基于IP地址的白名单接入认证机制
<4>链路的有效性验证机制
<5>链路的断连重连机制
4.通信模型:
<1>客户端发送握手请求消息,携带节点ID等有效身份认证信息;
<2>服务端对握手请求消息进行合法性校验(节点ID有效性校验,节点重复登录校验,IP地址合法性校验),通过后返回登录成应答消息
<3>链路建立成功后,客户端发送业务消息
<4>链路建立成功后,服务端发送心跳消息
<5>链路建立成功后,客户端发送心跳消息
<6> 链路建立成功后,服务端发送业务消息
<7>服务端退出时,服务端关闭连接,客户感知服务端关闭连接后,被动关闭客户端
注意:
<1>双方链路建立成功后,双方可以进行全双工通信,客户端和服务端都可以主动发送请求消息给对方。
<2>心跳采用ping-pong机制,链路处于空闲状态时,客户端主动发送ping消息给服务端,服务端接收到ping消息后发送应答消息pong给客户端,如果客户端连续发送N条ping消息没有接收到服务端返回的pong消息,说明服务端或链路异常,客户端主动关闭连接,间隔周期T后重新连接,直接到重连成功
这里写图片描述
4.消息定义:包含两部分消息头和消息体
这里写图片描述
<1>消息头:
这里写图片描述
这里写图片描述
5.编码:
1)crcCode:ByteBuffer.putInt(int value);
2)length:ByteBuffer.putInt(int value);
3)sessionId:ByteBuffer.putLong(Long value);
4)type:ByteBuffer.put(byte b);
5)priority:ByteBuffer.put(byte b);
6)attachment:长度为0,表示没有可选附件,将长度编码设为0,大于0有附件需要编码
a.对附件的个数进行编码,ByteBuffer.putInt(attachment.size());
b.对key进行编码,先编码长度,再转换成byte数组之后编码内容(详解示例代码)
7)body编码:序列化为byte数组,调用ByteBuffer.put(byte[] src)写入ByteBuffer缓冲区
8)更新length长度,更新消息头中的length字段
6.解码:
1)crcCode:ByteBuffer.getInt() 校验码
2)length:ByteBuffer.getInt() 消息长度
3)sessionID:ByteBuffer.getLong()会话ID
4)type:ByteBuffer.get()消息类型
5)priority:ByteBuffer.get 消息优先级
6)attachment:创建一个新的attachement对象,调用ByteBuffer.getInt()获取附件长度,为0,则附件为空,解码结束.如果不为0,则根据长度通过for循环进行解码(详见示例代码)
7)body:反序死化解码
7.建立链路:
调用方为客户端,被调用方为服端
链路的建立需要通过基于IP地址或者号段的黑白名单安全认证机制,实际商用项目中需要更加严格的安全认证
客户端与服务端链路建立成功之后,由客户端发送握手请求消息,定义如下:
(1)消息头的type值为3;
(2)attchment个数为0
(3)body为空
(4)握手消息的长度为22个字节
服务端接收到客户端的握手请求消息之后,IP校验通过,返回握手成功应答消息给客户端,应答消息如下:
(1)type值为4
(2)attachment个数为0
(3)body为byte类型的结果:0:成功;-1:失败
8.关闭链路:
双方采用长连接通信,正常业务运行期间,通过心跳和业务消息维持链路,不需要主动关闭连接
需要关闭连接情况:
(1)某一方宕机或重启,通信双方需要关闭连接
(2)消息读写过程发生了I/O异常
(3)心跳消息读写发生I/O异常
(4)心跳超时
(5)发生不可恢复错误
9.心跳机制:
设计思路:
<1>网络处理空闲状态持续时间达到T,客户端发送ping给服务端
<2>在下一个周期T到来时客户端没有收到对方Pong心跳应答消息或者其他业务消息,心跳失败计数加1
<3>客户端接收到Pong或者业务消息,心跳失败计数清0,连续N次没有收到,关闭链路,间隔INTERVAL时间后重连
<4>服务端网络空闲状态达到T后,服务端心跳失败计数加1,接收到客户端消息,计数清0
<5>服务端连续N次没有收到客户端消息,关闭链路,等待客户端重连
10.重连机制:
客户端等待INTERVAL时间后重连,重连失败,间隔INTERVAL再次重连,直接到重连成功。重连失败需要打印异常堆栈,并写入日志,用于定位问题。
11.防止用户重复登录:
服务端接收到客户端的握手请求消息之后,对IP地址进行合法性校验,校验成功,在缓存地址表中查看客户端是否已经登录,如果存在,则返回错误码-1,关闭链路,并打印日志。
客户端接收到握手失败应答消息之后,关闭客户端TCP连接,等待INTERVAL后重连.
服务端连续N次心跳超时主动关闭连接,清空客户端地址缓存信息,保证后续客户端可以重连
12.消息缓存:
无论是客户端还是服务端,当发生链路中断之后,在链路恢复之前,缓存在消息队列中待发送的消息不能丢失,等链路恢复之后,重新发送。

(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(\n).length;varnumbering = $('
    ').addClass('pre-numbering').hide(); (this).addClass(hasnumbering).parent().append(numbering); for (i = 1; i
    原创粉丝点击