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

前言

《迷你微信》服务器端是使用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. sklearn实现聚类

    import numpy as np from sklearn import datasets from sklearn.cross_validation import train_test_spli ...

  2. Python学习——输入和输出

    (转自:http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/0014316434841 ...

  3. LVM使用

    LVM框架 LVM实验环境准备 创建一个128MB的文件模拟磁盘 [centos@centos lvm]$ dd if=/dev/zero of=./disk.img count=128 bs=1MB ...

  4. linux 内核与用户空间通信机制netlink初探

      1.Linux进程概述 Linux中的进程间通信机制源自于Unix平台上的进程通信机制.Unix的两大分支AT&T Unix和BSD Unix在进程通信实现机制上各有所不同,前者形成了运行 ...

  5. jpanel使用布局管理器时,setsize会失效

    布局管理器会自动根据容器里面的控件大小自动调整size和位置 如果想设置容器的大小和位置,可以使用setPreferredSize方法.

  6. 使用poi导出Excel表格,jar包冲突

    HTTP Status 500 – Internal Server Error Type Exception Report Message Handler processing failed; nes ...

  7. 《SQL 进阶教程》 自连接排序

    子查询所做的,是计算出价格比自己高的记录的条数并将其作为自己的位次 -- 自连接实现排序功能SELECT P1.name,P1.price,(SELECT COUNT(P2.price)FROM Pr ...

  8. C++ | char* 在类中实践笔记

    在C++中,当类中定义有char * 变量时,在传参,构造函数,复制构造函数如何创建及赋值,来一个简单的例子就明了: #include<iostream> #include<stri ...

  9. HttpResponseCache的使用缓存cache

    为什么要用cache? 我们可以通过传递类似上次更新时间这样的参数来制定查询某些数据.同样,在下载图片的时候,server那边最好能够减少图片的大小,而不是让我们下载完整大小的图片. 之前我们在软件开 ...

  10. about 字节

    关于由于赋值导致字节的截断.字节扩展及数据类型的提升: 一.字节截断:int----->char 当一个字节(8位)放不下时,出现截断,直接取(最后一个字节)最后面面8位. 例如:1000000 ...