每当我们构建一个很棒的产品时,我们首先将它独立构建,但迟早它会吸引更多用户,然后我们的大脑开始考虑如何容纳更多用户,并且需要扩展应用程序。通常,扩展意味着为应用程序提供更大的弹性,使其能够承受大量用户并平稳运行而不会出现任何故障。
软件可扩展性是工具或系统根据用户需求增加其容量和功能的属性。可扩展的软件可以在适应变化、升级、大修和资源减少的同时保持稳定
因此,我们需要正确的软件协议和硬件来满足每分钟的大量请求 (RPM)。软件应用程序可以以一种可以正常工作的方式编写。另一方面,它的编写方式可以考虑到软件的可扩展性、维护性和弹性。
可扩展性可以通过水平或垂直缩放两种方式发生。
垂直扩展意味着为您的服务器增加更多的能力,比如更多的内存,增加 CPU 强度 等等,以便它处理更多的并发请求 ,但是垂直扩展的问题是在某个点上它有一些限制,比如你会进入资源匮乏状态。我们的第二个选项是水平扩展,在多台服务器上运行服务,每当请求到来时,它会在这些服务器之间进行负载平衡并提供响应。有关详细信息,请参阅此视频。
在这篇博客中,我们将主要关注水平扩展,我们将构建一个小型 Node JS 应用程序,然后将其水平扩展。
先决条件:
我创建了一个节点 JS 应用程序,下面是 index.js 文件中编写的代码。
JavaScript
const http = require(‘http’);const port = process.env.PORT || 5000;const os = require(‘os’);const handler = (request, response)=> {if(request.method === ‘GET’ && request.url === ‘/’) { return response.end(`Hello world! My hostname/container ID is: ${os.hostname} and no of core s : ${os.cpus.length}`);}};const server = http.createServer(handler);server.listen(port, ()=> { console.log(`Application listening on port ${port}`);});
在上面的index.js 中, 我创建了一个在5000 端口上运行的简单节点 js 应用程序,为了启动节点 js 服务,只需运行以下命令
壳
node index.js
并且可以通过localhost:5000访问节点服务。
我们确实创建了一个简单的节点 JS 服务,但这里的问题是它对它可以处理的请求数量有限制,如果假设节点服务崩溃了,那么我们的服务将处于我们从未想要的不可访问状态发生。所以为了解决这个问题,我想出了一个处理这个问题的计划,在这里我将容器化应用程序,以便在单个服务器中我们可以运行节点 JS 服务的多个实例,并在实例之上添加一个负载均衡器,因此在接收请求时,负载均衡器将根据负载均衡算法路由到任何可用实例。所以要容器化节点服务,我们需要创建一个镜像并基于创建的镜像启动一个容器。我创建了一个Dockerfile,将从中创建一个 docker 映像。
Dockerfile
FROM node:17-alpine3.14USER rootRUN mkdir /home/appWORKDIR /home/appCOPY — chown=node:node package.json ./RUN npm installCOPY — chown=node:node . .CMD [“node”, “src/index.js”]
运行容器需要以下步骤。
1. 运行docker build --tag="node-app-1" .
2. 运行。 docker run --publish 5000:5000 node-app-1
现在节点服务在容器内运行,可以通过 localhost:5000 访问该服务。
现在我们需要创建多个实例并向它们添加负载均衡器。为了创建多个实例,我们将借助 docker-compose 来帮助我们有效地启动容器并停止它们的容器。对于负载平衡,我将使用 NGINX。现在我们需要创建一个docker-compose.yaml 文件。
有关 docker-compose 的更多信息,请访问官方网站。
在这里,我们从 Nginx 中创建了一个Nginx容器:最新图像引用了这个并创建了一个Nginx.conf文件,我们在其中设置了负载平衡规则,并且当Nginx侦听HTTP 端口 80时,我们的节点应用程序也将侦听端口 80但在内部,它将负载平衡到可用的节点 JS 服务实例。
在这里,我们设置了上游部分,其中我们提到了 4 个服务器实例,并且每当服务器访问 http://localhost:80 时,它都会对请求进行负载平衡。
现在我们几乎已经完成了设置部分,只需要启动服务即可。现在我们需要使用以下命令运行应用程序
docker-compose up -d — 缩放 app=4
上面的命令将创建 4 个 Node App 实例和 Nginx 容器,它们将加载和平衡请求。
哇 !!!现在我们已经成功地扩展了我们的 Node 应用程序,并且请求由任何基于负载均衡器原理的可用 Node 实例提供服务。
整个代码可在Github Repository上找到。https://github.com/piyush-repo/scaling-nodejs-services-loadbalancing
感谢您阅读此博客。保持学习。
谢谢大家阅读,喜欢的朋友请关注点赞转发,带你了解最新技术趋势。
留言与评论(共有 0 条评论) “” |