TCP组件设计篇(详细设计)

绝学无忧,唯之与阿,相去几何?善之与恶,相去若何?人之所畏,不可不畏。荒兮其未央哉!众人熙熙如享太牢、如春登台。我独泊兮其未兆,如婴儿之未孩;儡儡(lěi,羸弱)兮若无所归。众人皆有馀,而我独若遗。我愚人之心也哉!沌沌兮。俗人昭昭,我独昏昏;俗人察察,我独闷闷。众人皆有以,而我独顽且鄙。我独异於人,而贵食母。------《道德经-第二十章》
功能定义:
1:基于SSL TCP连接
2:支持多种解码器(String,XML,JSON,Protobuf)
非功能性功能定义:
1:心跳机制(只有在Client端长时间没有接收到消息或者发送消息情况下才发起心跳)
2:重连机制(重连机制包含重连次数和重连间隔时间)
3:白名单(V1.0不支持)
4:消息缓存重发机制(V1.0不支持)
5:手动拆包(V1.0不支持)
依赖第三方组件
1:Netty
2:FastJson
3:GoogleProtobuf
4:EventBus
5:Guava
各个组件使用场景
1:Netty:处理TCP通信,并且将接收到的消息转发给EventBus
2:FastJson:JSON格式解码
3:GoogleProtobuf:Protobuf格式解码
4:EventBus:事件总线,将消息转发给业务层
5:Guava:缓存
常量的定义:
1:内置消息类型(1:心跳 2:注册 3:连接成功 4:转发)
2:解码类型(1:String2:JSON 3:XML 4:Protobuf)
消息定义
1:整体消息定义
整体消息 2:消息Header定义
消息Header 流程说明:
1:链路建立:
当客户端与服务端链路建立成功,由客户端发起注册请求信息,请求信息定义如下:
注册消息 服务端接收到客户端的注册消息之后,如果Client ID校验已经通过(因为使用SSL认证,这边只做Client ID是否重复操作),返回注册成功应答消息给客户端,应用层链路建立成功。返回消定义如下
注册返回 2:心跳机制
在业务处于低谷时期,如果发生网络闪断,连接被Hang住等网络问题,由于没有业务消息,应用进程很难发现。但是等到白天业务高峰期间是,会发生大量的网络通信失败,这就会严重导致一段时间内进程内无法处理业务消息,为了解决这个问题,在网络空闲的时候采用心跳机制来检测链路的互通性,一旦发现网络故障,理解关闭链路,主动重连。
常用的设计方式为:做一个定时任务,间隔一段时间发送心跳,这样做其实在有业务交互的场景下非常浪费资源。
本次设计方法:
1)只有在网络处于空闲状态持续达到某一个时间(所谓网络空闲指的是一段时间没有读写消息),这个时候客户端就要发送Ping 心跳信息到服务端。
2)当在下一个时间段的到来之前业务之间消息来往,则不需要发送心跳,直到下一个网络空闲时候才发送心跳
3)当服务端很长时间没有接收到客户端发送的心跳或者业务消息的时候,服务端则强制关闭客户端连接,客户端则必须重新连接。
3:重连机制
如果链路出现中断,等待间隔时间以后,由客户端重新发起连接,如果连接失败记录连接失败次数,再次等待间隔时间发起连接,如果一直没有连接成功,当失败次数大于定义的次数的时候停止重新连接。如果连接成功则将连接失败次数设置为0.
4:消息缓存重发
不管对于客户端还是服务端,当发现链路中断之后,在链路恢复之前,必须要将消息缓存起来,保证消息不能丢失,等待链路回复之后,重新发送这些消息。考虑到内存溢出的情况,消息缓存队列必须设置上限,当达到上限之后,要不然移除前面的消息或者不容许新的消息被添加到消息队列中。
Netty Handler加载顺序
服务端Handler加载顺序
服务端Handler加载顺序图 说明:
1)LoggingHandler:Netty内置Handler,日志输出
2)SslHandler:Netty内置Handler,处理SSL连接
3)NettyServerRegisterHandler:自定义Handler,处理注册消息
4)NettyServerHeartBeatHandler:自定义Handler,处理心跳消息
5)NettyServerHandler:自定义Handler,处理业务消息,并且将消息发送给业务
客户端Handler加载顺序
客户端Handler加载顺序图 说明:
1)LoggingHandler:Netty内置Handler,日志输出
2)SslHandler:Netty内置Handler,处理SSL连接
3)NettyClientHandler:自定义Handler,处理业务消息
核心类设计
解码器设计类图:
解码器设计类图 说明:
Netty内置了String,Protobuf等一些解码器,因为本次开发组件是内部使用,所以自定义了私有协议栈。那么就必须自定义了解码器。
消息类定义
Message类 Message Header 流程说明:
1:由Netty接收到Client发过来的数据提交给自定义解码器(MessageDecoder)
2:MessageDecoder将byte[]转换为Message对象。
3:Netty将Message对象提交给业务Handler。
4:业务Handler将Message提交给EventBus。
5:EventBus根据MessageType找到当前消息对应的业务Event。
【TCP组件设计篇(详细设计)】6:EventBus根据DecoderType找到当前消息体内的需要解码的类型
7:Decoder将Message中的Body转换为业务对象,提交给业务Event。
客户端和服务端联调测试用例(本测试只是测试功能)
测试用例

    推荐阅读