姓名:孔德帅CS架构的服务器设计与实现过程2019/10/172主要内容系统框架应用服务器设计功能服务器设计应用服务器与功能服务器之间的通信插件机制消息管理实现过程2019/10/173一CS服务器系统框架C/S四层框架功能服务器1功能服务器2功能服务器3应用服务器客户端数据库1数据库22019/10/174一应用服务器设计—功能定位•应用服务器:转发所有的功能请求给功能服务器,并处理所有的非功能请求,并管理终端用户、进行状态保持、日志记录等。2019/10/175二应用服务器结构UI用户界面用户管理模块网络通讯模块消息处理模块消息分配模块多连接池管理功能服务器功能服务器Tcp/Udp基本消息处理器事件记录2019/10/176三应用服务器结构UI用户界面:1用于显示当前连接的用户,和每个用户正在请求的服务2用户显示当前注册的功能服务器,和每个功能服务器的当前状态、用户管理模块:用于管理所有在线用户的状态,并对用户作定时掉线检查网络通讯模块:主要作用是接收客户端来的消息,不作任何处理直接转发给消息处理模块。消息处理模块:对消息信息进行,解密,解压,验证等消息分配器:根据消息的类别(基本请求、功能请求),将基本请转发给基本消息处理器处理,而将功能请求通过连接池管理者转给功能服务器进行处理基本消息处理器:用于处理非功能请求,如登录请求、退出请求等日志记录模块:将一些重要的事件信息写入到Windows的事件日志中或日志2019/10/177一功能服务器功能服务器:处理并且仅处理所有的功能性请求,不参与用户管理、状态保持等,提供最纯粹的功能服务2019/10/178二功能服务器结构UI用户界面网络通讯模块消息分配模块功能插件管理模块消息处理模块功能插件功能插件功能插件事件记录2019/10/179三功能服务器结构网络通讯模块:主要作用是接收客户端来的消息,不作任何处理直接转发给消息处理模块。1.消息处理模块:对消息信息进行,解密,解压,验证等•消息分派模块:将从通讯模块来的字节流分裂为一个或多个请求消息,然后调用对应的功能插件来处理,并将处理点结果返回给通信模块,最后由通信模块发送给客户端。•UI用户界面:用于显示当前的连接,和每个连接上正在请求的服务。并控制加载的各个功能插件的相关信息。•功能插件管理模块:用于加载、管理所有的功能插件。•日志记录模块:将一些重要的事件信息写入到Windows的事件日志中或日志2019/10/1710一应用服务器与功能服务器之间的通信1.应用服务器和功能服务器之间的所有功能通信是通过TCP连接池进行的,在这种情况下,应用服务器是主动联系功能服务器。2.应用服务器和功能服务器之间的非功能通信通过Remoting的方式来完成,即当功能服务器启动时,将自己的地址信息通过应用服务器发布的远程服务接口告诉给应用服务器,然后应用服务器再根据这个地址去和功能服务器建立TCP连接池。3.在非功能通信中,是功能服务器主动联系应用服务器,所以功能服务器不需要发布远程服务接口,功能服务器只需要知道应用服务器发布的远程服务的地址即可(服务器的配置文件中)通常这个服务地址记录在功能二应用服务器与功能服务器之间的通信保障1.第一种情况:当功能服务器正常工作一段时间后重启每次功能服务器启动/重启时都向应用服务器发送“我启动了”的消息,这样应用服务器就去主动与功能服务器建立Tcp连接池或恢复已存在的连接池。2.第二种情况是应用服务器重启:功能服务器通过Remoting定时给应用服务器发送心跳包,当发生Remoting异常时,功能服务器就知道应用服务器掉线了。应用服务器掉线后,功能服务器就定时给应用服务器发送“我启动了”的消息,直到应用服务器重启完毕。3.第三种情况是网络断开后恢复:应用服务器定时检测不到功能服务器发送的心跳包,应用服务器就当功能服务器下线,功能服务器Remoting不到应用服务器,功能服务器就当应用服务器掉线了,当网络恢复的时候,功能服务器重新向应用服务器发送“我启动了”的消息2019/10/1712一插件机制•插件又称为扩展,是一种特殊的组件,用于增强和扩展基本框架的行为能力。插件和框架的通信协议是一组接口,插件的各种特性都可以通过该接口进行访问。插件主要有如下特点:•(1)一个插件是一个独立的物理单元。它可以独立的提供一项完整的服务(功能),而不需要依赖于其它插件。•(2)插件能自我描述――插件的所有对外的发布信息都由插件自己内部提供,而不依赖于外部文件或注册表。•(3)插件能自我管理――插件如果需要配置信息,则插件自己能读取和修改配置信息,而不是框架来完成这些事情。(4)插件自我独立――一个插件不得引用其它的插件。如果一个插件与另一个插件关系紧密,那么应该将这两个插件合成一个插件,或者重新分解为两个独立的插件.2019/10/1713二插件机制实现1.获取插件目录下的每个插件(DLL)2.通过Assembly.LoadFrom加载一个插件3.通过反射Type.IsSubclassOf查看其是否实现了某种插件类型的接口4.通过Activator.CreateInstance来实例化一个插件对象通过这四个步骤就可以实现一个简单的插件系统2019/10/1714六消息管理•消息格式定义:消息=消息体+消息头•消息拦截器:对消息进行拦截,加密,压缩等•消息监视器:验证接收到的每个消息格式是否正确、消息是否合法、消息是否符合特定规格•消息分派器:统一调用消息拦截器,监视器,对消息加工处理。然后将消息分配到对应的消息处理器上•消息处理器:处理特定类型的消息消息处理模块事件记录消息处理模块服务器的实现过程应用服务器网络组件(TCP/UDP)消息分配器加密,解密压缩,解压日志记录消息合法检测消息处理器工厂基于连接池的消息处理器消息处理器2功能服务器网络组件(TCP/UDP)功能插件1功能插件2谢谢