在不暴露后端的情况下在前端和后端站点之间进行有效通信

Efficiently communicating between frontend and backend sites without exposing backend

在进一步开发此设计之前,我正在尝试弄清楚我当前的方法是否会导致我在未来遇到性能问题,以及是否有更好的方法来做到这一点。如果我先提供一些设计背景,我认为这最有意义:

当前设计

我目前的环境设计有两个独立的服务器,我们称它们为前端和后端。

  1. 前端

    此服务器对全世界开放。客户访问此站点以查看我们的产品、进行购买,并且很快就能查看他们的帐户相关信息。

  2. 后端

    此服务器是所有信息保存在数据库中的地方。

通讯

前端当前需要访问后端的唯一方式是用户使用他们的许可证进行身份验证并下载我们的产品。为此,前端调用 PHP 脚本,该脚本通过 curl_exec 向后端服务器发送 JSON 请求。来自后端的响应告诉前端如何处理该下载请求(例如许可证无效)。

推理

这样设计的原因是为了避免将后端细节暴露给用户。在客户端,用户看到的只是发送到前端服务器的请求。如果前端服务器遭到破坏,任何阅读前端构建方式的人都无法访问后端数据库,除非他们确切知道要发送到后端的参数 API。即使那样,它也只能访问非常少的信息子集,具体取决于 API 公开的内容。

问题

目前唯一一次发生这种跨服务器通信是在用户尝试使用他们的许可证详细信息下载我们的产品时。相对来说,两台服务器之间通过这个API的流量比较低

我担心的是我想建立一个用户"control panel"。他们可以从这里使用他们的 license/account 登录,他们可以查看他们的有效许可证、访问他们之前下的订单的详细信息等。这已经意味着所有这些信息只能通过后端获得,所以我会需要通过 API 公开它们 - 这很好。这里的问题是,用户通过控制面板发出的每个请求(即使只是刷新页面)都会在两个服务器之间建立大量流量。

问题

从这里开发人员的经验来看,这种通信设计是否可扩展?我担心我正在围绕一个瓶颈进行构建,这只会导致用户界面变慢,因为前端最终会等待它通过隧道传输到后端的大量请求。

你有什么想法?有没有人遇到过类似的挑战?你是如何克服这个挑战的?实现这种要求的最佳做法是什么?我希望这个问题不会太模糊。

我很想听听其他答案,但我会分享我的想法。

首先,让我们呼叫您的服务器:

  1. 应用服务器
  2. 数据库服务器

您似乎担心由于数据库查询量的增加而造成瓶颈。由于您提到这些查询将在页面刷新后执行,很明显您没有使用任何类型的缓存。如果您可以缓存数据库查询并仅在数据发生变化时使缓存无效(即用户的操作导致数据发生变化,因此应该清除缓存)那么您将大大提高性能。

如果任何人获得对您的应用程序服务器的访问权限,他们很可能能够使用您允许应用程序服务器使用的用户访问数据库服务器。您应该尽可能少地授予此用户使用 API 所需的权限。不过,他们可能能够访问很多内容,具体取决于您的 API 允许的内容以及您在应用程序服务器上缓存的内容。

看看 Laravel's cache API,它允许您使用缓存代替数据库查询。如果缓存不存在,将执行数据库查询并缓存。然后,您将根据用户操作删除必要的缓存。您还可以异步重新缓存数据库请求,这样您就不会在响应不需要数据时阻止对客户端的响应。

希望对您有所帮助。


更新:

和你进一步讨论后,我更了解你的困境。您正试图通过要求所有 API 调用在 POST 请求之后执行额外的启动步骤来提高应用程序的安全性。我同意这将成为应用程序扩展的瓶颈,因为您将无法利用缓存,并且每个页面请求都会导致数据库查询。

我在类似的情况下所做的是将应用程序服务器和数据库服务器分开,除了数据库服务器实际上只是一个没有任何logic/scripts的数据库服务器。 PHP,例如,甚至没有安装在数据库服务器上。数据库服务器和应用服务器仅通过专用网络连接,因此数据库服务器只能通过应用服务器访问。已设置安全用户使用远程数据库。

由于我的数据库查询需要很多时间,所以我尽可能缓存。

也可以考虑使用 https://cloudflare.com 它是应用服务器的反向代理,在客户端(浏览器)和您的应用服务器之间增加了另一层。这样,只有 cloudflare 可以访问您的应用服务器,并且只有您的应用服务器可以通过您创建的安全数据库用户访问您的数据库服务器。

我不是数据库专家,但使用 prepared statements 会对你有很大帮助,因为它更安全,而且最好的部分是..

“绑定参数最大限度地减少了服务器的带宽,因为您每次只需要发送参数,而不是整个查询”

希望对您有所帮助!