透过VPC实现网路隔离能在安全性方面带来许多好处,例如实现内部协作以及妥善储存敏感资讯。

在开发工作方面,网路隔离还可用于实现多层Web应用程式的部署。透过对应用程式进行分层,我们可以将能够以及不能存取公共互联网的应用程式划分为不同的片段,例如通常可以透过这种方式将资料库层与公共网路隔离,同时仍可从上层拉取修补程式和软件更新,而不需要直接存取公共互联网。除了减少攻击面,这种做法还有助于实现多区部属。

我们可以透过多种方式来运行多层应用,通常只需要依赖一些最基础的形式即可获得最大化的可扩展性、安全性以及可靠性。三层架构是一种最常见的设计形式,这种形式在云端环境中特别常见。

三层应用程式通常由三个层组成,这些层往往位于不同伺服器上,能够分别以高度独立的方式开发和维护。这三层分别是:

  • **表示层:**管理使用者和应用程式间通讯的外部接口,通常由Web伺服器组成,运行HTML和Web开发程式码。

  • **应用程式层:**一种自订应用程序,提供了必要的业务逻辑,借此将应用程式「黏合」在一起。

  • **资料层:**资料库系统,用于储存和检索应用程式中使用的资料。

  • 这三层内容作为独立的服务,需要透过网路为基础的API进行通讯。出于安全和效能方面的考虑,应用程式层和资料层通常需要位于同一个本地网路中,并且需要放置在同一个防火墙之后,但每一层的分离也使得我们可以将每个元件部署在不同硬体上,甚至部署到不同的地理位置。实际上可以实现的灵活性主要取决于应用程式的特定需求。

    下图展示了现实世界中一个最基础的三层Web应用程式。表示层的网路伺服器在浏览器视窗中为使用者提供了互动介面;另一端的资料层则是资料库,该资料库可以是单独的系统,或是在网路中以单一实体所代表的丛集。资料库层方面流行的开源选项包括MySQL、MariaDB、PostgreSQL for SQL、MongoDB以及Cassandra for NoSQL等。

    图1:三层架构可将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应用程序,可以从一开始就考虑採用三层架构。在当今的容器和云端环境中,我们可以轻鬆地将不同元件分离到不同系统中,而这样做的好处也是很明显的:轻鬆快速地建构出更可靠、更安全、可扩展性更高的应用程式.