通过经营一家小型酿酒厂来解释 Web 服务器

2025-06-09

通过经营一家小型酿酒厂来解释 Web 服务器

如果您能理解小型啤酒厂的不同输入和输出,那么您就可以理解 Web 服务器的工作原理。

当您刚开始进行 Web 开发时,您可能会想…… “当有人在浏览器中输入https://mysite.com时,所有这些新概念究竟是如何相互联系的?”

当然,您可能知道前端和后端之间的区别,但这只能为您提供高层次的视角。

因此,我想创建一个完整的指南来解释客户端(浏览器)和服务器端(多个服务器)之间的连接。

例如,您知道服务器和数据库之间的区别吗?

实际情况是:客户端-服务器模型的运作方式有点像小型酿酒厂。如果你能理解小型酿酒厂的各个部分,那么你就能理解 Web 服务器的基础知识。

客户端服务器基础知识.png

客户端-服务器模型

在这个小型啤酒厂,你的目标是向酒吧、酒类商店和超市销售大量啤酒。你的客户类型多样,每周或每月都会有大量订单。

这意味着客户会时不时地致电您的销售团队或发送电子邮件提出请求。在互联网上,这被称为客户端。客户端不会与其请求的网络其他成员共享其任何计算能力。它只是请求特定的内容或功能。

另一方面,您的啤酒厂运营团队的存在是为了酿造出满足客户需求的啤酒。在这种情况下,他们就是服务器。这意味着他们等待来自客户的请求,并根据请求使用其计算能力共享适当的资源。

客户端的一个常见示例是 Chrome 之类的 Web 浏览器。服务器位于远程位置,由 Amazon(Amazon Web Services)等公司管理。

客户端服务器ex1

您可能会认为这是一维的,例如“当然,这些是任何购买流程的基础!”但正如您稍后会看到的那样,随着更多参与方的加入,情况可能会变得更加复杂。

请求-响应模型

可以看出,在客户端-服务器模型中,每一方都扮演着不同的角色。客户端是请求者,服务器是响应者。

举个非常简单的例子,超市可能会发送这样的请求:“我们需要 20 箱啤酒。”将来的某个时候,您的小型啤酒厂将发送回复:所请求的啤酒。

reqres1.png

类似地,像 Chrome 这样的浏览器会向中心化服务器发送请求,服务器会返回请求的数据。例如,当你加载像reddit.com这样的页面时,服务器必须根据最新的点赞和评论数据发送新版本的主页。

reqresreal.png

所以你的下一个问题可能是:“互联网如何大规模处理这些请求和响应?”

首先,所有连接到网络(例如互联网)的设备都称为主机。每个主机都有一个唯一的IP 地址用于标识。DNS服务器(一种新型服务器)将像 reddit.com 这样的 URL 连接到特定服务器的 IP 地址。

当你输入像 reddit.com 这样的 URL 时,你并不是直接连接到 reddit 的 Web 服务器。相反,你首先会连接到由托管公司提供的 DNS 服务器。然后,该服务器会使用 reddit 服务器的特定地址来响应你的请求。你的浏览器现在可以向 reddit 的服务器发出请求了。

想象一下,您是一家超市,第一次从一家小型啤酒厂订购啤酒。您不能直接打电话给啤酒厂,命令员工送货上门!相反,您可以联系销售人员或客服人员,他们会帮助您了解物流运作方式——他们使用哪家分销商,送货速度有多快等等。销售人员就像 DNS 服务器一样,因为他们会分享实际完成订单的流程。

接受这些之后,你就可以向专门酿造啤酒的生产团队提出请求了。

dns服务器2

因此,按顺序:

  1. Chrome 等浏览器输入 url reddit.com
  2. 请求发送到 DNS 服务器,该服务器返回 reddit 服务器的 IP 地址
  3. 浏览器现在向 reddit 服务器发出请求
  4. Reddit 服务器响应主页

这有时被称为“关注点分离”——它允许每个服务器执行一个专门的功能,以便每个部分都能最有效地工作。

端口说明

微型啤酒厂不会只处理一种类型的请求!每周,它可能处理:

  • 供应商的账单(例如装瓶公司、啤酒花供应商)
  • 来自客户的订单(如上所述)
  • 新候选人的求职申请

每一种类型的请求都必须转交给啤酒厂的专门人员。

  • 账单发往会计部门
  • 订单发往运营团队
  • 求职申请提交至人力资源部门

端口介绍.png

就像小型酿酒厂一样,服务器有用于处理不同类型请求的路径。这些路径称为端口。一些常见的端口示例包括:

端口 25- SMTP(电子邮件路由)

端口 80-HTTP(如上所述的 Web 请求)

端口 143-IMAP-电子邮件管理

这些端口允许互联网上的主机以标准化的方式进行交互。如果没有通用的服务器配置,互联网就无法像今天这样运行。相反,它会强制使用自定义配置与来自不同公司的服务器进行交互,这将使最终用户更难以像现在这样无缝、顺畅地进行交互。

数据库适合放在哪里?

到目前为止,我们已经介绍了单个请求到 Web 服务器的路径。在前端,你可以用 JavaScript 编写代码,服务器会使用 Python 或 PHP 等语言,或者像 node.js 这样的框架来处理请求。

但我们还没有讲到数据库的真正作用!数据库是用 SQL 或 MongoDB 或其他一系列用于构建关系数据库的语言编写的。但它并不存储在我们目前使用的服务器上!

让我们回到我们的小啤酒厂。酿造啤酒的原材料包括

  • 瓶子
  • 瓶盖
  • 酒花
  • 麦芽

您的啤酒厂可能会在现场储存少量这些原料,但也可能使用外部仓库。例如,您肯定不希望啤酒厂周围堆放成千上万瓶啤酒。那样太过分了。这些原料有点像存储在数据库中的信息。

外部仓库有点像专门运行数据库的服务器,或者说数据库服务器。我们也将此功能分离出来,以尽可能提高效率。

数据库只是存储数据的数字结构。但服务器提供了允许数据库参与网络的所有操作协议。

假设一位客户下了一个大订单,要订购 1000 箱啤酒。小型啤酒厂需要与仓库沟通,以便配送更多啤酒。这又是一个请求-响应周期!

doublereqres

在这种情况下,服务器既充当客户端,又充当服务器。它接收来自最终用户的请求,同时也会将请求发送到另一台服务器。它的响应取决于数据库服务器的响应。

realdoublereqres.png

当然,最终用户看不到这些。从他们的角度来看,他们发送了请求并收到了响应。他们看不到后台的服务器通信。

数据库 + 服务器的真实示例

Heroku是一项云服务,它允许 Web 开发者以尽可能少的代码和持续的管理轻松部署他们的应用。它使用虚拟容器,允许你租用整台服务器的一小部分来运行你的应用。这是另一个教程的主题。

无论如何,Heroku 允许你使用一个简单的命令git push heroku master将最新的提交实时推送到你的虚拟容器。然后,当你从Namecheap等服务购买域名并将其连接到你的 Heroku 应用后,这些更改就会生效。

但是,如果您想在实时应用中使用数据库(您很可能会这么做),您仍然需要为该数据库单独提供一个托管解决方案!我推荐ClearDB,它在 Heroku 的市场中有一个应用。ClearDB 有一个慷慨的免费版本,可以随着数据库的增长而扩展。

因此,如果您使用此堆栈,当最终用户发出需要您访问数据库的请求时,该过程将如下所示。

herokucleardb.png

获取最新教程

你喜欢这个解释吗?查看CodeAnalogies 博客上的其他可视化教程。

鏂囩珷鏉ユ簮锛�https://dev.to/kbk0125/web-servers-explained-by-running-a-microbrewery-48ie
PREV
技术面试方法步骤 1:重申问题步骤 2:澄清您的假设步骤 3:创建测试用例步骤 4/5:讨论/执行强力和/或优化解决方案步骤 6:测试您的测试用例步骤 7:讨论时间/空间复杂度 YMMV 面试准备资源
NEXT
通过烹饪一顿简单的饭菜来解释 JavaScript 中的状态