如何利用Kubernetes编排实现Node.js程序的微服务化。本文着重介绍了微服务架构的某些细节,微服务其实也适用于Node.js应用程序。本文还介绍了如何利用容器和编排来实现Node.js的微服务化。
如今,大家都在谈论调度,微服务,Docker,以及Kubernetes如何改变编排领域。那么,在生产中部署Node.js应用程序意味着什么?有哪些是值得关注的?
Node.js微服务化
为了理解为什么每个人都想谈论微服务,我们需要了解应用程序开发的前身——The Monolith。
单体应用
如果你的应用程序是单体应用形式的,那么系统的所有代码都在一个代码库中运行,并生成一个入口。一个简单的npm start就可以启动应用程序,Monolith的核心是保持一切在一起运行。
它仍然是应用程序敏捷开发的好选择,但这样做的缺点是当你想要经常发布时,你将不得不重新部署整体,而无法通过仅更换组件来完成部署的更新。
微服务
开发应用程序的另一种方法是将你的代码库分解成较小的块。每个块都是一个服务。所有这些服务将一起为最终用户提供与单块相同的功能。
启动应用程序不仅仅是简单的npm start,你需要独立启动每个服务。当你将你的整体拆分成更小的块或你的应用程序是由不同的服务组成,这就是微服务架构。
至于上行方式,微服务器允许你经常发布,并仅重新部署系统的更改部分。但还存在一个问题,就是如何编排。有效的编排可以使整个流程变得完整而高效。
非单体应用的编排问题
如果你的Node.js应用程序正在使用非单体方法,将多个服务组合到单个应用程序中,则需要一种编排方式。Docker的优势就在这里凸显了!使用容器,你可以隔离每个进程(= service = npm start)并给每个进程自己的事件循环。
Node上的事件循环
所有的Magic 节点都发生在Node的事件循环中。Node正在使用事件驱动的范例来执行事件循环中的所有Magic节点。
在计算机编程中,事件驱动编程是一种编程范例,程序的流程由诸如用户动作,传感器输出或来自其他程序/线程的消息等事件决定。事件驱动的编程是用于图形用户界面和其他应用程序中的主要范例,其中以执行响应输入的某些动作为中心。
一旦检测到事件,就有一个中心机制来侦听事件并调用一个回调函数。这是Node的事件循环的基本原理。
这里有一些伪代码来演示Node的事件循环如何:
Node的事件循环是单线程事件循环。这可能会导致性能问题。例如,当你处于负载状态或负载大量CPU工作时,如何使我们的Node应用程序更具性能?这时候就需要微服务和容器来进行抢救了!
集中化每个服务
在生产中运行微服务的第一步是集中化每个服务。以此Express.JS为例:
要在一个孤立的过程中运行它,我们需要一个Dockerfile来容纳程序:
这时容器最大的好处是你可以通过启动更多容器并在集群周围进行调度来扩展服务和Node的事件循环的方式。例如,如果你的API部分负载较重,则可以扩展该部分并更有效地利用资源。如果压力正常,你可以缩小。
解决方案
正如我们之前所说的那样,将整体拆分成面向服务的体系结构的好处是,每个服务都可以有一个隔离的事件循环。因为每个Node进程都在容器中运行隔离!
当你希望在IT架构的改造中成功使用Node.js,以下四个阶段可以为你提供思路:
**编码你的服务并提交更改;
建立并测试你的服务;
配置你的基础架构;
在生产中部署,运行和维护你的服务。**