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 () {(function () {('pre.prettyprint code').each(function () { var lines = (this).text().split(′\n′).length;var(this).text().split('\n').length;var numbering = $('').addClass('pre-numbering').hide(); (this).addClass(′has−numbering′).parent().append((this).addClass('has-numbering').parent().append(numbering); for (i = 1; i

Netty私有栈协议相关推荐

  1. Netty 私有协议栈 代码实现

    私有协议介绍 通信协议从广义上区分,可以分为共有协议和私有协议.由于私有协议的灵活性,它往往会在某个公司或者组织内部使用,按需定制,也因为如此,升级起来会非常方便,灵活性好. Netty私有协议栈功能 ...

  2. 蚂蚁通讯框架SOFABolt之私有通讯协议设计

    前言 SOFABolt 是蚂蚁金融服务集团开发的一套基于 Netty 实现的网络通信框架. 为了让 Java 程序员能将更多的精力放在基于网络通信的业务逻辑实现上,而不是过多的纠结于网络底层 NIO ...

  3. netty 对 protobuf 协议的解码与包装探究(2)

    netty 默认支持protobuf 的封装与解码,如果通信双方都使用netty则没有什么障碍,但如果客户端是其它语言(C#)则需要自己仿写与netty一致的方式(解码+封装),提前是必须很了解net ...

  4. Netty实现自定义协议

    关于协议,使用最为广泛的是HTTP协议,但是在一些服务交互领域,其使用则相对较少,主要原因有三方面: HTTP协议会携带诸如header和cookie等信息,其本身对字节的利用率也较低,这使得HTTP ...

  5. 基于netty的websocket协议实现

    基于netty的websocket协议实现 背景 1.启动服务端 2.测试服务端和客户端效果 背景 项目中使用到了websocket,所以查阅相关资料,完成了一个基于netty的websocket的实 ...

  6. netty 游戏服务器框图_基于Netty和WebSocket协议实现Web端自动打印订单服务方法与流程...

    本发明涉及电子商务技术领域,尤其涉及一种基于netty和websocket协议实现web端自动打印订单服务方法. 背景技术: 电子商务是以信息网络技术为手段,以商品交换为中心的商务活动:也可理解为在互 ...

  7. netty 基于 protobuf 协议 实现 websocket 版本的简易客服系统

    https://segmentfault.com/a/1190000017464313 netty 基于 protobuf 协议 实现 websocket 版本的简易客服系统 结构 netty 作为服 ...

  8. netty对http协议解析原理解析

    转载自 https://blog.csdn.net/xiangzhihong8/article/details/52029446 本文主要介绍netty对http协议解析原理,着重讲解keep-ali ...

  9. 07 接头暗语:如何利用 Netty 实现自定义协议通信?

    文章目录 07 接头暗语:如何利用 Netty 实现自定义协议通信? 通信协议设计 1. 魔数 2. 协议版本号 3. 序列化算法 4. 报文类型 5. 长度域字段 6. 请求数据 7. 状态 8. ...

最新文章

  1. 【c语言】蓝桥杯基础练习 回文数
  2. storm0.9.0.1安装
  3. 磁共振线圈分类_磁共振硬件(二)主磁体分类
  4. (62)时钟中断切换线程,时间片管理, KiDispatchInterrupt
  5. php 开启fsockopen函数,巧用php的fsockopen函数
  6. POJ 3683 Priest John's Busiest Day(2-ST)
  7. matlab中float类型的_Java局部变量类型推断(Var类型)的26条细则
  8. 日本媒体称东芝敲定收购富士通硬盘业务
  9. 华为nova 5i Pro发布:麒麟810+4800万像素AI四摄
  10. modbus调试工具的使用
  11. arcgis数据导入mysql_ArcGIS Geodatabase教程:将数据导入到地理数据库
  12. x32下PsSetLoadImageNotifyRoutine的逆向
  13. Linux学习笔记精华总结(选自鸟哥的Linux私房菜)
  14. 海洋cms(海洋视频内容管理系统) v12.5 bulid220618
  15. 网易云课堂 计算机入门 期末 编程题
  16. 微信也能设置主题了,盘他!
  17. 聆听第18期贡献者荣誉榜发布,体验落地才是王道
  18. YII2使用时出现The file or directory to be published does not exist
  19. #osp: INITIALIZATION ERROR --> #osp:api: could not find module initializer
  20. C++ map和set

热门文章

  1. Python编写简易木马程序
  2. 3_7 MementoMode 备忘录模式
  3. 数据结构与算法 | 插值查找
  4. QUIC实战(三) letsencrypt证书申请和自动续期
  5. MySQL(四)索引的使用
  6. 深度思考|TCP协议存在那些缺陷?
  7. 曹大,欧神开新公众号了
  8. 位图布隆过滤器海量数据处理
  9. IETF访谈: HTTP/3全球份额持续增长,QUIC前景一片光明
  10. Google Duo采用WaveNetEQ填补语音间隙