简单来说,架构设计就是一个体现软件系统如何实现的草图,它描述了构成系统的抽象组件,以及各个组件之间是如何进行通信的,这些组件在实现过程中可以被细化为实际的接口、类或者对象。
在《软件架构简介》中,David Garlan认为软件架构设计需要考虑如下问题:“除算法和数据结构之外,设计并确定系统整体结构。结构问题包括总体组织结构、全局控制结构、通信、同步和数据访问的协议等;设计元素的功能分配、物理分布;设计元素的组成;定标与性能要求;备选设计选择等。”
架构和结构不要混淆,IEEE把架构定义为“系统在其环境中的最高层概念”,架构还包括系统完整性、经济约束条件、审美需求和样式等。在Rational Unified Process中对软件架构的解释为:软件架构指系统重要构建的组织或结构,这些重要的构建通过接口与其他构建进行交互。
总体来说,软件架构是对软件系统从整体到部分的描述,从开发到运行再到后期扩展的描述,从性能到安全可靠性的描述等。
1。架构设计五视图
软件系统的架构设计没有标准方法,图2-1所示是一种常用的架构设计五视图模式。
1)物理架构
物理架构的目的是确定物理节点和物理节点间的拓扑结构。其中,物理节点包括服务器、PC、专用机、软件安装部署以及系统软件的选型;拓扑结构明确物理节点之间的关系。
2)运行架构运行架构的目的是确定控制流和控制流组织。其中,控制流包括进程、线程、中断服务程序;控制流组织包括系统的启动与停机、控制流通信、加锁与同步。
3)开发架构
开发架构的目的是确定程序单元以及程序单元的组织结构。其中,程序单元包括源文件、配置文件、程序库、框架、目标单元等;程序单元组织包括Project(项目)划分、Project目录结构、编译依赖关系等。

图2-1 架构设计五视图
4)逻辑架构
逻辑架构的目的是职责划分,并明确职责间的协作关系。其中,职责的划分注意逻辑的分层、子系统以及关键类的定义;协作的定义关注接口的定义与协作关系的明确。
5)数据架构数据架构的目的是确定要存储的数据以及存储格式。其中,存储的数据可以是文件、关系数据库、实时数据库等;存储格式包括文件格式、数据库图表等。
2。开发架构模式选择
在软件架构设计五视图中,开发架构是五视图的核心视图。而在开发架构中,选择何种开发架构模式则是整个项目能否成功的重要因素。
在软件项目中,需求阶段首先考虑的是按照功能进行模块划分,而在开发架构中,首先考虑的则是软件开发结构的纵向分层。
(1)在传统的桌面App系统,常见的分层结构为三层架构模式。
(2)在Java Web系统中,三层架构升级为MVC架构模式和AJAX架构模式。
(3)在Java EE系统中,Web服务器与应用服务器分离,服务层和数据访问层被抽取到应用服务器上,而控制层和视图层则部署在Web服务器上。
(4)SOA架构模式是在Java EE的架构基础上,把公共服务抽取到公用服务器上。
(5)以Dubbo为代表的RPC架构,特点是使用Dubbo的应用服务器来替代Java EE的EJB服务器。
(6)以Spring Cloud为代表的微服务架构,特点是应用服务器对外接口使用HTTP访问。
(7)MOM架构以消息中间件为基础,可以把项目中的同步操作变为异步操作。在大型企业项目架构中,为了承载高并发请求,MOM架构是必不可少的。基于上面的几种架构模式,本章会详细讲解各种开发架构的特点和应用场景。
3。软件三层架构软件
三层架构是最早的软件纵向分层技术,是其他分层技术的基础。早期的软件编程技术,如C语言,它是通过头文件嵌入(Include)和函数名来识别功能模块的,因此函数的名字会很长。
C++语言流行时期,没有非常明确的软件分层技术,因此代码耦合是最让人头疼的事情,尤其是头文件的互相包含问题。ASP是最早期的B/S开发语言,在这个平台上,视图和逻辑完全耦合在了一起,客户端代码与服务器端代码是交织在同一个页面上编程的。
2000年后,软件三层架构的思想才逐渐清晰、明朗。软件纵向分层思想的出现,对后期的软件编程影响深远。传统的软件三层架构模型如图2-2所示。

图2-2 软件三层架构
软件三层架构分为UI层、服务层(或称业务逻辑层)、持久层(注意:实体层对象用于跨层传递数据)。软件三层架构模式主要应用于桌面App系统,即早期的C/S系统的客户端程序使用三层架构模式,代码的可读性、可维护性有了很大的提升。
下面以传统桌面App项目的用户登录(如图2-3所示)为例,演示软件三层架构的应用,这是使用Swing搭建的桌面App系统样式。
要实现桌面App系统的用户登录,操作步骤如下所述。
(1)设计用户表。
此处使用MySQL数据库,创建用户表,其中用户名字段为主键。

图2-3 用户登录窗口

(2)通过创建Package(包)来实现三层架构,如图2-4所示。

图2-4 三层架构分包
(3)Swing搭建主窗口和用户登录窗口(UI层)。
UI层需要使用JFrame创建主窗口,而用户登录窗口是模式对话框。

在模式对话框中,校验用户名、密码不为空后,在UI层调用服务层对象UserBiz,进行用户登录的逻辑校验。

(4)编写用户登录逻辑(服务层)。
服务层的职责是入参校验、业务流程控制、业务规则匹配等,服务层调用持久层对象UserDao进行数据库的访问校验。

(5)编写持久层访问数据库代码(持久层)。
持久层的主要职责就是访问数据库,在Java中使用JDBC来访问关系数据库。持久层的执行结果,会通过User对象返回给调用者UserBiz对象。

(6)实体层。
如图2-2所示,实体层对象用于跨层传递数据。UI层、服务层、持久层代码都可以访问实体层的对象。在用户登录的示例中,持久层登录校验成功,就会创建一个实体对象User,然后User对象的引用会传递给服务层,服务层再传递给UI层。最后,UI层通常会把用户登录后的完整信息(如角色、电话等)存储在本地内存中。
注意:实体对象中只能有属性,不能有方法。另外,实体对象需要实现Serializable接口,这样实体对象就可以序列化或跨网络传输了。

(7)主函数启动。
桌 面 App 系 统 的 运 行 必 须 要 启 动 主 函 数 main() , 在 主 函 数 中 创 建MainFrame对象,从而使整个窗口系统启动运行

4。MVC架构
MVC(Model-View-Controller)架构模式是在三层架构的基础上发展出来的B/S编程架构。Java早期的B/S编程模式是“JSP + JavaBean”的架构模式,这个模式与ASP的编程模式相比有了很大的进步,即把所有的项目代码都进行了视图与逻辑的剥离。但是在“JSP +JavaBean”的编程模式中没有控制器的概念,即Servlet组件的定位是字符流和字节流的输出,而不是控制器。

图2-5 MVC架构
MVC架构如图2-5所示,Servlet组件的定位与传统模式相比发生了很大的变化。在MVC架构中,Servlet组件的核心功能是控制页面的迁移方向,即控制器的作用;JSP的定位是视图,虽然JSP的本质仍然是Servlet,但是在使用时与Servlet的作用截然不同。
最典型的视图是JSP页面,当然还可以是“*.html”页面、FreeMarker模板页面、velocity模板页、PDF页、报表等。
下面以B/S模式的用户登录为例,来讲解MVC架构的特点,操作步骤如下所述。
(1)通过分包来实现MVC架构,如图2-6所示。
(2)新建视图login.jsp页面。
用户登录页在浏览器中的显示样式如图2-7所示,页面代码如下。


图2-6 MVC架构分包

图2-7 MVC用户登录
(3)新建控制器LoginSvl。
根据HTTP的请求方法GET/POST,在控制器中分别使用doGet()转到login.jsp页;使用doPost()方法处理客户端提交的请求信息。

(4)MVC架构的用户登录逻辑层代码和持久层代码与三层架构模式的代码完全相同,此处不再赘述。
(5)控制器转向视图后,从逻辑层返回的实体对象,通过request对象的属性进行传递,在login.jsp中通过EL表达式解析显示。
5。AJAX架构
AJAX(Asynchronous Javascript And XML)是在MVC架构之后产生的新型架构模式。在Web 2.0时代,越来越追求客户请求响应速度与用户体验,因此MVC架构响应速度慢、传输数据量大的缺陷就越来越明显。
AJAX的特点是在客户端浏览器中发起HTTP请求的不再是浏览器本身,而是内置于浏览器中的AJAX引擎(如图2-8所示)。通过AJAX引擎,可以发送异步请求给Web服务器。服务器接收到请求后,回应的数据不再是HTML页面,而是文本信息或JSON数据。AJAX引擎接收到服务器的回应后,不需要刷新整个页面,只需要局部刷新即可。
在AJAX的交互模式下,由于传输数据大幅减少,而且客户端只需要局部刷新,因此页面响应速度大幅提升,用户体验也随之有了明显改善。
下面以用户登录为例,来讲解AJAX架构的特点,操作步骤如下所述。

图2-8 AJAX架构
(1)通过分包来实现AJAX架构,如图2-9所示。
AJAX 架 构 的 分 包 只 有 视 图 层 与 MVC 架 构 有 差 异 , 它 在 视 图 层 使 用login.html作为前端显示页面。JSP页面执行需要翻译、编译过程,速度较慢,而HTML页可以使用缓存,因此login.html登录页面加载速度远快于login.jsp页面。
(2)login.html页面AJAX登录显示效果(如图2-10所示)与MVC登录效果(如图2-7所示)相同,但是实现机制与性能有很大差异。login.html的页面布局代码如下,它与login.jsp相比没有了form标签,提交按钮使用type="button"代替了type="submit"。


图2-9 AJAX架构分包

图2-10 AJAX用户登录
(3)在login.html页面,使用JS脚本调用AJAX引擎,提交异步登录请求。

(4)如图2-8所示,控制器LoginSvl调用逻辑层处理用户登录请求,然后把处理结果使用文本信息或JSON格式,直接返回给客户端的AJAX引擎(MVC架构是页面转向)。

(5)客户端的AJAX引擎接收到服务器回应后,局部刷新页面,显示登录结果或由客户端转向其他页(MVC架构是服务器页面转向,AJAX是客户端页面转向)。

6。前后台分离架构
手机App开发通常采用前后台分离架构。前台页面数据打包成App直接安装在手机上,而业务数据处理在远程服务器端。下面以用户登录为例,来演示前后台分离架构的应用。
以AJAX架构项目为基础,很容易就可以改造成前后台分离的架构模式,操作步骤如下。
(1)使用STS工具新建后台服务,项目名称为UserService(如图2-11所示)。
(2)UserService中没有视图层,控制层、服务层、持久层代码与AJAX架构的后台代码完全相同。
(3)使用HBuilder新建一个前台项目,项目类型为“5+App”(如图2-12所示)。

图2-11 前后台分离架构的后台

图2-12 5+App项目
(4)在HBuilder中编写前台页面login.html,目录结构如图2-13所示,开发环境和样式如图2-14所示,代码如下。

HBuilder中的前台页面login.html与AJAX架构中的login.html的主要区别如下。
(1)手机App中的login.html为本地资源,App打包后会自动部署到手机的App中。而AJAX架构中的login.html是服务器资源,需要浏览器通过HTTP访问后才能在浏览器中显示。
(2)手机App中使用的是内置浏览器,对Cookie等有所限制。
(3)用户登录成功后,手机App转向本地的main.html页。而AJAX架构中的login.html登录成功后,需要远程访问服务器的main.html页。

图2-13 前台目录结构

图2-14 手机App中的用户登录页面
(4)手机App的本地页面迁移,无法通过HTTP参数传递数据,因此使用localStorage或sessionStorage来跨页面传递数据。

本文介绍了软件架构设计的关键要素,包括物理、运行、开发、逻辑和数据五种视图。重点讨论了从传统三层架构到MVC、AJAX和前后台分离等现代架构模式的发展,以及它们在不同场景下的应用和优缺点。
1256

被折叠的 条评论
为什么被折叠?



