使用 Node.js 和 Server-sent Events 实现实时监控系统

使用 Node.js 和 Server-sent Events 实现实时监控系统

前言

在现代的 Web 应用程序中,越来越多的应用需要实时更新数据。例如,您可能正在开发一个销售平台或在线聊天应用程序,需要实时更新用户的订单或聊天记录。为了实现实时更新,您可能已经考虑使用 WebSockets 或长轮询技术,但是这些技术可能需要更复杂的后端处理和网络通信,导致应用程序效率低下和响应时间过长。在这样的情况下,使用 Node.js 和 Server-sent Events 技术可以轻松地实现实时更新,而且代码少、效率高。

Node.js 和 Server-sent Events 简介

Node.js 是一种用于构建高效、可扩展网络应用程序的开源 JavaScript 运行时。Node.js 运行时使用基于事件驱动的非阻塞 I/O 模型,具有出色的性能和可扩展性。不同于传统的基于线程或进程的模型,Node.js 可以在单个线程中处理数万个并发连接,而不会导致资源竞争或死锁。

Server-sent Events(SSE)是一种 HTML5 规范,用于在客户端和服务器之间发送实时事件。与 WebSockets 不同,SSE 协议基于 HTTP/1.1,使用单向连接发送流式文本数据。服务器可以周期性地或基于事件发送更新信息到客户端,而客户端使用 EventSource API 监听服务器发送的事件信息。SSE 协议可以使用标准 HTTP 端口80或443,而且不需要特殊的网络配置或安全协议。

使用 Node.js 和 SSE 技术实现实时监控系统

下面我们将介绍如何使用 Node.js 和 SSE 技术实现一个实时监控系统。该系统可以周期性地获取服务器的 CPU 和内存使用情况,并将信息发送到客户端浏览器,以实时更新监控面板。该系统仅仅需要使用单个 Node.js 服务器,而且不需要复杂的后端处理,仅需少量的代码即可实现。

第一步:环境准备和依赖安装

首先,您需要安装 Node.js 运行时。访问 https://nodejs.org/en/ 下载和安装与您的操作系统相符的 Node.js 版本。

然后,创建一个新的项目文件夹,打开终端并切换到该文件夹,执行以下命令,初始化一个新的 npm 包:

- --- ---- --

接着,安装必要的依赖包:

- --- ------- ------- ----

在这个实例中,我们使用了 Express 库来创建 Web 应用程序,使用了 cors 库来处理跨域资源共享设置。

第二步:创建服务器

在项目文件夹下创建一个名为 server.js 的文件,输入以下代码:

----- ------- - -------------------
----- ---- - ----------------
----- --- - ----------
----- ---- - -----

----------------

---------------- -- -- -
  ------------------- --------- -- ---------------------------
---

以上代码使用 Express 库创建了一个 HTTP 服务器,并将跨域资源共享设置作为中间件启用。在本例中,服务器将在端口 3000 上监听请求。

第三步:生成 SSE

在 server.js 应用程序中,我们需要定义一个 SSE 路由,用于向客户端发送实时更新信息。检测 CPU 和内存使用情况需要使用外部模块,我们可以通过安装和使用 systeminformation 模块来实现。输入以下代码:

- --- ------- -----------------
----- -- - -----------------------------
----- ------- - ---

------------------ ----- ---- -- -
  -- ------ --- --- ---- -------
  -------------------------
  ----------------------------
  ------------------------------

  -- --- -------- -------
  ------------------ -
    --------------- --------------------
    ---------------- -----------
    ------------- -------------
  ---

  -- --- ------ -- --- ----
  ------------------

  -- ------ ------ ---- --- ---- -- -----
  --------------- -- -- -
    ------------------- ------- -----
    ------------------------------------ ---
  ---

  -- ------------ ------ ------- --- ------ -- -------
  ----------------- -- -- -
    ----- --------- --------- - ----- -------------
      -----------------
      ---------
    ---

    ----- ---- - ----------------
      -------- -------------------------------
      --------- ---- - ------------------ - -------------- - ----------------
    ---

    ------------------------ -- -
      ------------------- --------------
    ---
  -- ------
---

以上代码通过定义 /events 路由,设置响应头,打开 SSE 连接,并添加客户端到 clients 列表。使用 systeminformation 模块获取 CPU 使用率和内存使用情况,并将数据以 JSON 字符串的格式发送给客户端。setInterval 函数用于定期更新 metrics 数据,并将其流作为 SSE 事件发送给所有客户端连接。

第四步:创建客户端

在客户端页面中,我们使用 EventSource API 监听服务器发送的 SSE 事件,并将数据更新到监控面板。创建一个名为 index.html 的文件,并输入以下代码:

--------- -----
------
------
  ---------------- ---------- --------------
  --------
    -------- ------------------- -
      ----- ------- - ------------------------------------
      ----- -------- - -------------------------------------
      ----------------- - ------------ - ----
      ------------------ - ------------- - ----
    -

    ----- ------ - --- --------------------------------------------
    ---------------- - ------- -- -
      ----- ---- - -----------------------
      --------------------
    --
  ---------
-------
------
  ------------- ---------- -----------

  -------
    ----
      ------- ----------
      --- -------------------
    -----
    ----
      ---------- -----------
      --- --------------------
    -----
  --------
-------
-------

以上 HTML 页面中使用了 EventSource API 监听服务器发送的事件,并调用更新函数 updateMetrics 来更新监控面板中的 CPU 使用率和内存使用情况。客户端页面将从 http://localhost:3000/events SSE 路由获取更新事件。

第五步:启动服务器

在终端中输入以下命令,启动 Node.js 服务器:

- ---- ---------

您可以打开 http://localhost:3000 查看实时监控面板。如需模拟 CPU 和内存负载,您可以在终端中运行一些费时的命令或工具,例如编译大型程序或使用压缩工具进行大量压缩操作。

总结

使用 Node.js 和 Server-sent Events 技术可以轻松实现实时监控系统,并且代码量少、效率高。Node.js 运行时使用基于事件驱动的非阻塞 I/O 模型,具有出色的性能和可扩展性。Server-sent Events 是一种 HTML5 规范,用于在客户端和服务器之间发送实时事件。服务器可以周期性地或基于事件发送更新信息到客户端,而客户端使用 EventSource API 监听服务器发送的事件信息。用 systeminformation 模块获取 CPU 使用率和内存使用情况,并将数据以 JSON 字符串的格式发送给客户端。定期更新 metrics 数据,并将其流作为 SSE 事件发送给所有客户端连接。

来源:JavaScript中文网 ,转载请联系管理员! 本文地址:https://www.javascriptcn.com/post/6455fe03968c7c53b094d7d3


猜你喜欢

  • MongoDB 突然停止工作的解决方法

    背景 MongoDB 是一款非常流行的 NoSQL 数据库,它的特点是高性能、高可扩展性、易于开发和维护等。不过有时候你会遇到 MongoDB 突然停止工作的情况,这时候需要进行故障排除和解决问题。

    1 年前
  • 如何在 Jest 中使用 setupFiles 配置文件

    随着前端开发的迅速发展,测试已经成为一个不可或缺的环节。前端框架和库的出现,使得测试变得更加简单、快速和高效。其中 Jest 是一种非常流行的测试框架,它可以轻松地进行单元测试、集成测试和快照测试。

    1 年前
  • LESS 中的自动化工具推荐

    LESS 是一种 CSS 预处理语言,通过 LESS 可以使 CSS 的编写更加高效、灵活和易于维护。随着前端技术的发展,越来越多的自动化工具应运而生,使 LESS 的应用更加普及和便捷。

    1 年前
  • Web 组件:使用 Custom Elements 封装功能

    Web 组件是一种 Web 开发技术,它允许开发者通过封装 HTML、CSS 和 JavaScript 代码来创建一组自定义元素,这些元素可以在网页中被复用。Custom Elements 是 Web...

    1 年前
  • 利用 Headless CMS 来管理网站的多语言内容

    在全球化的互联网时代中,拥有一个多语言网站已经成为越来越多企业的需求。然而,对于前端开发者来说,管理网站上的多语言内容会比较麻烦,而 Headless CMS 则成为了一个高效的解决方案。

    1 年前
  • # 详解 ES12 中全局对象 globalThis

    详解 ES12 中全局对象 globalThis 在过去,JavaScript 中访问全局对象的方法因不同的运行环境而异,例如 Node.js 中的全局对象是 global,而浏览器中的全局对象则是 ...

    1 年前
  • 用 Swagger 实现 RESTful API 文档自动生成

    什么是 Swagger? Swagger 是一种规范和工具集,用于设计、构建、记录和使用 RESTful API。它可以让开发者更方便地了解和使用 API,同时也可以提高团队协作效率。

    1 年前
  • 防止 “this” 指向错误的方法:使用 ES11 中的 “this” 值

    防止 “this” 指向错误的方法:使用 ES11 中的 “this” 值 在 JavaScript 中,“this” 可以说是最具争议的关键字之一。它指的是在函数中引用函数调用的对象,但是在不同的情...

    1 年前
  • ESLint 使用教程:从入门到精通

    在前端开发中,我们经常需要面对代码规范及各种潜在的问题,而 ESLint 就是一个能够帮助我们进行代码规范检测的工具。本文将从入门到精通讲解 ESLint 的使用。

    1 年前
  • ES10 之 Object.fromEntries()

    在 ES8 中,我们得到了一个非常实用的新函数 Object.entries(),它可以将一个对象转换为一个二维数组,其中每个键值对都被转换为一个包含两个元素的数组。

    1 年前
  • Redis 实现分布式锁的方案

    前言 在现代的互联网架构中,微服务和服务化架构极为流行。对于这种架构方式,分布式锁作为保持数据的一致性和完整性的重要手段之一,扮演了非常重要的角色。而 Redis 作为一款高性能的 NoSQL 数据库...

    1 年前
  • ES6 新增的 Array.from 方法详解

    在 ES6 中,新增了许多新的特性和方法,其中一个备受关注的是 Array.from 方法。Array.from 方法的作用是将类似数组的对象或可迭代对象转换成真正的数组。

    1 年前
  • 使用 CSS Grid 解决固定宽度布局的问题

    在前端开发中,我们经常需要使用固定宽度布局来实现网页的排版。但是随着设备尺寸的多样化,固定宽度布局会导致在不同屏幕尺寸下页面显示效果不佳,甚至出现排版混乱的情况。那么,如何解决这个问题呢?本文介绍一种...

    1 年前
  • CSS Flexbox 布局解析:justify-content 属性的作用详解

    CSS Flexbox 布局是前端开发者们经常使用的一种布局方式,它使得网页可以更好地适应不同设备和不同分辨率,更好地分配空间。在 CSS Flexbox 布局中, justify-content 属...

    1 年前
  • 如何基于 Babel 和 ESLint 创建 Vue.js 项目

    Vue.js 是一款流行的 JavaScript 框架,用于构建用户界面和客户端应用程序。该框架旨在简化应用程序的开发和维护。然而,在项目开发过程中,我们可能面临一些挑战,如浏览器不兼容性、代码质量和...

    1 年前
  • Cypress 集成测试与 E2E 测试的区别

    在前端开发中,测试是一个非常重要的环节。常见的测试类型包括单元测试、集成测试和 E2E 测试等。其中,E2E 测试是模拟真实用户场景下的操作,可以全面检查页面功能是否正常。

    1 年前
  • HtmlWebpackPlugin 在 Webpack 中的用法详解

    Webpack 是一个常用的前端构建工具,而 HtmlWebpackPlugin 可以让我们在使用 Webpack 进行开发时,自动生成 HTML 文件,并在其中引入打包生成的 JS 和 CSS 文件...

    1 年前
  • # 选择一个更好的 CSS Reset

    选择一个更好的 CSS Reset 在进行前端网页开发时,我们会使用 CSS Reset 来使不同浏览器的默认样式统一,从而更好的进行页面展示。CSS Reset 已经成为了前端开发必备的一部分。

    1 年前
  • Socket.io 在 React 中的使用指南

    什么是 Socket.io Socket.io 是一个 JavaScript 库,让实时双向通信变得容易。它包含了两个部分:服务器部分和客户端部分。服务器部分运行在 Node.js 环境中,客户端部分...

    1 年前
  • TypeScript 编码建议和最佳实践

    TypeScript 是一门由 Microsoft 推出的开源编程语言,它是 JavaScript 的超集,意味着不仅支持 JavaScript 的所有语法和特性,还额外提供了类型注解、接口、泛型等强...

    1 年前

相关推荐

    暂无文章