政务建设网站得必要性网站开发在线学习
政务建设网站得必要性,网站开发在线学习,1000元做网站,郑州网站建设qicaizz通信框架功能设计
功能描述
通信框架承载了业务内部各模块之间的消息交互和服务调用#xff0c;它的主要功能如下#xff1a; 基于 Netty 的 NIO 通信框架#xff0c;提供高性能的异步通信能力#xff1b; 提供消息的编解码框架#xff0c;可以实现 POJO 的序列化和反序…通信框架功能设计
功能描述
通信框架承载了业务内部各模块之间的消息交互和服务调用它的主要功能如下 基于 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/pingmian/87821.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!