通过 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 应用程序,能够从一开始就思考采纳三层架构。在当今的容器和云环境中,咱们能够很容易地将不同组件拆散到不同零碎中,而这样做的益处也是很显著的:轻松疾速地构建出更牢靠、更平安、可扩展性更高的应用程序。