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

前言

《迷你微信》服务器端是使用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.自定义传输协议]。

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

【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)的更多相关文章

  1. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...

  2. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...

  3. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议

    欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...

  4. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...

  5. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...

  6. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate

    目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...

  7. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...

  8. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...

  9. 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)

    欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 前面我们讲到<迷你微信>服务器端的主架构,现在我们来描述一下它的模块详细信息. 网络模块 从上图我 ...

随机推荐

  1. Window 7 安装Docker toolbox , 启动terminal时遇到的小问题

    参考:http://blog.csdn.net/tina_ttl/article/details/51372604 参考前面网页成功安装后打开terminal,出现下面问题: Looks like s ...

  2. PS2018学习笔记(25-29节)

    25-亮度与色阶看懂直方图-part1 # 本节知识点: 灰度模式 明暗对比 明度/对比度命令 直方图 色阶命令 调整图层 # 本节段落表: 了解亮度对比 灰度模式观察明暗 明度/对比度命令 认知对比 ...

  3. CodeForces 116C 【BFS】

    思路: 求所有树的最大高度? 注意:所有树从树根开始? #include <bits/stdc++.h> using namespace std; typedef long long LL ...

  4. ASP.NET对象

    ASP.NET有五个基本的常用对象 一张图胜过前言万语 ASP.NET对象重头戏 对象名    解释 属性 方法 例子 Request 获取客户端数据信息 1.UserAgent:用来获取客户端浏览器 ...

  5. 微信小程序通过JS动态修改页面标题setNavigationBarTitle

    wx.setNavigationBarTitle({title: '当前页面'})

  6. rem 回家测试

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  7. string类型的方法

    var str1 = ' this is string1 '; var str2 = 'this is string2'; str1.indexOf('s'); //args:string retur ...

  8. KMP 串的模式匹配 (25 分)

    给定两个由英文字母组成的字符串 String 和 Pattern,要求找到 Pattern 在 String 中第一次出现的位置,并将此位置后的 String 的子串输出.如果找不到,则输出“Not ...

  9. 统计分析: 跨库多表join

    mysql中如果多个库在一个实例上, 可以进行多表的跨库Join, 但是如果后期数据库分隔到不同的实例机器上,有查询问题 mysql的查询优化器没有其他商业数据库做的好, 用来CRUD还行, 但是做大 ...

  10. AJAX下拉框联动

    function getProvince() { var ProName = $("#dvProv").val(); LoadProvince(ProName); } functi ...