三层架构

作者:Ariel Ortiz Ramirez

起初,只有大型机。每个程序和每份数据都存储在一台全能的机器中。用户只能通过哑终端访问这台中央计算机。(见图 1。)

Three-Tier Architecture

图 1. 大型机架构

在 20 世纪 80 年代,廉价的联网 PC 的出现催生了流行的两层客户端-服务器架构。在这种架构中,有一个应用程序在客户端机器上运行,并与服务器进行交互——最常见的是数据库管理系统(见图 2)。通常,客户端应用程序,也称为胖客户端,包含部分或全部的表示逻辑(用户界面)、应用程序导航、业务规则和数据库访问。每次业务规则被修改时,客户端应用程序都必须被更改、测试和重新分发,即使在用户界面保持不变的情况下也是如此。为了最大限度地减少业务逻辑更改对客户端应用程序的影响,必须将表示逻辑与业务规则分离。这种分离成为三层架构的基本原则。

Three-Tier Architecture

图 2. 两层客户端-服务器架构

在三层架构(也称为多层架构)中,有三个或更多相互作用的层,每一层都有其特定的职责(见图 3)。

Three-Tier Architecture

图 3. 三层架构

  • 第一层:客户端包含表示逻辑,包括简单的控制和用户输入验证。这个应用程序也称为瘦客户端。

  • 第二层:中间层也称为应用服务器,它提供业务流程逻辑和数据访问。

  • 第三层:数据服务器提供业务数据。

以下是三层架构的一些优点:

  • 更容易修改或替换任何层,而不会影响其他层。

  • 分离应用程序和数据库功能意味着更好的负载均衡。

  • 可以在服务器层内强制执行适当的安全策略,而不会妨碍客户端。

理论应用于实践

为了演示这些设计概念,将介绍一个简单的三层“猜词”游戏的总体轮廓(查看存档文件中的源代码)。这个游戏的目的是,以防读者不熟悉它,在犯一定数量的错误之前,尝试一次猜一个字母来猜出一个神秘单词。

Three-Tier Architecture

图 4. 在 Windows 98 中运行的猜词客户端

数据服务器是一台运行 MiniSQL 数据库管理系统的 Linux 机器。数据库用于存储神秘单词。在每局游戏开始时,会随机选择其中一个单词。

在客户端,一个包含在网页中的 Java 小程序(最初从 Web 服务器获得)负责应用程序的图形用户界面(见图 4)。客户端平台可以是任何装有支持小程序的 Web 浏览器的计算机。游戏的逻辑不是由小程序控制的;那是中间层的工作。客户端只负责表示逻辑:获取用户输入,执行一些简单的检查,并绘制结果输出。

中间层的服务器是一个 Java 应用程序,也在 Linux 机器中运行。“猜词”游戏的规则(业务规则)被编码在这一层中。套接字和 JDBC 分别用于通过 TCP/IP 与客户端和数据服务器进行通信。

Three-Tier Architecture

图 5. 硬件节点图

图 5 展示了一个 UML(统一建模语言)部署图,它显示了系统中硬件节点之间的物理关系。

即使所描述的设计给人一种每个层都需要一台不同机器的印象,但所有层(每个层都在不同的进程上运行)都可以在同一台计算机中运行。这意味着完整的应用程序能够在一个带有图形桌面的 Linux 系统中运行,甚至不需要连接到网络!

运行 MiniSQL

MiniSQL 由 Hughes Technologies 开发,是一个速度极快的 DBMS,系统要求非常低。它支持结构化查询语言 (SQL) 的一个相当有用的子集。将其用于商业目的需要购买许可证,但为学术和慈善组织提供免费许可证。

该软件以源代码形式分发,全部捆绑在一个 gzip 压缩的 tar 文件中(目前,最新的分发文件是 msql-2.0.11.tar.gz)。可以从 Hughes Technology 网站(见“资源”)下载。MiniSQL 手册包含所有必要的安装和使用信息,位于文件 msql-2.0.11/doc/manual.ps.gz 和 msql-2.0.11/doc/manual-html/manual.html 中,一旦分发文件被解压。鼓励读者仔细阅读并遵循其中包含的说明。但是,必须注意 MiniSQL 手册中缺少两个重要的细节:

  • 位于 /usr/local/Hughes/msql.conf 文件中的“system”部分有一个名为 Remote_Access 的参数,其默认值为 false。必须将其更改为 true,以便允许从远程系统访问数据库。

  • 与其他服务器守护进程(例如,HTTP Web 服务器)一样,MiniSQL 2.0 服务器(称为 msql2d)应作为后台进程运行。以 root 身份执行以下命令应实现此目的:/usr/local/Hughes/bin/msql2d &

除了数据库服务器之外,MiniSQL 还附带了一些其他有用的实用程序:服务器管理程序、交互式 SQL 监视器、模式查看器、数据转储工具以及表数据导出器和导入器。需要服务器管理程序来创建将包含神秘单词的 Hangman 数据库。必须以 root 身份执行以下命令:

/usr/local/Hughes/bin/msqladmin create hangman
之后,需要创建一个 mystery-words 表。此表将仅包含两列:word(神秘单词或句子)和 category(神秘单词的分类:计算机、动物、电影等),它们都是字符串。此外,应插入几行。交互式 SQL 监视器可用于这两个目的。执行命令
/usr/local/Hughes/bin/msql hangman
进入带有“hangman”数据库的交互式监视器。MiniSQL 提示符应出现。现在可以发出 SQL 查询,后跟“\g”(GO)以指示应将查询发送到数据库服务器。以下是 Hangman 应用程序的 SQL 命令:
create table mystery (word char(40), category char(15))\g
insert into mystery values ('elephant', 'animals')\g
insert into mystery values ('rhinoceros', 'animals')\g
insert into mystery values ('gone with the wind', 'movies')\g
从 Java 程序访问 MiniSQL

应用程序的中间层使用 Blackdown 的 Linux Port Java Development Kit 1.2.2,候选发布版本 4,以及 CIE 的 mSQL-JDBC 驱动程序,用于 JDBC 2.0。Java 教程是学习如何从 Java 程序中访问数据库的众多优秀场所之一;这就是为什么这里只处理访问 MiniSQL 的具体问题。

在尝试从 Java 应用程序访问 MiniSQL 服务器之前,必须安装相应的 JDBC 驱动程序。可以从 The Center for Imaginary Environments 网站(见“资源”)免费下载该驱动程序。分发文件附带了很多内容,但最重要的部分是包含驱动程序本身的 JAR 文件(目前,该文件是 msql-jdbc-2.0b5.jar)。安装驱动程序的最简单方法是将 JAR 文件复制到 /usr/local/jdk1.2.2/jre/lib/ext 目录(需要 root 权限才能将文件复制到此目录)。

为了从 Java 程序加载驱动程序,应执行以下语句:

Class.forName("com.imaginary.sql.msql.MsqlDriver");

当执行此语句时,将建立与数据库服务器的连接(忽略换行):

Connection con = DriverManager.getConnection
 ('jdbc:msql://:1114/hangman');
在 JDBC URL 中,如果 MiniSQL 服务器未在同一台机器上运行,则应使用远程系统的 URL 替换“localhost”。1114 是 MiniSQL 服务器正在监听的默认端口号。可以修改 msql.conf 文件以指定另一个端口号。
结论

三层架构是一种通用且模块化的基础设施,旨在提高可用性、灵活性、互操作性和可扩展性。Linux、Java 和 MiniSQL 的结合为学习如何构建三层架构系统提供了一个有趣的组合。然而,可以使用中间层的组件技术(例如 CORBA(公共对象请求代理体系结构)、EJB(企业 Java Bean)和 DCOM(分布式组件对象模型))来生成比此处介绍的实现更方便的实现。有兴趣的读者应查看这些主题,以更好地了解当前三层架构的功能。

资源

Three-Tier Architecture
电子邮件:aortiz@campus.cem.itesm.mx

Ariel Ortiz Ramirez (aortiz@campus.cem.itesm.mx) 是蒙特雷理工学院和高等教育学院墨西哥州校区计算机科学系的教员。虽然他教授过十几种不同的编程语言近十年,但他个人在用 Scheme 和 Java 编程时更有乐趣(按此顺序)。可以通过 aortiz@campus.cem.itesm.mx 与他联系。

加载 Disqus 评论