【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)
前言
前面我们讲到《迷你微信》服务器端的主架构,现在我们来描述一下它的模块详细信息。
网络模块
-
从上图我们可以看出Server类在开始时调用了ServerNetwork的开启连接接口,从而开启了整个服务器的连接。
-
在ServerNetw的连接中,首先是打开了一个NIO(非阻塞式)的连接,连接开启后会添加入一个ProtocolCodecFilter(编码)的Filter,分别是MinaEncoder和MinaDecoder。
-
MinaEncoder负责在服务器向客户端发送数据时进行编码,将要发送的Java对象编码成byte数组进行发送.
-
MinaDecoder负责在服务器接收到客户端数据时进行解码,将接收到的byte数组解码成Java对象,传入逻辑层。
-
在ProtocolCodecFilter之后,还有一个MyLogger的Filter,它将负责将MinaEncoder和MinaDecoder处理完的数据进行一次Log,保证每次服务器的收发都有记录(包括时间,客户端IP和内容)。
-
在ServerNetwork(网络层)中,还有一个“验证重发”器,负责将发送失败的数据进行再次发送,若是一定回合内发送失败,则会被抛弃。
-
在ServerNetwork(网络层)的发送数据接口有ServerModel(服务器Model)和Process Request(请求处理器)两个模块会调用到,其中ServerModel负责发送心跳包(验证客户端在线),而Process Request(请求处理器)用于处理客户端请求。
-
在ServerNetwork(网络层)的接收数据接口会调用到ClientRequest_Dispatcher(客户端请求分发器),即将客户端请求传递给逻辑层。
服务器的Model模块
-
从上图我们可以看出ServerModel类包含了连接中用户的信息以及其一系列方法。
-
clientUserIpTable和clientUserIpTable两个Hashtable指向相同的一系列用户信息类,其中clientUserIpTable是以客户端的IP作为Key,而clientUserIpTable是以用户的UserId作为Key,使用Hashtable的原因是在当前情况下这是所有数据结构中能够最快获取到CLientUser对象的类型。
-
从上图我们可以看出Server类在开始时调用了ServerModel的初始化接口,从而初始化了两个Hashtable对象。
-
Logger对象负责在一些关键操作发生时进行日志的记录。
-
ServerNetwork对象调用的“添加ClientUser”接口是在一个新客户端用户连接上来时以客户端IP作为key,记录下用户信息。
-
ClientRequest_Dispatcher是处理客户端请求的一个模块,它在处理许多请求时需要调用“获取ClientUser”接口来获取ClientUser对象;他在用户登陆时需要调用“用户登陆”接口来向clientUserIpTable中添加对象引用和修改ClientUser的UserId值;在用户下线时需要调用“用户下线”接口来删除clientUserIpTable中指向对象的引用和修改对象的UserId值。
-
KeepAlive模块负责对clientUserIpTable表中已连接用户发送心跳包,若是发送失败,则将该客户端判定为掉线,并删除该ClientUser对象。
服务器的客户端请求处理模块
-
从上图我们可以看出Process Request 模块中共有三个“客户端请求处理器”,他们都继承于Server_Processor(封装关于ServerModel和ServerNetwork的引用和使用)。
-
当服务器拓展新的功能(处理新的客户端请求)时,可以直接在Process Request模块中添加“客户端请求处理器”并继承于Server_Processor即可。
-
ClientRequest_Dispatcher是客户端请求分发器,根据客户端请求的类型分配给不同的“客户端请求处理器”进行处理。
-
Process Request 模块中多数处理方法都需要对数据库进行数据请求或者数据更新,所以Process Request 模块有对Database模块的调用。
-
HibernateSessionFactory类中封装了Hibernate对数据库的处理包含HibernateSessionFactory和HibernateDataOperation两个类。
-
ServerModel_Chatting类中包含了对发送聊天消息的各种操作的封装和对聊天消息的临时存储。
聊天Model模块
-
这个模块是属于Process Request下Server_Chatting的一个子模块,它负责发送聊天消息。
-
当Server_Chatting调用ServerModel_Chatting的“发送聊天消息”接口时,这个模块会进行判断,先从ServerModel中寻找ClientUser对象,校验接受者是否在线,如果在线,便通过调用ServerNetwork的接口进行发送;当接收者不在线时,将存入ChattingHashtable表中,等待用户上线。
-
ServerModelChatting模块监听“用户登陆”消息,一旦接收到这个消息,便会调用“发送聊天消息”的方法,将该用户所有未接受的消息全部发过去。
数据库模块
-
从上图我们可以看出数据模块只由Process Request来调用,并对所有数据库模块的所有开放接口都有调用过。
-
HibernateSessionFactory模块负责管理Hibernate与MySQL的连接,提供“获取Session”接口和“提交Session”接口,对数据库的修改必须先获取Session,在修改完后提交,才能生效。
-
HibernateDataOperation对数据库的增删改查行为进行了封装,其中每个方法都调用了HibernateSessionFactory的“获取Session”接口和“提交Session”接口。
后话
在这个服务器的架构中,功能的拓展可以通过在Process Request 模块里面进行添加,然后从ClientRequest_Disptcher调用过去就可以了而更加复杂的功能拓展,可以添加观察者模式或者消息模式来实现,前面章节我们已经简单的论述,这里就不在多说了。