netty实战-手写通信框架

通信框架功能设计

功能描述

通信框架承载了业务内部各模块之间的消息交互和服务调用,它的主要功能如下:
基于 Netty 的 NIO 通信框架,提供高性能的异步通信能力;
提供消息的编解码框架,可以实现 POJO 的序列化和反序列化;
消息内容的防篡改机制
提供基于 IP 地址的白名单接入认证机制;
链路的有效性校验机制;
链路的断连重连机制

通信模型

在这里插入图片描述
(1)客户端发送应用握手请求消息,携带节点 ID 等有效身份认证信息;
(2)服务端对应用握手请求消息进行合法性校验,包括节点 ID 有效性校验、节点重复登录校验和 IP 地址合法性校验,校验通过后,返回登录成功的应用握手应答消息;
(3)链路建立成功之后,客户端发送业务消息;
(4)链路成功之后,服务端发送心跳消息;
(5)链路建立成功之后,客户端发送心跳消息;
(6)链路建立成功之后,服务端发送业务消息;
(7)服务端退出时,服务端关闭连接,客户端感知对方关闭连接后,被动关闭客户端连接。

备注:需要指出的是,协议通信双方链路建立成功之后,双方可以进行全双工通信,无论客户端还是服务端,都可以主动发送请求消息给对方,通信方式可以是 TWO WAY 或者ONE WAY。双方之间的心跳采用 Ping-Pong 机制,当链路处于空闲状态时,客户端主动发送Ping 消息给服务端,服务端接收到 Ping 消息后发送应答消息 Pong 给客户端,如果客户端连续发送 N 条 Ping 消息都没有接收到服务端返回的 Pong 消息,说明链路已经挂死或者对方处于异常状态,客户端主动关闭连接,间隔周期 T 后发起重连操作,直到重连成功。

消息定义

消息定义包含两部分:消息头;消息体。

  • 在消息的定义上,因为是同步处理模式,不考虑应答消息需要填入请求消息 ID,所以消息头中只有一个消息的 ID。如果要支持异步模式,则请求消息头和应答消息头最好分开设计,应答消息头中除了包括本消息的 ID 外,还应该包括请求消息 ID,以方便请求消息的发送方根据请求消息 ID 做对应的业务处理。
  • 消息体则支持 Java 对象类型的消息内容。

链路的建立

客户端的说明如下:如果 A 节点需要调用 B 节点的服务,但是 A 和 B 之间还没有建立物理链路,则有调用方主动发起连接,此时,调用方为客户端,被调用方为服务端。考虑到安全,链路建立需要通过基于 Ip 地址或者号段的黑白名单安全认证机制,作为
样例,本协议使用基于 IP 地址的安全认证,如果有多个 Ip,通过逗号进行分割。在实际的商用项目中,安全认证机制会更加严格,例如通过密钥对用户名和密码进行安全认证。
客户端与服务端链路建立成功之后,由客户端发送业务握手请求的认证消息,服务端接收到客户端的握手请求消息之后,如果 IP 校验通过,返回握手成功应答消息给客户端,应用层链路建立成功。握手应答消息中消息体为 byte 类型的结果,0:认证成功;-1 认证失败;服务端关闭连接。
链路建立成功之后,客户端和服务端就可以互相发送业务消息了,在客户端和服务端的消息通信过程中,业务消息体的内容需要通过 MD5 进行摘要防篡改。

可靠性设计

心跳机制

在凌晨等业务低谷时段,如果发生网络闪断、连接被 Hang 住等问题时,由于没有业务消息,应用程序很难发现。到了白天业务高峰期时,会发生大量的网络通信失败,严重的会导致一段时间进程内无法处理业务消息。为了解决这个问题,在网络空闲时采用心跳机制来检测链路的互通性,一旦发现网络故障,立即关闭链路,主动重连。
当读或者写心跳消息发生 I/O 异常的时候,说明已经中断,此时需要立即关闭连接,如果是客户端,需要重新发起连接。如果是服务端,需要清空缓存的半包信息,等到客户端重连。
空闲的连接和超时
检测空闲连接以及超时对于及时释放资源来说是至关重要的。由于这是一项常见的任务,Netty 特地为它提供了几个 ChannelHandler 实现。IdleStateHandler 当连接空闲时间太长时,将会触发一个 IdleStateEvent 事件。然后,可以通过在 ChannelInboundHandler 中重写 userEventTriggered()方法来处理该 IdleStateEvent 事件。
ReadTimeoutHandler 如果在指定的时间间隔内没有收到任何的入站数据,则抛出一个ReadTimeoutException 并关闭对应的 Channel。可以通过重写你的 ChannelHandler 中的exceptionCaught()方法来检测该 Read-TimeoutException。

重连机制

如果链路中断,等到 INTEVAL 时间后,由客户端发起重连操作,如果重连失败,间隔周期 INTERVAL 后再次发起重连,直到重连成功。
为了保持服务端能够有充足的时间释放句柄资源,在首次断连时客户端需要等待INTERVAL 时间之后再发起重连,而不是失败后立即重连。
为了保证句柄资源能够及时释放,无论什么场景下重连失败,客户端必须保证自身的资源被及时释放,包括但不现居 SocketChannel、Socket 等。
重连失败后,可以打印异常堆栈信息,方便后续的问题定位。

重复登录保护

当客户端握手成功之后,在链路处于正常状态下,不允许客户端重复登录,以防止客户端在异常状态下反复重连导致句柄资源被耗尽。
服务端接收到客户端的握手请求消息之后,对 IP 地址进行合法性校验,如果校验成功,在缓存的地址表中查看客户端是否已经登录,如果登录,则拒绝重复登录,同时关闭 TCP链路,并在服务端的日志中打印握手失败的原因。
客户端接收到握手失败的应答消息之后,关闭客户端的 TCP 连接,等待 INTERVAL 时间之后,再次发起 TCP 连接,直到认证成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/127544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android Studio打包AAR

注意 依赖的Android Studio版本为4.2.2 更高的Android Studio版本使用方法可能有所不同,gradle的版本和gradle plugins的版本都会影响使用方式。 基于此,本文只能作为参考,而不能作为唯一答案,如果要完全依赖本文,则…

基于深度学习的菠萝与果叶视觉识别及切断机构设计

收藏和点赞,您的关注是我创作的动力 文章目录 概要 一、课题内容二、总体方案确定2.1 方案选择2.2 菠萝的视觉识别流程2.3 菠萝果叶切断机构设计流程 三 基于深度学习的菠萝检测模型3.1 卷积神经网络简介3.2 YOLO卷积神经网络3.3 图像采集与数据制作3.4 数据训练与…

ubuntu(18.04)中架设HiGlass docker镜像服务,已尝试mcool、bedpe、wig格式文件

前言 使用到的软件 docker 文档 : https://www.docker.com/ HiGlass 文档:http://docs.higlass.io/higlass_docker.html#running-locally higlass-docker 地址:https://github.com/higlass/higlass-docker nginx 文档: htt…

Modelsim 使用教程(2)——Basic Simulation

一、概述 在本文中,我们将介绍Modelsim基本的仿真流程,包括有: Create the Working Design Library(创建工具库) Compile the Design Units(编译设计单元) Optimize the Design(优化…

C#开发的OpenRA游戏之步兵训练

C#开发的OpenRA游戏之步兵训练 前面已经分析过建造物品的窗口,在这里步兵训练也是一样的过程,不过还是有一点区别,那就是步兵会自己走去,而建造的物品是不会自己行动的。步兵也是一个主要攻击手段,并且便宜,现在就来分析步兵训练的实际过程。 步兵是定义在文件OpenRA\mo…

曾经遇到过的无法解释的问题

因为不能直接展示生产数据与生产数据结构&#xff0c;所以写一个简单的例子 class Stu{ private String name; private int age; getter setter constructor 略 } List<Stu> list new ArrayList(); list.add(new Stu("s1",16)); list.add(new Stu("…

数据库概论

目录 什么是数据库数据库的概念模型层次模型网状模型关系模型 为什么要使用关系型数据库完整性约束结构化查询语言SQL基本语句 什么是数据库 考虑这些问题&#xff1a;当用户使用软件计算时&#xff0c;如果想要保存计算结果或者想选择不同的题目&#xff0c;是否要保存、读取…

利用云计算和微服务架构开发可扩展的同城外卖APP

如今&#xff0c;同城外卖APP已经成为了人们点餐的主要方式之一。然而&#xff0c;要构建一款成功的同城外卖APP&#xff0c;不仅需要满足用户的需求&#xff0c;还需要具备可扩展性&#xff0c;以适应快速增长的用户和订单量。 一、了解同城外卖APP的需求 在着手开发同城外卖…

设计模式(23)解释器模式

一、介绍&#xff1a; 1、定义&#xff1a;解释器(Interpreter)模式是一种对象的行为模式。给定一个语言&#xff0c;定义它的文法的一种表示&#xff0c;并定义一个解释器&#xff0c;这个解释器使用该表示来解释语言中的句子。 2、组成结构&#xff1a; &#xff08;1&…

vue项目打包时按一定的名称规范生成对应的压缩包

在项目部署中经常需要将打包的dist按一定的名称压缩成压缩包&#xff0c;今天记录一下打包时生成压缩包的过程。其中有用到的npm包需要自己安装一下。 js文件放置的目录如下 compress.js内容如下&#xff1a; // compress.jsimport fs from "fs"; import shell fro…

外网远程登录之 NAT server

案例&#xff1a; 外网远程登录内网SW&#xff1a; 需求 1.内网的PC都可以访问Server1 2.外网的R2可以远程登录SW1&#xff0c; 用户名和密码是&#xff1a;HCIE/hehe 需求 1.内网的PC都可以访问Server1 2.外网的R2可以远程登录SW1&#xff0c; 用户名和密码是&#xff1a;HCI…

HTML5<canvas>

HTML5<canvas>元素用于图形的绘制&#xff0c;通过脚本&#xff08;通常是JavaScript&#xff09;来完成。<canvas>标签只是图形容器&#xff0c;必须使用脚本来绘制图形。 1)、<canvas> 创建一个画布&#xff1a; <canvas id"myCanvas" widt…

PyTorch入门学习(十):神经网络-非线性激活

目录 一、简介 二、常见的非线性激活函数 三、实现非线性激活函数 四、示例&#xff1a;应用非线性激活函数 一、简介 在神经网络中&#xff0c;激活函数的主要目的是引入非线性特性&#xff0c;从而使网络能够对非线性数据建模。如果只使用线性变换&#xff0c;那么整个神…

OpenCV 笔记(4):图像的算术运算、逻辑运算

Part11. 图像的算术运算 图像的本质是一个矩阵&#xff0c;所以可以对它进行一些常见的算术运算&#xff0c;例如加、减、乘、除、平方根、对数、绝对值等等。除此之外&#xff0c;还可以对图像进行逻辑运算和几何变换。 我们先从简单的图像加、减、逻辑运算开始介绍。后续会有…

文件fd.

共识原理: 1.文件 内容 属性 2.文件分为打开的文件 和 没打开的文件 3.打开的文件: 谁打开? 进程! ----本质是研究进程和文件的关系! 根据冯诺依曼原理&#xff0c;文件被打开&#xff0c;必须先被加载到内存&#xff01;不然CPU怎么访问它 那么是文件内容被加载&#xff…

redis如何保证和mysql数据的一致性

Redis和MySQL是两种不同的数据库系统&#xff0c;它们在数据一致性方面有不同的特点和应用场景。保证Redis和MySQL数据的一致性通常需要考虑以下几个方面&#xff1a; 双写策略&#xff1a; 一种常见的方法是采用双写策略&#xff0c;即将更新操作同时写入Redis和MySQL。这确保…

JS计算中出现无限小数位的情况

原因分析&#xff1a; 在开发中遇到了浮点数转换为百分数的问题&#xff0c;用浮点数乘以100结果产生了一堆小数位。查资料发现原因是由于计算机计算会先把数字转换成二进制计算&#xff0c;然后在转换为10进制&#xff0c;导致精度丢失。 在计算机角度&#xff0c;计算机算的…

系列七、Mybatis的二级缓存

一、概述 Mybatis的二级缓存是多个sqlSession共享的&#xff0c;其作用域是mapper的同一个namespace&#xff0c;不同的sqlSession执行两次相同的查询&#xff0c;mybatis会将第一次执行完的数据放到二级缓存中&#xff08;坑&#xff1a;需要执行close操作&#xff0c;要不然不…

C#学习系列之虚方法和多态

C#学习系列之虚方法和多态 啰嗦设计原则&#xff08;六大类其中之一&#xff09;基类的引用使用 共性与差异虚方法和多态的武器使用 其他总结 啰嗦 基础学习。 设计原则&#xff08;六大类其中之一&#xff09; **依赖倒置原则&#xff1a;**依赖抽象类&#xff0c;不依赖具体…

通过Python脚本支持OC代码重构实践(二):数据项提供模块接入数据通路的代码生成

作者 | 刘俊启 导读 在软件开发中&#xff0c;经常会遇到一些代码问题&#xff0c;例如逻辑结构复杂、依赖关系混乱、代码冗余、不易读懂的命名等。这些问题可能导致代码的可维护性下降&#xff0c;增加维护成本&#xff0c;同时也会影响到开发效率。这时通常通过重构的方式对已…