欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

前言

《迷你微信》服务器端是使用Java语言,Mina框架编写的,一个良好的架构关系到后期迭代的方便程度和异常的出现频率问题,其中,解耦是一个很重要的关注点。帖主虽然没有做过大的研究,不过目前这种架构还是能满足需求的。

整体架构

废话不多说,先上图!

  • 从上往下看,首先Server类开启了整个服务器进程,在这里,并没有将Spring给画出来,因为Spring只是一个框架。

  • 在Server类的Main函数中,调用了Spring,进行所有类的实例化和依赖注入。

  • 接下来,是初始化方法init()的调用,ServerModel和ServerNetwork两个类的初始化方法都是Server在完成Spring的流程后进行调用的,这样可以保证初始化的顺序,防止初始化时参数依赖导致的问题。

  • ServerModel保存着服务器运行时的数据(比如用户信息,聊天消息等)和对这些数据的封装操。

  • 而ServerNetwork则是《迷你微信》服务器的网络模块,负责接收,发送数据,其中MinaEncoder、MinaDecoder、MyLogger是以聚合的方式使用在ServerNetwork中。

  • ClientRequest_Disptcher是客户端请求的分发器,职责是根据客户端请求类型,将请求分发给不同的“请求处理器”进行处理。

  • 大家可以看到,有3个“请求处理器”,分别是Server_Chatting、Server_User、Server_Friend,帖主将其合在一个组合片段中,这三个类都继承于Server_Processor这个基类,Server_Processor仅仅是将三个子类共同的代码——get,set ServerModel、ServerNetwork两个类的引用提取到基类,减少重复代码,而且一旦需求拓展,有了新的“请求处理器”,也同样是继承于Server_Processor这个基类。

  • Server_Chatting,用于处理微信中聊天的相关请求,比如发送聊天消息、创建群聊、修改群信息、修改群成员等等功能。

  • Server_User,用于处理微信中的用户个人的相关请求,比如登陆、注册、注销、修改个人信息等等功能。

  • Server_Friend,用于处理微信中用户好友的相关请求,比如查找用户、添加好友、删除好友等等功能。

  • 仔细往下看看,可能你会感到奇怪ServerModel_Chatting这个类是干啥的呢?为啥“请求处理器”中唯独Server_Chatting调用了这样一个类呢?这涉及到发送消息的接受者不在线等一系列问题,详细的说明我们将在后面的博客中进行说明。

  • 接着是数据库的两个类:HibernateDataOperation 和 HibernateSessionFactory,首先HibernateSessionFactory是进行Hibernate数据库的连接和获取Session与最后的提交处理的,而HibernateDataOperation则将Hibernate的一些方法进行了封装,这样做的原因,请参考博客【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate

拓展

随着软件的开发使用,可能会渐渐的拓展新功能,那么,服务器也就要相应的加上对新功能的处理,这也是迭代开发方式所需要和体现的效果。

由于使用Spring的依赖注入方式创建了本服务器端的绝大多数类的实例对象,所以可以说,

ServerModel、ServerNetwork、ClientRequest_Disptcher、Server_Chatting、Server_User、Server_Friend都是单例,所以这其间的许多类都是拥有者其他几个类的引用,而HibernateDataOperation 和 HibernateSessionFactory则是提供静态方法来进行调用,故使用起来其实是很方便的。

当需要进行功能层次的拓展时,您可以在组合片段 Process request 内添加新的“请求处理器”,新的处理器需要继承于Server_Processor这个基类,在里面实现了功能即可。当客户端的请求来临时,首先会被ServerNetwork的Filter(详细请参考【迷你微信】基于MINA、Hibernatye、Spring、Protobuf的即时聊天系统:2.技术简介之MinaFilter_1)MinaEncoder打包成一个NetworkPacket包,接着通过ClientRequest_Disptcher进行分析后转发,若是属于新功能,则将转发到您新编写的“请求处理器”中。

关于ClientRequest_Disptcher中如何辨别请求类型,请看下篇博客[【迷你微信】基于MINA、Hibernatye、Spring、Protobuf的即时聊天系统:8.自定义传输协议]。

欢迎阅读我的开源项目《迷你微信》服务器《迷你微信》客户端

最新文章

  1. AngularJs之一
  2. 【Beta】Scrum5.5
  3. 【转】Android中的事件分发和处理
  4. python-selenium之firefox、Chrome、Ie运行
  5. hibernate下载包中配置文件路径
  6. ajax读取文本内容(此处的txt文件和html文件处于同级目录)
  7. LinkedHashMap实现LRU算法
  8. css display visibility
  9. Python 数据类型
  10. Jexus 高并发请求的优化技巧 笔记
  11. nodejs入门demo
  12. 查看Linux系统文本编码-方便修改ssh编码一致
  13. mac下CSV文件用FileReader、FileWriter读写乱码
  14. 一位菜鸟的java 最基础笔记
  15. 检测flash是否安装及版本号
  16. Python3解析dex文件
  17. JAVA-常用集合类型转换例子(基础必备)
  18. Python爬虫【三】利用requests和正则抓取猫眼电影网上排名前100的电影
  19. WDA基础九:BusinessGraphics
  20. July_One_Week—linked list

热门文章

  1. Struts2学习第三课 Action
  2. cookie 、Session 和自定义分页
  3. UVaLive 5031 Graph and Queries (Treap)
  4. Pillow不支持color emoji font!
  5. 读取某文件夹下所有excel文件 python
  6. Docker 容器的数据卷
  7. 洛谷P3694 邦邦的大合唱站队/签到题
  8. 解读人:刘杰,Targeted Quantitative Kinome Analysis Identifies PRPS2 as a Promoter for Colorectal Cancer Metastasis(PRM-磷酸化激酶定量发现结肠癌转移促进因子-PRPS2)
  9. ajax异步请求问题
  10. Tensorflow安装教程-Win10环境下