通过VPC实现网络隔离能在安全性方面带来很多好处,例如实现内部协作以及妥善存储敏感信息。在开发工作方面,网络隔离还可用于实现多层Web应用程序的部署。通过对应用进行分层,我们可以将能够以及不能访问公共互联网的应用划分为不同的片段,例如通常可以通过这种方式将数据库层与公共互联网隔离,同时依然可以从上层拉取补丁和软件更新,而不需要直接访问公共互联网。除了减小攻击面,这种做法还有助于实现多区域部署。
我们可以通过多种方式来运行多层应用,通常只需要依赖一些最基础的形式即可获得最大化的可扩展性、安全性以及可靠性。
三层架构是一种最常见的设计形式,这种形式在云端环境中尤为常见。三层应用程序通常由三个层组成,这些层往往位于不同服务器上,能够分别以高度独立的方式开发和维护。这三层分别是:
- 表示层:管理用户和应用程序间通信的外部接口,通常由Web服务器组成,运行HTML和Web开发代码。
- 应用程序层:一种自定义应用程序,提供了必要的业务逻辑,借此将应用程序“黏合”在一起。
- 数据层:数据库系统,用于存储和检索应用程序中使用的数据。
这三层内容作为独立的服务,需要通过基于网络的API进行通信。出于安全和性能方面的考虑,应用程序层和数据层通常需要位于同一个本地网络中,并且需要放置在同一个防火墙之后,但每一层的分离也使得我们可以将每个组件部署在不同硬件上,甚至部署到不同的地理位置。实际可以实现的灵活性主要取决于应用程序的具体需求。
下图展示了现实世界中一个最基础的三层Web应用程序。表示层的Web服务器在浏览器窗口中为用户提供了交互界面;另一端的数据层则是一个数据库,该数据库可以是一个单独的系统,或是在网络中用一个单一实体所代表的集群。数据库层方面流行的开源选项包括MySQL、MariaDB、PostgreSQL for SQL、MongoDB以及Cassandra for NoSQL等。
图1:三层架构可将Web应用程序拆分为表示层、应用程序层和数据层
Web服务器和数据库之间还有应用程序层,我们的大部分开发工作可能都是围绕这里进行的。应用程序层包含供应用程序实现目标所需的自定义代码和业务逻辑。在前端,Web服务器会将查询发送给应用程序层,随后应用程序层会响应Web服务器,并由Web服务器设置数据格式随后展示给用户。在后端,应用程序层将查询数据库,接收数据,随后处理收到的数据,产生用户需要的信息或结果。
作为一个非常简单的例子,我们可以将数据库想象成存储了公司销售记录的记录册。用户输入请求,希望得到一段时间内某一特定商品在特定地点的平均日销量。Web服务器会将请求发送给应用程序层,应用程序层构造数据库查询,接收原始数据,执行必要的计算,随后将响应发送回Web服务器。
图2:用户向表示层请求一系列信息,应用程序层可将请求转换为数据库查询
对于应用程序层来说,Apache Web服务器可能是最方便的表示层解决方案,而MongoDB可能是最方便的数据层解决方案。而应用程序层的自定义代码通常会使用Python、PHP或Ruby等语言编写。并且在一些现成的编程框架帮助下,我们可以更高效的开始编写自己的代码,例如Python开发可选择Django,Ruby开发可选择Rails,PHP开发可选择Symfony。
理论上,应用程序层可以和表示层结合在一起,为此只需要向Web服务器提供直接查询数据库所需的必要代码,但对于大多数复杂的业务逻辑来说,这种做法并不现实,并且也抵消了应用程序划分所带来的好处。
上文提到的“好处”中最重要的一点是:可以减小攻击面从而提高安全性。如图1所示,三层解决方案最大限度减少了必须放置在防火墙之外的应用程序组件。Web服务器可以通过安全的API进行通信,其他活动都发生在防火墙内部,更重要的是,都发生在私有地址空间中,因此无法通过互联网访问,这样即可遏制包括SQL注入在内的很多隐患,毕竟SQL注入已经是最常见,也最具破坏性的漏洞。好在这些隐患通常可以通过对数据库进行隔离和保护所有直接通信等方式加以遏制。
三层应用程序带来的另一个好处是可靠性。当每一层都运行在单独的服务器上,运行在不同的物理硬件,甚至在完全不同的数据中心内运行时,一层出现的故障就不太可能影响到其他层。这还有助于进一步提高可扩展性。因为这些独立运行的组件也可以独立进行扩展。举例来说,如果数据库访问遇到性能瓶颈,即可向数据库集群添加更多节点,这一过程对整体运行的影响也是最小的。
三层方法还有助于优化开发流程。连接各层的API以一种支持高效分工的方式将不同组件分开,Web开发者和管理员可以操作和管理Web服务器,数据库开发者和管理员可以运行数据库系统。在这两者之间,精通应用程序层所用框架技术的专家可以只专注于应用程序代码。例如在DevOps场景中,应用程序开发者可以用脱机的方式构建并测试新版应用程序代码,并在保证对运行只产生最小影响的前提下轻松更改应用代码。
如果你要着手开发Web应用程序,可以从一开始就考虑采用三层架构。在当今的容器和云环境中,我们可以很容易地将不同组件分离到不同系统中,而这样做的好处也是很明显的:轻松快速地构建出更可靠、更安全、可扩展性更高的应用程序。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。