基于.NET的快速开发框架的设计

2014-07-18 18:50赵英侠吴永波
电脑知识与技术 2014年13期
关键词:软件工程架构框架

赵英侠 吴永波

摘要:应用框架强调的是软件的可重用性和系统的可扩充性,可以缩短大型应用系统开发周期,提高开发质量。可以为快速构建企业级的应用提供强有力的支持。该文根据面向对象设计理念及分层架构设计模式在.net平台上设计开发了一个框架。并对此框架进行了分析总结。

关键词:软件工程;框架;架构

中图分类号:TP301 文献标识码:A 文章编号:1009-3044(2014)13-2996-05

1 背景

软件架构设计是软件开发中至关重要的一环,良好的软件架构是一个软件开发项目成功的保证。系统的设计必须能在一系列变化之后仍然尽可能简单。所以必须为变化而设计。从而设计的目标应该是:灵活性,可扩充性,可移植性。随着系统越来越庞大,特别是企业级的系统,要实现上述的目标越来越困难。分层架构的提出,在很大程度上解决了软件开发中的强耦合问题,也为编写代码清晰、可维护性良好的系统提供了理论基础。目前,典型的分层架构是三层架构,即自底向上依次是数据访问层、业务逻辑层和表示层,这种经典架构经历了时间和实践的检验,被认为是合理、有效的分层设计。实际的项目中,对上述三层会做出进一步的扩展,将原有的三层扩展到七层,即数据访问组件基础层、SQL Server( Oracle) 数据访问层、数据访问抽象工厂层、数据访问接口定义层、业务实体层、业务逻辑层、表示层。在这些层级中真正变化的是表示层即客户端UI和业务逻辑层,而数据库访问层和其它扩充层在本质上没有很大的差别。框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法。框架通过把一些通用的方法例如发送E-mail,压缩文件,提供报表展示,导入导出Excel等做成一个基础类库,提高软件的易用性。通过框架的设计可以建立更加开放的系统,增加代码的重用性,提高了软件的生产效率和质量,使软件设计人员更专注于对领域的了解,可以让那些经验丰富的人员去设计框架和领域构件,而不必限于底层编程。该文正是在此基础提出的一个开发框架。

2 整体架构

图1 快速开发框架 通信图

整个通信过程是请求从,如果有返回值的话,原路返回。通信技术采用的是.net 4.0 WCF,简单高效,可以轻松适应广域网和局域网,一个服务可以同时暴露多个协议给不同的客户端请求。

客户端包括C版winform客户端和B版浏览器,发送请求给中心服务器,中心服务器根据自身的路由表,把请求转发到相应的应用服务器中,同时还做身份验证,缓存管理,日志管理等。应用服务器是具体业务组件的容器,它是一个windows服务,在启动的时候,根据配置文件加载配置中的业务组件到内存中,同时把自己的地址发送给中心服务器缓存。当请求来的时候,在内存中直接调用业务组件,加快了响应速度。业务组件实现了具体的业务逻辑,经过处理后返回给客户端。缓存服务器也是一个业务组件,和一般的业务组件一样配置,在服务启动的时候加载,非常灵活,无需特殊处理。

通信层比一般的3层架构多了一层中心服务器,这样的好处在于截获所有的客户端调用,做一些AOP的处理,还可以做路由。如果某个应用服务器压力过大,部署另外一台应用服务器指向中心服务器,服务启动后就会在中心服务器路由表中添加一条记录,这样当新的请求到来,通过路由算法,就会路由到压力较轻的应用服务器,这样应用服务器可以横向扩展,充分利用硬件的性能。

每一层都有缓存服务器,加快了响应速度,缓存服务器还可以持久化,这样把一些状态在重新启动后保持原样,对一些公共上下文可以保持在不同会话间,不同的进程间同步,即使服务重启后仍然是同步的。

图2是层次图,展示了框架的各种不同层次之间的关系。

图2 框架层次图

3 客户端

客户端提供了一个高内聚低耦合的架构,客户界面的类只需要实现指定的接口,在数据库中配置好菜单,就可以运行。客户端主界面是一个树形结构,多级菜单形成树。菜单是可以在动态修改的,非常灵活。另外,还可以接入旧的系统,只需要实现制定的适配器并在数据库中配置。图3是客户端调用界面。

图3 客户端调用界面

4 中心服务器

中心服务器是一个特殊的角色,客户端的请求都通过中心服务器来转发,同时还处理请求的身份验证,日志管理,缓存管理,权限管理,性能监视的功能。图4中心服务器内部功能。

所有外部的请求来到中心服务器时,首先需要身份认证。它需要一个令牌,这个令牌是客户端合法用户登陆后生成的,中心服务器维护了所有在线用户的信息,外部请求如果没有令牌,则拒绝服务。

合法用户发生请求,还必须通过权限认证。每个合法用户都会赋予一定的权限,客户在登录时候,中心服务器就会过滤客户的权限,只返回给赋予的权限合集给客户端。当请求到来时,还会第二次检测客户是否在授权范围内,如果不是,也拒绝服务。

分布式缓存可以配置为本地缓存或者是分布式缓存。具体缓存的内容在配置文件中配置。过期策略又分为:

表1 分布式缓存过期策略

[序号\&策略名称\&描述\&1\&方法触发\&调用某个方法的时候结果从缓存获取,同时会清除依赖的缓存\&2\&绝对过期时间触发\&用某个方法的结果有一个绝对过期时间,到点就过期了,清除缓存\&3\&滑动过期时间触发\&用某个方法的结果有一个滑动时间,每调用一次过期时间就会顺延,如果间隔时间超过了顺延期,则清除缓存\&4\&文件变动触发\&调用某个方法的结果,依赖某个文件的内容,如果文件变动,则清除缓存\&5\&SQL变动触发\&调用某个方法的结果依赖数据库中的表,如果表记录变动则清除缓存\&]

缓存策略配置好后,中心服务器第一次使用缓存是就会初始化策略,每个请求到来时,会进行如下流程处理(图5所示)。

图5 分布式缓存获取流程图

流程是根据缓存的配置文件确定当前请求是否有配置缓存,如果是,则根据传递的参数获取缓存的键值,根据键值获取缓存,如果缓存为空,则去持久层获取,再更新缓存,如果不为空,则直接返回,减少了与持久层的交互,提升了性能。

路由与负载均衡管理是客户端的请求到来时,请求会自动转发到负载较轻的应用服务器上。由于在应用服务器启动的时候,会向中心服务器注册,报告自己的地址和承载的服务,所以中心服务器会有一份详细的关于所有应用服务器的信息。当请求到来时,会根据负载均衡算法,选择一个负载较轻的应用服务器。这样的结构使得应用服务器可以水平扩展,如果某个应用服务器负担很重,再部署一台新的应用服务器,承载相同的业务,向中心服务器注册即可承载应用,减轻另外一台的压力。负载均衡算法采用2种,最少连接数法和基于CPU,内存,I/O访问加权比较法。

会话管理是在中心服务器维护了所有登陆用户的信息,包括用户的令牌,用户名称,用户的操作,用户登陆时间等,同时开发了一个维护工具,可以清除在线用户,刷新用户登陆时间等。

日志和性能监视是维护功能,主要记录用户的操作日志,以及异常信息,性能监视器还记录了每个请求的处理时间,可以用来分析性能障碍的原因,定位哪个操作引起性能差,为进一步分析服务端提供了依据。

5 应用服务器外壳

应用服务器外壳是一个windows服务,用于承载业务组件,它是一个容器,把业务组件加载到容器中,同时接收中心服务器的请求,根据请求地址,调用具体业务组件,并把上下文和请求参数传递给组件。它的功能有:转发请求,加载IOC容器,注册服务器,保持心跳,动态编译业务组件,异常处理。图6为应用服务器外壳功能图:

图6 应用服务器外壳功能图

转发请求是应用服务器的主要职责,应该服务器外壳本身不处理请求,它把业务组件动态编译后成为一个同一的接口,然后加载到内存中,当请求到来时,根据业务组件配置的服务名找到对应的业务组件,传递上下文和参数到组件,并调用组件服务,最后把组件的处理的结果返回给中心服务器。

IOC容器管理负载加载业务组件的IOC配置,是利用Microsoft Enterprise Lib 5.0 的Unity来加载IOC,可以同时配置多个业务IOC容器,统一加载,业务组件再调用框架提供的IOC类库即可访问IOC内部组件。

注册服务器是向中心服务器注册自己,包括自己的IP地址,协议信息,加载的业务组件服务,同时接收中心服务器返回的应用服务器节点令牌作为自己的唯一标识,此外还接受中心服务器返回的所有应用服务器节点,节点的模块信息和负载信息,所以应用服务器外壳也维护了一份路由表,自己也可以路由到其他节点,无需中心服务器参与,这是多个应用服务器之间调用的基础。

心跳机制是应用服务器每隔指定时间向中心服务器发送消息,告诉中心服务器自己的状态,如果中心服务器长久没有收到应用服务器的报告,则认为该应用服务器没有响应,从路由表中移除它。

动态编译是加载业务组件的核心功能。为了能够快速响应请求,业务组件没有使用普通的反射原理,而是在服务启动的时候把各个业务组件的服务经过动态编译为同一的接口并实例化到内存中。当请求来时根据请求地址找到对应的业务组件后,无需再实例化了,直接可以调用服务,加快了响应的速度。

异常处理是在动态编译中统一处理的。业务组件都会被统一动态编译为实现同一个接口的类,所以很容易的加入了异常处理,异常详细信息记录到日志,并返回给客户端一个异常的ID和简单的提示,不会包含具体的堆栈信息。

6 RESTful 架构服务和代理

REST 即Representational State Transfer的缩写,翻译是"表现层状态转化",如果一个架构符合REST原则,就称它为RESTful架构。它有以下特点:

1)每一个URI代表一种资源;

2)客户端和服务器之间,传递这种资源的某种表现层;

3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

中心服务器就是RESful架构服务,客户端和服务端的交互在请求之间是无状态的,从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,客户端可以缓存数据以改进性能。这样客户端请求的接口只有4个,Get,Put,Delete,Post,加上资源和参数就可以请求所有的服务,非常简单。C版客户端的代理利用HttpClient类来调用Restful服务,B版利用XMLHttpRequest对象请求服务。

7 结论

本文详细介绍了一个基于.Net的快速开发框架的设计,包括客户端框架,客户端代理,中心服务器,应用服务器外壳。阐述了各个组件的功能及其原理。这个框架是基于.Net 4.0 开发的,业务组件完全是自己定制,开发组件时可以利用框架提供的公共类库,完成后配置服务即可宿主到应用服务器中。客户端支持C版和B版,内容定制,C版开发后配置菜单即可运行起来。这个框架已经经过多个项目实践,确实能够加快项目的开发交付,使客户能够快速响应市场的需求。图7是一个系统布署图。

图7

参考文献:

[1] Erich Gamma.可复用面向对象软件的基础[M].李英军,译.北京:机械工业出版社,2007.

[2] 钱乐秋.软件工程[M].北京:清华大学出版社, 2007.

[3] 李红芹.基于三层架构的.NET数据库业务系统开发[J].计算机与现代化,2009(10):120-125.

[4] 窦文琦,孙士学.基于分层架构的WEB系统框架分析[J].电脑技术与知识,2013(9):24.

缓存策略配置好后,中心服务器第一次使用缓存是就会初始化策略,每个请求到来时,会进行如下流程处理(图5所示)。

图5 分布式缓存获取流程图

流程是根据缓存的配置文件确定当前请求是否有配置缓存,如果是,则根据传递的参数获取缓存的键值,根据键值获取缓存,如果缓存为空,则去持久层获取,再更新缓存,如果不为空,则直接返回,减少了与持久层的交互,提升了性能。

路由与负载均衡管理是客户端的请求到来时,请求会自动转发到负载较轻的应用服务器上。由于在应用服务器启动的时候,会向中心服务器注册,报告自己的地址和承载的服务,所以中心服务器会有一份详细的关于所有应用服务器的信息。当请求到来时,会根据负载均衡算法,选择一个负载较轻的应用服务器。这样的结构使得应用服务器可以水平扩展,如果某个应用服务器负担很重,再部署一台新的应用服务器,承载相同的业务,向中心服务器注册即可承载应用,减轻另外一台的压力。负载均衡算法采用2种,最少连接数法和基于CPU,内存,I/O访问加权比较法。

会话管理是在中心服务器维护了所有登陆用户的信息,包括用户的令牌,用户名称,用户的操作,用户登陆时间等,同时开发了一个维护工具,可以清除在线用户,刷新用户登陆时间等。

日志和性能监视是维护功能,主要记录用户的操作日志,以及异常信息,性能监视器还记录了每个请求的处理时间,可以用来分析性能障碍的原因,定位哪个操作引起性能差,为进一步分析服务端提供了依据。

5 应用服务器外壳

应用服务器外壳是一个windows服务,用于承载业务组件,它是一个容器,把业务组件加载到容器中,同时接收中心服务器的请求,根据请求地址,调用具体业务组件,并把上下文和请求参数传递给组件。它的功能有:转发请求,加载IOC容器,注册服务器,保持心跳,动态编译业务组件,异常处理。图6为应用服务器外壳功能图:

图6 应用服务器外壳功能图

转发请求是应用服务器的主要职责,应该服务器外壳本身不处理请求,它把业务组件动态编译后成为一个同一的接口,然后加载到内存中,当请求到来时,根据业务组件配置的服务名找到对应的业务组件,传递上下文和参数到组件,并调用组件服务,最后把组件的处理的结果返回给中心服务器。

IOC容器管理负载加载业务组件的IOC配置,是利用Microsoft Enterprise Lib 5.0 的Unity来加载IOC,可以同时配置多个业务IOC容器,统一加载,业务组件再调用框架提供的IOC类库即可访问IOC内部组件。

注册服务器是向中心服务器注册自己,包括自己的IP地址,协议信息,加载的业务组件服务,同时接收中心服务器返回的应用服务器节点令牌作为自己的唯一标识,此外还接受中心服务器返回的所有应用服务器节点,节点的模块信息和负载信息,所以应用服务器外壳也维护了一份路由表,自己也可以路由到其他节点,无需中心服务器参与,这是多个应用服务器之间调用的基础。

心跳机制是应用服务器每隔指定时间向中心服务器发送消息,告诉中心服务器自己的状态,如果中心服务器长久没有收到应用服务器的报告,则认为该应用服务器没有响应,从路由表中移除它。

动态编译是加载业务组件的核心功能。为了能够快速响应请求,业务组件没有使用普通的反射原理,而是在服务启动的时候把各个业务组件的服务经过动态编译为同一的接口并实例化到内存中。当请求来时根据请求地址找到对应的业务组件后,无需再实例化了,直接可以调用服务,加快了响应的速度。

异常处理是在动态编译中统一处理的。业务组件都会被统一动态编译为实现同一个接口的类,所以很容易的加入了异常处理,异常详细信息记录到日志,并返回给客户端一个异常的ID和简单的提示,不会包含具体的堆栈信息。

6 RESTful 架构服务和代理

REST 即Representational State Transfer的缩写,翻译是"表现层状态转化",如果一个架构符合REST原则,就称它为RESTful架构。它有以下特点:

1)每一个URI代表一种资源;

2)客户端和服务器之间,传递这种资源的某种表现层;

3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

中心服务器就是RESful架构服务,客户端和服务端的交互在请求之间是无状态的,从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,客户端可以缓存数据以改进性能。这样客户端请求的接口只有4个,Get,Put,Delete,Post,加上资源和参数就可以请求所有的服务,非常简单。C版客户端的代理利用HttpClient类来调用Restful服务,B版利用XMLHttpRequest对象请求服务。

7 结论

本文详细介绍了一个基于.Net的快速开发框架的设计,包括客户端框架,客户端代理,中心服务器,应用服务器外壳。阐述了各个组件的功能及其原理。这个框架是基于.Net 4.0 开发的,业务组件完全是自己定制,开发组件时可以利用框架提供的公共类库,完成后配置服务即可宿主到应用服务器中。客户端支持C版和B版,内容定制,C版开发后配置菜单即可运行起来。这个框架已经经过多个项目实践,确实能够加快项目的开发交付,使客户能够快速响应市场的需求。图7是一个系统布署图。

图7

参考文献:

[1] Erich Gamma.可复用面向对象软件的基础[M].李英军,译.北京:机械工业出版社,2007.

[2] 钱乐秋.软件工程[M].北京:清华大学出版社, 2007.

[3] 李红芹.基于三层架构的.NET数据库业务系统开发[J].计算机与现代化,2009(10):120-125.

[4] 窦文琦,孙士学.基于分层架构的WEB系统框架分析[J].电脑技术与知识,2013(9):24.

缓存策略配置好后,中心服务器第一次使用缓存是就会初始化策略,每个请求到来时,会进行如下流程处理(图5所示)。

图5 分布式缓存获取流程图

流程是根据缓存的配置文件确定当前请求是否有配置缓存,如果是,则根据传递的参数获取缓存的键值,根据键值获取缓存,如果缓存为空,则去持久层获取,再更新缓存,如果不为空,则直接返回,减少了与持久层的交互,提升了性能。

路由与负载均衡管理是客户端的请求到来时,请求会自动转发到负载较轻的应用服务器上。由于在应用服务器启动的时候,会向中心服务器注册,报告自己的地址和承载的服务,所以中心服务器会有一份详细的关于所有应用服务器的信息。当请求到来时,会根据负载均衡算法,选择一个负载较轻的应用服务器。这样的结构使得应用服务器可以水平扩展,如果某个应用服务器负担很重,再部署一台新的应用服务器,承载相同的业务,向中心服务器注册即可承载应用,减轻另外一台的压力。负载均衡算法采用2种,最少连接数法和基于CPU,内存,I/O访问加权比较法。

会话管理是在中心服务器维护了所有登陆用户的信息,包括用户的令牌,用户名称,用户的操作,用户登陆时间等,同时开发了一个维护工具,可以清除在线用户,刷新用户登陆时间等。

日志和性能监视是维护功能,主要记录用户的操作日志,以及异常信息,性能监视器还记录了每个请求的处理时间,可以用来分析性能障碍的原因,定位哪个操作引起性能差,为进一步分析服务端提供了依据。

5 应用服务器外壳

应用服务器外壳是一个windows服务,用于承载业务组件,它是一个容器,把业务组件加载到容器中,同时接收中心服务器的请求,根据请求地址,调用具体业务组件,并把上下文和请求参数传递给组件。它的功能有:转发请求,加载IOC容器,注册服务器,保持心跳,动态编译业务组件,异常处理。图6为应用服务器外壳功能图:

图6 应用服务器外壳功能图

转发请求是应用服务器的主要职责,应该服务器外壳本身不处理请求,它把业务组件动态编译后成为一个同一的接口,然后加载到内存中,当请求到来时,根据业务组件配置的服务名找到对应的业务组件,传递上下文和参数到组件,并调用组件服务,最后把组件的处理的结果返回给中心服务器。

IOC容器管理负载加载业务组件的IOC配置,是利用Microsoft Enterprise Lib 5.0 的Unity来加载IOC,可以同时配置多个业务IOC容器,统一加载,业务组件再调用框架提供的IOC类库即可访问IOC内部组件。

注册服务器是向中心服务器注册自己,包括自己的IP地址,协议信息,加载的业务组件服务,同时接收中心服务器返回的应用服务器节点令牌作为自己的唯一标识,此外还接受中心服务器返回的所有应用服务器节点,节点的模块信息和负载信息,所以应用服务器外壳也维护了一份路由表,自己也可以路由到其他节点,无需中心服务器参与,这是多个应用服务器之间调用的基础。

心跳机制是应用服务器每隔指定时间向中心服务器发送消息,告诉中心服务器自己的状态,如果中心服务器长久没有收到应用服务器的报告,则认为该应用服务器没有响应,从路由表中移除它。

动态编译是加载业务组件的核心功能。为了能够快速响应请求,业务组件没有使用普通的反射原理,而是在服务启动的时候把各个业务组件的服务经过动态编译为同一的接口并实例化到内存中。当请求来时根据请求地址找到对应的业务组件后,无需再实例化了,直接可以调用服务,加快了响应的速度。

异常处理是在动态编译中统一处理的。业务组件都会被统一动态编译为实现同一个接口的类,所以很容易的加入了异常处理,异常详细信息记录到日志,并返回给客户端一个异常的ID和简单的提示,不会包含具体的堆栈信息。

6 RESTful 架构服务和代理

REST 即Representational State Transfer的缩写,翻译是"表现层状态转化",如果一个架构符合REST原则,就称它为RESTful架构。它有以下特点:

1)每一个URI代表一种资源;

2)客户端和服务器之间,传递这种资源的某种表现层;

3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。

中心服务器就是RESful架构服务,客户端和服务端的交互在请求之间是无状态的,从客户端到服务器的每个请求都必须包含理解请求所必需的信息。如果服务器在请求之间的任何时间点重启,客户端不会得到通知。此外,无状态请求可以由任何可用服务器回答,客户端可以缓存数据以改进性能。这样客户端请求的接口只有4个,Get,Put,Delete,Post,加上资源和参数就可以请求所有的服务,非常简单。C版客户端的代理利用HttpClient类来调用Restful服务,B版利用XMLHttpRequest对象请求服务。

7 结论

本文详细介绍了一个基于.Net的快速开发框架的设计,包括客户端框架,客户端代理,中心服务器,应用服务器外壳。阐述了各个组件的功能及其原理。这个框架是基于.Net 4.0 开发的,业务组件完全是自己定制,开发组件时可以利用框架提供的公共类库,完成后配置服务即可宿主到应用服务器中。客户端支持C版和B版,内容定制,C版开发后配置菜单即可运行起来。这个框架已经经过多个项目实践,确实能够加快项目的开发交付,使客户能够快速响应市场的需求。图7是一个系统布署图。

图7

参考文献:

[1] Erich Gamma.可复用面向对象软件的基础[M].李英军,译.北京:机械工业出版社,2007.

[2] 钱乐秋.软件工程[M].北京:清华大学出版社, 2007.

[3] 李红芹.基于三层架构的.NET数据库业务系统开发[J].计算机与现代化,2009(10):120-125.

[4] 窦文琦,孙士学.基于分层架构的WEB系统框架分析[J].电脑技术与知识,2013(9):24.

猜你喜欢
软件工程架构框架
基于FPGA的RNN硬件加速架构
功能架构在电子电气架构开发中的应用和实践
广义框架的不相交性
LSN DCI EVPN VxLAN组网架构研究及实现
WTO框架下
关于如何创新和完善计算机软件工程管理的探讨
一种基于OpenStack的云应用开发框架
一种基于FPGA+ARM架构的μPMU实现