最终项目:构建多线程 Web 服务器
这是一段漫长的旅程,但我们终于到达了本书的结尾。在本章中,我们将一起构建另一个项目,以演示我们在最后几章中涵盖的一些概念,并回顾之前的一些课程。
对于我们的最终项目,我们将制作一个显示“Hello!“的 Web 服务器,在 Web 浏览器中看起来像图 21-1。
以下是构建 Web 服务器的计划:
- 了解一点 TCP 和 HTTP。
- 在套接字(socket)上监听 TCP 连接。
- 解析少量的 HTTP 请求。
- 创建正确的 HTTP 响应。
- 通过线程池(thread pool)提高服务器的吞吐量。
<img alt=“Web 浏览器访问地址 127.0.0.1:8080 的截图,显示一个包含文本内容“Hello! Hi from Rust“的网页” src=“img/trpl21-01.png” class=“center” style=“width: 50%;” />
图 21-1:我们最后的共享项目
在开始之前,我们应该提及两点。首先,我们将使用的方法不是用 Rust 构建 Web 服务器的最佳方式。社区成员已经在 crates.io 上发布了许多生产就绪的 crate,提供了比我们将要构建的更完整的 Web 服务器和线程池实现。然而,我们在本章中的目的是帮助你学习,而不是走捷径。因为 Rust 是一种系统编程语言,我们可以选择我们想要工作的抽象级别,并且可以深入到其他语言中可能或实际无法实现的更低级别。
其次,我们这里不会使用 async 和 await。构建线程池本身就是一个足够大的挑战,更不用说还要构建异步运行时了!然而,我们将指出 async 和 await 可能如何适用于我们将在本章中看到的某些相同问题。最终,正如我们在第 17 章中指出的,许多异步运行时使用线程池来管理工作。
因此,我们将手动编写基础的 HTTP 服务器和线程池,以便你能够了解你将来可能使用的 crate 背后的一般思路和技术。