【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:7.项目介绍之架构(1)
前言
《迷你微信》服务器端是使用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)的更多相关文章
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:0.概述
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 序言 帖主和队友仿制了一个简单版的微信,其中,队友是用Unity3D做前段,帖主用Java的Mina.Hiberna ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:9.观察者模式
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 在一个程序的迭代过程中,复杂度渐渐上升,可能会出现一些跨模块的调用的需求,若是直接得到引用来进行使用,会导致模 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:8.自定义传输协议
欢迎阅读我的开源项目<迷你微信>服务器)与<迷你微信>客户端 前言 在上一篇中,我们讲到了<迷你微信>服务器)的主体架构,还讲到了如何在现有功能上进行拓展,但是拓展 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:3.技术简介之MinaFilter——LoggingFilter (转)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 LoggingFilter 接下来,使我们对Filter介绍的最后一个——LoggingFilter. 与Proto ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:6.技术简介之Protobuf
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 protocolbuffer(以下简称Protobuf)是google 的一种数据交换的格式,它独立于语言,独立于平 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:5.技术简介之Hibernate
目录 序言 配置 hibernate.cfg.xml配置文件 加载hibernate.cfg.html配置文件并获取Session 对象的注解配置 增删改查 具体的增删改查代码 数据库操作的封装 连接 ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统 :1.技术简介之Mina连接
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Apache MINA(Multipurpose Infrastructure for Network Applic ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:4.技术简介之Spring
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 Spring是一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One ...
- 【迷你微信】基于MINA、Hibernate、Spring、Protobuf的即时聊天系统:10.项目介绍之架构(2)
欢迎阅读我的开源项目<迷你微信>服务器与<迷你微信>客户端 前言 前面我们讲到<迷你微信>服务器端的主架构,现在我们来描述一下它的模块详细信息. 网络模块 从上图我 ...
随机推荐
- Struts2学习第五课 通过和ServletAPI耦合的方式获取WEB资源
与Servlet耦合的访问方式 直接访问Servlet API将使Action与环境Servlet环境耦合在一起,测试时需要有Servlet容器,不便对Action的单元测试. 直接获取HttpSer ...
- Spring入门第二十七课
声明式事务 直接上代码: db.properties jdbc.user=root jdbc.password=logan123 jdbc.driverClass=com.mysql.jdbc.Dri ...
- JS使用replace替换字符串中的某段或某个字符
函数的介绍参考:http://www.w3school.com.cn/jsref/jsref_replace.asp 下列代码将Hello World!中的World替换为Jim <html&g ...
- windows配置换行符
CR.LF.CR/LF为不同操作系统上使用的换行符: Windows/DOS系统:采用CR/LF表示下一行: Unix/Linux系统:采用LF表示下一行: Mac OS系统:采用CR表示下一行: M ...
- Mybatis学习笔记之一——牛刀小试
1.Mybaits核心对象SqlSession的作用: (1)向SQL语句传入参数: (2)执行SQl语句: (3)获取执行SQL语句的结果: (4)事务的控制: 2.核心配置文件(Configrat ...
- CAS客户端整合(三) Otrs
OTRS 是用Perl写的一个工单邮件系统,非常强大. 登录流程 流程图略过 otrs没有像 discuz 和 zabbix 类似的游客登录状态,这样处理起来逻辑分支少一些. 不过还是考虑用 otrs ...
- C语言经典算法100例(三)
1.河内之塔 说明河内之塔(Towers of Hanoi)是法国人M.Claus(Lucas)于1883年从泰国带至法国的,河内为越战时北越的首都,即现在的胡志明市:1883年法国数学家 Edoua ...
- IPv6邻居发现协议
IPv6邻居发现协议 邻居发现协议NDP 邻居发现协议NDP(Neighbor Discovery Protocol)是IPv6协议体系中一个重要的基础协议.邻居发现协议替代了IPv4的ARP(Add ...
- jmeter 正则获取参数集合和ForEach控制器结合使用(转)
怎么把第一个请求获取的返回的多个id,在第二个请求中逐个以单个id作为请求参数来请求? 为了解决这个问题,模拟下该场景 1.请求www.163.com 主页,获取响应中的所有数字,这个获取的数字集合暂 ...
- maven项目跳转页面报空指针错误 Servlet.service() for servlet 异常
Servlet.service() for servlet jsp threw exceptionjava.lang.NullPointerExceptionat org.jaronsource.ms ...
