如何使用Node.js创建负载均衡服务器
如果您的网站或应用程序没有收到很多请求,您不必使用负载均衡,但当它变得非常受欢迎并开始接收大量的流量时,您的底层服务器可能无法处理它。因为单个NodeJS服务器无法灵活处理非常大量的流量。
添加更多机器可以解决这个问题。但为了将流量分配到您所有的应用服务器,需要一个负载均衡器。
负载均衡器: 负载均衡器充当站在您的应用服务器前面的交通警察,将客户端请求路由到能够满足这些请求的所有服务器,并以最大化速度和容量利用率的方式确保没有一个服务器超负荷工作,从而可能降低性能。
如何设置负载均衡服务器?
1. 使用集群模块: NodeJS有一个内置模块叫做 集群模块 ,可以利用多核系统的优势。使用这个模块,您可以为系统的每个核心启动NodeJS实例。主进程在一个端口上监听以接受客户端请求,并使用一些智能的方式分发给工作进程。因此,使用这个模块,您可以利用系统的工作能力。
下面的示例涵盖了使用和不使用集群模块的性能差异。
不使用集群模块:
确保您已安装了express和crypto模块,使用以下命令:
index.js
使用以下命令运行 index.js 文件:
输出: 在终端屏幕上会看到以下输出:
现在打开浏览器并访问 http://localhost:3000/key , 你将看到以下输出:
上述代码监听端口3000,并将作为响应发送公钥。生成RSA密钥是耗费CPU资源的工作。这里仅有一个NodeJS实例在单个核心上工作。为了查看性能,我们使用了 autocannon 工具来测试服务器,如下所示:
上图显示,在连续连接500个并发连接持续10秒时,服务器能够响应2000个请求。平均每秒的请求次数为190.1。
使用Cluster模块:
运行以下命令使用 index.js 文件:
输出: 在终端屏幕上我们将看到以下输出:
现在打开您的浏览器并转到 http://localhost:3000/key , 您将看到以下输出:
上面的NodeJS应用程序在我们系统的每个核心上启动。主进程接受请求并分发给所有工作进程。在这种情况下执行的操作如下所示:
以上图片显示了当服务器以500个并发连接运行10秒时,可以响应5000个请求。平均请求/秒为162.06秒。
因此,使用集群模块可以处理更多的请求。但是,有时这还不够,如果这是您的情况,那么您的选择是水平扩展。
2. 使用 Nginx: 如果您的系统有多个应用服务器需要响应,并且您需要将客户端请求分布到所有服务器上,那么您可以巧妙地使用 Nginx 作为代理服务器。Nginx 位于服务器池的前端,并且使用一些智能的方式分配请求。
在以下示例中,我们在不同的端口上有4个相同的 NodeJS 应用程序实例,您也可以使用另一个服务器。
文件名为 index.js
现在在您的计算机上安装 Nginx,并在 /etc/nginx/conf.d/ 目录下新建一个名为 your-domain.com.conf 的文件,并在该文件中添加以下代码。
3. 使用Express Web Server:
使用Express Web服务器有很多优势。如果你熟悉NodeJS,可以根据以下示例自己实现基于Express的负载均衡器。
步骤1:
创建一个空的NodeJS应用程序。
步骤2: 安装所需的依赖项,如 ExpressJS,axios 和 Concurrently ,使用以下命令:
步骤3: 创建两个文件 config.js 用于负载均衡服务器和 index.js 用于应用服务器。
文件名:config.js
这里,文件名是index.js
说明: 上面的代码使用两个Express应用程序,一个监听3000端口,另一个监听3001端口。独立的负载均衡进程应该在这两个端口之间交替选择,将一次请求发送到3000端口,下一次请求发送到3001端口,然后再将下一次请求发送回3000端口。
第4步: 在你的项目文件夹中打开命令提示符,并使用concurrently同时运行两个脚本。
输出:
我们将在控制台上看到以下输出:
现在,打开浏览器并转到 http://localhost:8080/ ,并进行几个请求,我们将看到以下输出: