ToB企服应用市场:ToB评测及商务社交产业平台

标题: NodeJS 简介:Node js 架构 [打印本页]

作者: 小小小幸运    时间: 2024-8-8 06:41
标题: NodeJS 简介:Node js 架构

概述

Node.js已成为最流行的 Web 开发框架之一。这是因为它具有快速、可扩展和强盛的架构。很多大公司,如Netflix、Uber、Trello、PayPal等,都从Node.js中获益。应用程序的扩展也变得轻易。这都是因为 Node js 遵照的架构模式。
介绍

Node.js是完全免费和开源的。它还被世界各地的大量开发人员使用和支持。Node.js可以称为 Chrome 的 V8 Js 引擎、变乱循环和低级 I/O API 的组合。下图体现了Node.js的体系布局:


Node.js的核心部门是用 C 和 C++ 编写的。Node js 基于单线程变乱循环架构,允许 Node 处置惩罚多个客户端请求。Node js 使用异步模型和非壅闭 I/O 的概念。我们将具体研究这些术语。
Node.js 是其他服务器端平台的最佳选择之一,因为它遵照的架构模式。
Node.js中的单线程变乱循环体系布局

Node.js基于单线程变乱驱动架构。它具有非壅闭 I/O 模型。让我们具体看看这些概念:
Node.js是单线程变乱循环

Node.js 中的变乱循环是单线程的。所有请求可以包罗两部门 - 同步和异步。变乱循环或主线程占用同步部门,并将异步部门分配给背景线程执行。然后,主线程占用其他请求的同步部门。
例:
  1. [/code]   [code]public class EventLoop {
  2.     while(true) {
  3.         if(Event Queue receives a JavaScript Function Call) {
  4.                        ClientRequest request = EventQueue.getClientRequest();
  5.                 If(request requires BlokingIO or takes more computation time)
  6.                     Assign request to Thread T1
  7.                 Else
  8.                     Process and Prepare a response
  9.         }
  10.     }
  11. }
复制代码
   节点具有非壅闭 I/O 模型

Node.js 中的主线程将耗时的异步操作分配给背景线程。它不会等待背景线程完成该操作;它占用变乱队列中的下一个操作。
主线程仅处置惩罚每个请求的同步部门。背景线程完成异步使命后,会关照主线程继续执行该操作,以便进一步执行回调代码。因此,在异步操作执行 I/O 时,主线程不会被壅闭。
文件体系模块的示例。以下是制止操作的示例:
  1. [/code]   [code]const fs = require('fs');
  2. const data = fs.readFileSync('/file.txt'); <em>// blocks here until file is read</em>
  3. console.log('Node.js Architecture'); <em>// Will execute after the file is read.</em>
复制代码
   体现非壅闭的上述代码的异步版本:
  1. [/code]   [code]const fs = require('fs');
  2. fs.readFile('/file.txt', (err, data) => {
  3.   if (err) throw err;
  4.   console.log(data);
  5. });
  6. console.log('Node.js Architecture'); <em>// Will execute before the file is read.</em>
复制代码
   基于变乱,而不是等待 I/O 操作

在背景运行的线程执行一些异步操作,使用变乱关照主线程。异步使命完成后,需要调用关联的回调函数。如果主线程正忙于执行其他请求,那么每当它变得空闲时,主线程就会对背景线程的变乱关照做出反应。它运行回调代码并将相应发送回客户端。
  1. [/code]   [code]const fs = require('fs');
  2. fs.readFile('/file.txt', (err, data) => {
  3.   if (err) throw err;
  4.   console.log(data);
  5. });
复制代码
   在上面的代码中,读取文件后,会执行关联的回调函数。
Node.js体系布局的组件

让我们逐一看所有组件:




Nodejs Server 的工作流程

使用 Node.js 创建的 Web 服务器的工作流涉及上一节中讨论的所有组件。整个建筑工作如下图所示。



Node.js应用程序架构的最佳实践

归并发布者-订阅者模型

发布/订阅模型是一种消息通报模式,此中组件发布消息,其他组件订阅消息。如许做是为了关照其他人并将数据发送给他们。因此,这个通讯体系涉及两个组成部门——发布者和订阅者。


消息由发布者通过指定的渠道发送,而订阅者或吸收端对此一无所知。这些频道另一端的订阅者在发布者不知情的情况下收听这些消息。因此,可以使用此数据共享模型连接多个节点。所有订阅者都可以收听一个操作并做出相应。
现在让我们借助一些示例来理解这个概念。如果我们必须向大量用户发送有关某些变乱的关照,那么可能需要快速向客户端发送消息。这是一个巨大的寻衅。当用户数目扩大时,它会变得更大。当用户处于非运动状态时,用户可能会错过这些消息而不相应它们。因此,它落在体系上,以确保客户端在处于运动状态时吸收消息。
pub/sub 模型允许组件的解耦,并且每个组件都绑定依靠于消息署理。发布者发送消息,客户端订阅它们以吸收来自署理的消息。实现署理是为了保存消息并在客户端联机时通报消息。因此,开发人员无需担心其他组件的接口和布局。这也允许体系的可扩展性。
采用分层方法

express.js的使用允许将应用程序的逻辑轻松分发到各种类别中。通过分别关注点,代码质量得到提高,调试变得更加轻易。该设置将应用程序的逻辑与 API 路由分开,以便背景进程不会变得复杂。 代码分为三类——业务逻辑、数据库和 API 路由。


控制器层:这是定义 API 路由的地方。请求在此处被解构,并根据请求中的信息完成一些处置惩罚。完成的处置惩罚将被收集并通报到服务层。
服务层:此处定义了与应用程序相关的业务逻辑。使用的类和函数包罗在此层中。遵照面向对象编程的 SOLID 原则。各种路由的处置惩罚逻辑也在这个层中。
数据访问层:此层负责数据库处置惩罚。数据库的所有读取、写入或任何其他操作都由该层处置惩罚。此处定义了 SQL 查询、与数据库的连接、文档模型和其他相关代码。
使用依靠注入

依靠关系注入是软件的一种设计模式,此中软件的依靠关系作为参数传入,而不是包罗它们或在软件内部创建依靠关系。这种技术提高了模块的灵活性、独立性、可伸缩性和可重用性。测试也变得轻易。


让我们举个例子来理解这个概念:
  1. [/code]   [code]class PostManager {
  2.   constructor(postStore) {
  3.     this.posts = [];
  4.     this.postStore = postStore;
  5.   }
  6.   getPosts = () => {
  7.     return this.posts;
  8.   };
  9.   loadPosts = async () => {
  10.     let res = await this.postStore.getList();
  11.     this.posts = res;
  12.   };
  13. }
复制代码
   在上面的代码示例中,我们只关注管理帖子,而不是如何存储帖子。获取帖子的依靠项在 PostManager 中通报,并且在使用时无需担心依靠项的内部工作。PostManager 类只需要知道如何使用 postStore。
依靠注入提高了代码的可伸缩性和可理解性。该代码也易于测试。
使用第三方解决方案

Node.js有幸拥有支持它的大型开发人员社区。NPM,即 Node 包管理器,是一个包管理器,可用于轻松地在 Node.js 中安装所有第三方模块。NPM 有很多有据可查和维护的框架。使用所有这些使开发变得非常轻易,开发人员可以更专注于逻辑部门。
其他一些也可以提供帮助的Node.js库包罗:

有几个第三方模块可用。但应该巧妙地使用它们。过度使用或依靠这些模块是不好的,因为它可能会影相应用程序的安全性。别的,它们可能会在项目中引入大量依靠项。
应用同一的文件夹布局

我们已经讨论了分层布局。将代码分别为各种模块有助于使调试和测试变得轻易。它还促进了可重用性。
以下是在 Node.js 中设置新应用程序时应遵照的根本文件夹布局:


控制器层是 API 目录,服务层是 Services 目录,数据访问层是 Models 目录。/config 存储情况变量,而 /scripts 存储工作流主动化脚本。/test 目录包罗测试用例,/或订阅者将变乱处置惩罚程序存储在 pub/sub 模式中。
使用线框、格式化程序、样式指南和解释举行干净的编码

Linting 和格式化:查抄代码是否存在 bug、错误和其他错误构造的静态代码分析器称为 linter。它们有助于识别我们代码中的错误和其他有害模式。一些例子是 Jslint 和 Eslint。另一方面,格式化程序确保在项目中遵照一致的样式。更漂亮的代码格式化程序是格式化格式化程序的一个例子。Linters 和格式化程序现在在很多 IDE 中都作为插件提供。
风格指南:风格指南有助于遵照顶级开发人员使用的命名约定和其他编码尺度。此中一些例子是谷歌和Airbnb的风格指南。
添加解释:为了使代码更易于其他人阅读和理解,我们必须在项目标每个部门使用解释。它们告诉其他人您在代码的当前部门使用了什么逻辑。解释也是记载作者、功能和其他目标等具体信息的好方法。
通过单位测试、日志记载和错误处置惩罚来纠正错误

单位测试:如许做是为了查抄一个单位或部门代码的准确性和正确性。这有助于淘汰调试时间和本钱。它有助于验证各个单位是否正确执行其使命。 Jest、Mocha 和 Jasmine 是用于此目标的一些框架。
日志记载和错误处置惩罚:错误是程序中发生的问题或故障。它体现有错误信息和可能的修复。很多编程语言都有内置的日志天生器。这些记载体系在开发过程的每个阶段都是必不可少的。
在Node.js中,最常见的日志记载方式是使用 console.log() 函数在控制台中打印信息。
在日志记载过程中查抄了三个重要的流:

处置惩罚错误也是Node.js应用程序开发的重要组成部门。必须妥善解决回调地狱等问题。 应使用会合式错误处置惩罚组件,以避免重复错误。该组件应向管理员发送消息,处置惩罚监督变乱并记载所有内容。必要时应使用 try-catch。
使用设置文件和情况变量

当应用程序被扩展时,就需要每个模块都可以访问的全局变量。我们可以将所有全局变量分隔在 config 文件夹中的一个文件中。所有情况变量都可以保存在 .env 文件中。
API 密钥、数据库暗码和其他此类信息可以通过这种方式存储。它被保存为具有所有情况变量的 .env 文件。
  1. [/code]   [code]DB_HOST=localhost
  2. DB_USER=root
  3. DB_PASS=abc@123
复制代码
   dotenv 包可用于导入所有这些情况变量。如果要举行任何更改,可以在一个地方完成,并将反映在应用程序中。
采用 Gzip 压缩

每当我们必须传输文件时,大文件可能会产生问题。因此,使用文件压缩技术会有所帮助。Gzip 是一种无损压缩机制,可以压缩文件以便快速传输。您可以压缩网页上提供的多媒体文件,以淘汰负载并加速处置惩罚速度。
Express.js有助于轻松实现压缩技术。在Express.js的文档中,建议使用 Gzip 压缩。
结论



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4