随着现代应用程序变得越来越复杂,使用微服务架构成为了越来越流行的选择。微服务架构提供了一种将应用程序分解为小型、独立的服务,每个服务都可以运行在自己的进程中,并通过网络进行通信的方法。这就使得应用程序的开发、部署与扩展变得更为容易。
在这篇文章中,我们将详细介绍如何使用 Node.js 构建微服务应用程序。我们将探讨什么是微服务,并且讨论如何使用 Node.js 构建一个简单的微服务体系结构,并说明如何使用 Docker 和 Kubernetes 部署微服务。
什么是微服务?
微服务是一种将应用程序拆分为多个小型、独立的服务的体系结构。每个服务都可运行在自己的进程中,并可以通过网络进行通信。这样的分解使得应用程序拆分成小块后,更容易通过部署、扩展、更改等方式进行操作。
构建微服务应用程序
在本节中,我们将讨论如何使用 Node.js 构建一个简单的微服务体系结构。
步骤一:建立服务之间的通信
微服务之所以卓有成效,在于它们可独立启动和更新,并能互相协作完成工作。微服务通常都是在不同的进程中运行,必须采用网络协议和数据格式进行通信。
我们可以通过 HTTP REST APIs、gRPC 等方式建立服务之间的通信,但在本例中,我们将使用 Redis 作为独立的消息队列,以进行服务之间的消息传递。
对于这个步骤,我们需要做的是:
安装 Redis,并确保 Redis 正常运行。
使用 Node.js 的 redis 包安装 redis 库,并确保在服务中使用此库可以顺利连接 Redis。
建立基础结构目录。
├───frontend │ ├───docker │ └───src ├───processor │ ├───docker │ └───src ├───queue └───redis
我们将在 frontend、processor 和 redis 目录中创建 Node.js 应用程序,这些应用程序将分别表示前端、处理器和 Redis 消息队列的一部分。
步骤二:编写前端应用程序
我们从编写应用程序的前端部分开始。
前端应用程序将通过 HTTP 调用解决方案,并将消息发布到 Redis 队列,以便由处理器处理。
创建 frontend/src/index.js,并输入以下代码:
-- -------------------- ---- ------- ----- ------- - ------------------- ----- ---------- - ----------------------- ----- ----- - ----------------- -- ------ -- -------- -- ------- --- ----- ------- ----- --- - ---------- ----- ----------- - --------------------- -- ------- ------- ---- -- ---- --------------------------- -- ---- ------- ------- -------------------- ----- ---- -- - -- ------- ------- -- --- ----- ----- ------------------------------- -------------------------- -- ---- -------- -- --- ------ ---------- ------- ---- --- --- -- ----- --- ------ ----- ---- - ---------------- -- ----- ---------------- -- -- ---------------------- -- ---- -----------
在此,我们使用 bodyParser 解析 POST 请求的 JSON 正文,并使用 redis 将消息发布到 Redis 消息队列。请注意,此处我们将请求名称设置为“requests”,以便处理器的订阅器可以找到它。
步骤三:编写处理器应用程序
现在,我们将编写处理器应用程序来接收来自 Redis 队列的消息,并执行适当的逻辑。
处理器应用程序应该:
安装 npm redis 库并确保它可以顺利连接到 Redis。
订阅消息队列并对订阅器使用 message 事件处理程序,该事件处理程序可以执行特定操作(在此例中为 console.log)。
请按照下面的示例编写处理器应用程序。创建 processor/src/index.js:
-- -------------------- ---- ------- ----- ----- - ----------------- -- ------ - ----- ------ ----- ----------- - --------------------- -- --------- -- --- -------- ----- ---------------------------------- -- ----- ------- --- ---- - ------- -- -------- ------------------------- --------- -------- -- - -- --- --- ------- -- --- ------- -------------------- --------- ------------- ---
此处理器应用程序将消息订阅到队列,并针对节点和信息执行特定操作(在此处,我们只是将其记录在控制台中)。
步骤四:设置 Docker 容器和 Kubernetes
我们已经成功创建了前端和处理器服务。现在,我们将使用 Docker 和 Kubernetes 作为容器引擎为这些微服务部署生产容器。此步骤是可选项,但是下面的命令将使用 Docker 和 Kubernetes 构建和部署应用程序。
建立前端应用程序Docker容器
在前端文件夹中,Create a Dockerfile 文件:
-- -------------------- ---- ------- ---- ------- - ------ --- --------- ------- ---- - ------- --- ------------ ---- ------------- -- --- --- ------- - ------ --- ------ ---- - - - ------ --- ---- ------ ---- - --- --- ----------- --- ------- --------
现在,我们可以建立一个 Docker 镜像,并尝试使用 Docker 本地容器运行应用程序(实际使用中是部署到 Kubernetes 集群中):
docker build . -t frontend docker run -p 3000:3000 frontend
在其它终端中使用 curl 测试前端提交 POST 请求是否能够正确连接到 Redis:
curl -X POST \ -H "Content-Type: application/json" \ -d '{"message": "Test message"}' \ http://localhost:3000/request
如果一切正常,此时控制台应该会打印出 Message received:{"message": "Test message"}。
建立处理器应用程序Docker容器
可以建立一个相同的 Docker 镜像,尽管真正的代码可能稍有不同:
-- -------------------- ---- ------- ---- ------- - ------ --- --------- ------- ---- - ------- --- ------------ ---- ------------- -- --- --- ------- - ------ --- ------ ---- - - - --- --- ----------- --- -------- -----------
然后,按照下面的命令开始构建和运行容器:
docker build . -t processor docker run processor
一旦容器正在运行,您就可以在控制台中看到处理器应用程序输出的消息。
部署至Kubernetes
最后,我们将使用 Kubernetes 将处理器应用程序部署到生产环境中的 Kubernetes 集群中。
首先,创建一个 yaml 文件(例如 k8s/deployment.yaml),并输入以下内容:
-- -------------------- ---- ------- ----------- ------- ----- ---------- --------- ----- --------- ----- --------- - --------- ------------ ---- --------- --------- --------- ------- ---- --------- ----- ----------- - ----- --------- ------ --------- ---------------- -----
我们可以将 processor 镜像上传至 Docker hub,或者使用 Kubernetes 的本地镜像存储库。对于本示例,我们使用了 Never 的 imagePullPolicy,表示 Kubernetes 使用本地存储库而非远程拉取镜像。1倍的机器计数最终被部署,保证面前容器副本高可用和冗余。
在此处执行以下命令:
kubectl apply -f k8s/deployment.yaml
部署后,您应该可以查看 Pod 是否正在运行:
kubectl get pods
如果容器正在运行,则可以查看控制台以确保消息被处理正确。
此外,您也可以配置 Kubernetes,在处理器运行时自动缩放节点计数(例如,使用水平自动缩放)。根据特定的需求进行配置。
结论
本文介绍了如何使用 Node.js 构建微服务应用程序的完整指南:了解微服务的定义以及如何使用它们,使用 Redis 作为消息队列,然后简单介绍了使用 Docker 和 Kubernetes 部署微服务的步骤。
这个例子是基本的,实际使用中的情况会更加复杂。不过,学习和了解基础知识有助于更好的理解和扩展。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67501a5dfbd23cf890736095