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

前言

《迷你微信》服务器端是使用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. 5.SSRF服务器端请求伪造

    SSRF(服务端请求伪造):是一种由攻击者构造形成由服务端发起请求的一个安全漏洞. 一般情况下,SSRF攻击的目标是从外网无法访问的内部系统.(正是因为它是由服务端发起的,所以它能够请求到与它相连而与 ...

  2. HDU 3915 Game (高斯消元)

    题意:有n堆石子,每个人只能从某一堆至少拿走一个,不能拿者败.问事先拿走某些堆的石子,使得先手必败. 析:将石子拆成二进制,未知数为1表示保留该堆石子,为0表示事先拿走该堆石子.最后求自由变元的数目, ...

  3. C#——各种参数,扩展方法

    余近日复习C#之基础知识,故作一随笔,也是对此前几篇博客中所记录的传值参数相关内容之汇总,还望诸位加以批评指正. 该博客包括以下内容: 传值参数 引用参数 输出参数 数组参数 具名参数 可选参数 扩展 ...

  4. EIP权限工作流平台总结-2前端框架

      1.预览地址:www.eipflow.com (1) 权限工作流:www.demo.eipflow.com/Account/Login (2) 基础权限版:www.auth.eipflow.com ...

  5. PHP连接 redis

    <?php //连接本地的 Redis 服务 $redis = new Redis(); //连接redis 地址 端口 连接超时时间 连接成功返回true 失败返回false $redis-& ...

  6. 【转】Asp.Net页面生命周期

    源地址:http://www.cnblogs.com/xhwy/archive/2012/05/20/2510178.html

  7. 洛谷P4707 重返现世(扩展MinMax容斥+dp)

    传送门 我永远讨厌\(dp.jpg\) 前置姿势 扩展\(Min-Max\)容斥 题解 看纳尔博客去→_→ 咱现在还没搞懂为啥初值要设为\(-1\)-- //minamoto #include< ...

  8. HTTP/TCP协议基础

    HTTP协议 基本概念 HTTP协议(超文本传输协议 HyperText Transfer Protocol):是用于从WWW服务器传输超文本到本地浏览器的传送协议.它不仅保证计算机正确快速地传输超文 ...

  9. LDAP相关操作注意事项

    lc.Modify(entry.DN, new LdapModification(LdapModification.REPLACE, new LdapAttribute("mDBUseDef ...

  10. 如何理解javascript中的同步和异步

    javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流水线而已,要 ...