广告
返回顶部
首页 > 资讯 > 前端开发 > VUE >如何提升Node.js 服务性能
  • 261
分享到

如何提升Node.js 服务性能

2024-04-02 19:04:59 261人浏览 薄情痞子
摘要

这篇文章给大家介绍如何提升node.js 服务性能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。author如何使用find-my-way 通过 on 方法绑定路由,并且提供了 Htt

这篇文章给大家介绍如何提升node.js 服务性能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

author

如何使用find-my-way 通过 on 方法绑定路由,并且提供了 Http 所有方法的简写。

const router = require('./index')()  router.on('GET', '/a', (req, res, params) => {   res.end('{"message": "GET /a"}') }) router.get('/a/b', (req, res, params) => {   res.end('{"message": "GET /a/b"}') }))

其实内部就是通过遍历所有的 HTTP 方法名,然后在原型上扩展的。

Router.prototype.on = function on (method, path, opts, handler) {   if (typeof opts === 'function') {     // 如果 opts 为函数,表示此时的 opts 为 handler     handler = opts     opts = {}   }   // ... } for (var i in http.METHODS) {   const m = http.METHODS[i]   const methodName = m.toLowerCase()   // 扩展方法简写   Router.prototype[methodName] = function (path, handler) {     return this.on(m, path, handler)   } }

绑定的路由可以通过 lookup 调用,只要将原生的 req 和 res 传入 lookup 即可。

const http = require('http')  const server = http.createServer((req, res) => {   // 只要将原生的 req 和 res 传入 lookup 即可   router.lookup(req, res) })   server.listen(3000)

find-my-way 会通过 req.method/req.url 找到对应的 handler,然后进行调用。

Router.prototype.lookup = function lookup (req, res) {   var handle = this.find(req.method, sanitizeUrl(req.url))   if (handle === null) {     return this._defaultRoute(req, res, ctx)   }   // 调用 hendler   return handle.handler(req, res, handle.params) }

路由的添加和查找都基于树结构来实现的,下面我们来看看具体的实现。

Radix Tree

find-my-way 采用了名为 Radix Tree(基数树) 的算法,也被称为 Prefix Tree(前缀树)。Go  语言里常用的 WEB 框架echo和gin都使用了Radix Tree作为路由查找的算法。

  • 在计算机科学中,基数树,或称压缩前缀树,是一种更节省空间的Trie(前缀树)。对于基数树的每个节点,如果该节点是确定的子树的话,就和父节点合并。

如何提升Node.js 服务性能

Radix Tree

在 find-my-way 中每个 HTTP 方法(GET、POST、PUT ...)都会对应一棵前缀树。

// 方法有所简化... function Router (opts) {   opts = opts || {}   this.trees = {}   this.routes = [] }  Router.prototype.on = function on (method, path, opts, handler) {   if (typeof opts === 'function') {     // 如果 opts 为函数,表示此时的 opts 为 handler     handler = opts     opts = {}   }   this._on(method, path, opts, handler) }  Router.prototype._on = function on (method, path, opts, handler) {   this.routes.push({     method, path, opts, handler,   })   // 调用 _insert 方法   this._insert(method, path, handler)  } Router.prototype._insert = function _insert (method, path, handler) {   // 取出方法对应的 tree   var currentnode = this.trees[method]   if (typeof currentNode === 'undefined') {     // 首次插入构造一个新的 Tree     currentNode = new Node({ method })     this.trees[method] = currentNode   }   while(true) {     // 为 currentNode 插入新的节点...   } }

每个方法对应的树在第一次获取不存在的时候,都会先创建一个根节点,根节点使用默认字符(/)。

如何提升Node.js 服务性能

trees

每个节点的数据结构如下:

// 只保留了一些重要参数,其他的暂时忽略 function Node(options) {   options = options || {}   this.prefix = options.prefix || '/' // 去除公共前缀之后的字符,默认为 /   this.label = this.prefix[0]         // 用于存放其第一个字符   this.method = options.method        // 请求的方法   this.handler = options.handler      // 请求的回调   this.children = options.children || {} // 存放后续的子节点 }

当我们插入了几个路由节点后,树结构的具体构造如下:

router.on('GET', '/a', (req, res, params) => {   res.end('{"message":"hello world"}') }) router.on('GET', '/aa', (req, res, params) => {   res.end('{"message":"hello world"}') }) router.on('GET', '/ab', (req, res, params) => {   res.end('{"message":"hello world"}') })

  如何提升Node.js 服务性能

GET Tree

Node {   label: 'a',   prefix: 'a',   method: 'GET',   children: {     a: Node {       label: 'a',       prefix: 'a',       method: 'GET',       children: {},       handler: [Function]     },     b: Node {       label: 'b',       prefix: 'b',       method: 'GET',       children: {},       handler: [Function]     }   },   handler: [Function] }

如果我们绑定一个名为 /axxx 的路由,为了节约内存,不会生成三个 label 为x 的节点,只会生成一个节点,其 label 为 x,prefix 为  xxx。

router.on('GET', '/a', (req, res, params) => {   res.end('{"message":"hello world"}') }) router.on('GET', '/axxx', (req, res, params) => {   res.end('{"message":"hello world"}') })

 如何提升Node.js 服务性能

GET Tree

Node {   label: 'a',   prefix: 'a',   method: 'GET',   children: {     a: Node {       label: 'x',       prefix: 'xxx',       method: 'GET',       children: {},       handler: [Function]     }   },   handler: [Function] }

插入路由节点

通过之前的代码可以看到, on 方法最后会调用内部的 _insert 方法插入新的节点,下面看看其具体的实现方式:

Router.prototype._insert = function _insert (method, path, handler) {   // 取出方法对应的 tree   var currentNode = this.trees[method]   if (typeof currentNode === 'undefined') {     // 首次插入构造一个新的 Tree     currentNode = new Node({ method })     this.trees[method] = currentNode   }    var len = 0   var node = null   var prefix = ''   var prefixLen = 0   while(true) {     prefix = currentNode.prefix     prefixLen = prefix.length     len = prefixLen     path = path.slice(len)     // 查找是否存在公共前缀     node = currentNode.findByLabel(path)     if (node) {       // 公共前缀存在,复用       currentNode = node       continue     }     // 公共前缀不存在,创建一个     node = new Node({ method: method, prefix: path })     currentNode.addChild(node)   } }

插入节点会调用 Node 原型上的 addChild 方法。

Node.prototype.getLabel = function () {   return this.prefix[0] }  Node.prototype.addChild = function (node) {   var label = node.getLabel() // 取出第一个字符做为 label   this.children[label] = node   return this }

本质是遍历路径的每个字符,然后判断当前节点的子节点是否已经存在一个节点,如果存在就继续向下遍历,如果不存在,则新建一个节点,插入到当前节点。

如何提升Node.js 服务性能

tree

查找路由节点

find-my-way 对外提供了 lookup 方法,用于查找路由对应的方法并执行,内部是通过 find 方法查找的。

Router.prototype.find = function find (method, path, version) {   var currentNode = this.trees[method]   if (!currentNode) return null    while (true) {     var pathLen = path.length     var prefix = currentNode.prefix     var prefixLen = prefix.length     var len = prefixLen     var previousPath = path     // 找到了路由     if (pathLen === 0 || path === prefix) {       var handle = currentNode.handler       if (handle !== null && handle !== undefined) {         return {           handler: handle.handler         }       }     }     // 继续向下查找     path = path.slice(len)     currentNode = currentNode.findChild(path)   } }  Node.prototype.findChild = function (path) {   var child = this.children[path[0]]   if (child !== undefined || child.handler !== null)) {     if (path.slice(0, child.prefix.length) === child.prefix) {       return child     }   }    return null }

查找节点也是通过遍历树的方式完成的,找到节点之后还需要放到 handle 是否存在,存在的话需要执行回调。

关于如何提升Node.js 服务性能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: 如何提升Node.js 服务性能

本文链接: https://www.lsjlt.com/news/74213.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何提升Node.js 服务性能
    这篇文章给大家介绍如何提升Node.js 服务性能,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。author如何使用find-my-way 通过 on 方法绑定路由,并且提供了 HTT...
    99+
    2022-10-19
  • 阿里云服务器性能如何提升
    阿里云服务器性能的提升,需要在以下几个方面进行优化: 数据库优化:优化数据库性能,将数据库查询延迟时间降低,加快访问速度。通过调整查询语句、索引等方式,增加数据的访问效率。 内存优化:内存优化可以提高数据库的读取效率,减少磁盘IO,提高...
    99+
    2023-10-26
    阿里 性能 服务器
  • 如何提升阿里云服务器性能
    1. 优化服务器配置 服务器配置是影响性能的关键因素之一。以下是一些优化服务器配置的方法: 选择适当的实例类型:根据你的需求选择合适的实例类型,包括 CPU、内存、存储和网络带宽等方面的配置。 使用高性能的存储:选择适合你应用需求的存储...
    99+
    2023-10-28
    阿里 性能 服务器
  • 阿里云服务器性能如何提升的
    阿里云服务器性能的提升取决于多个因素,例如服务器硬件配置、操作系统和应用程序、数据访问和存储的方式等。下面是一些可能提升性能的建议: 更换高性能的服务器硬件 阿里云服务器通常采用更高性能的服务器硬件。可以购买更高级别的硬件或将其替换为...
    99+
    2023-10-27
    阿里 性能 服务器
  • 阿里云ECS性能如何提升云计算服务性能?
    随着云计算的发展,越来越多的企业和个人选择使用阿里云ECS(Elastic ComputeService)来满足自己的计算需求。然而,如何提高阿里云ECS的服务性能,是许多用户关心的问题。本文将详细介绍如何提升阿里云ECS的性能,帮助用户...
    99+
    2023-12-15
    性能 阿里 ECS
  • 阿里云服务器升级IO,提升服务器性能
    什么是IO IO(Input/Output)是指计算机与外部设备之间的数据传输。在服务器中,IO通常指硬盘的读写速度。IO速度越快,服务器的性能就越好。 为什么要升级IO 随着业务的发展,服务器的负载也会逐渐增加。如果服务器的IO速度跟不...
    99+
    2023-10-27
    服务器 阿里 性能
  • 如何提升MongoDB的性能
    如何提升MongoDB的性能?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。(1)文档中的_id键推荐使用默认值,禁止向_id中保存自定义的值。...
    99+
    2022-10-18
  • 怎么提升韩国服务器性能
    提升韩国服务器性能的方法:1、采用虚拟化技术,能充分优化每台韩国服务器的性能,最大限度地延长服务器的正常运行时间,且还可以降低开支和节省空间;2、使用管理工具进行服务器管理,如采用DCIM来提升韩国服务器管理效率,实现规划工作负载分配;3、...
    99+
    2022-10-14
  • PHP7性能优化如何提升
    这篇文章主要介绍“PHP7性能优化如何提升”,在日常操作中,相信很多人在PHP7性能优化如何提升问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP7性能优化如何提升”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-21
  • PHP如何提升网站性能
    这篇文章给大家分享的是有关PHP如何提升网站性能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。***条、尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests ) http请求是要开...
    99+
    2023-06-17
  • 如何提升云服务器安全性
    提升云服务器安全性的方法有:1.账号密码保护,设置密码复杂度;2.及时安装系统补丁,避免系统漏洞;3.安装防火墙;4.监测系统日志,检测异常;5.端口管理,关闭不必要端口;6.使用正版软件,避免使用破解版软件;具体分析如下:账号密码保护账号...
    99+
    2022-10-07
  • 阿里jsp云服务器 如何提升网站性能和可用性
    阿里jsp云服务器是阿里巴巴集团推出的一种基于JSP技术的云服务器,以其高性能、高可用性和低成本赢得了广大用户的喜爱。本文将详细介绍如何通过阿里jsp云服务器来提升网站性能和可用性。 一、阿里jsp云服务器的优势 1. 高性能:阿里jsp云...
    99+
    2023-11-16
    可用性 阿里 性能
  • win10 2004游戏性能如何提升
    本篇内容主要讲解“win10 2004游戏性能如何提升”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win10 2004游戏性能如何提升”吧!win10 2004游戏性能怎么样:Windows ...
    99+
    2023-07-01
  • 如何提升 Linux 服务器的安全性
    这篇文章主要介绍“如何提升 Linux 服务器的安全性”,在日常操作中,相信很多人在如何提升 Linux 服务器的安全性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何提升 Linux 服务器的安全性”的疑...
    99+
    2023-06-15
  • PHP服务器如何提升并发能力
    今天就跟大家聊聊有关PHP服务器如何提升并发能力,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。服务器当用户请求过来,由负载均衡器负载到各个服务器上这是一张来自symfony的压测数据...
    99+
    2023-06-15
  • 云服务器仿真设计:提升性能与可靠性
    1. 仿真设计的重要性 云服务器是现代计算领域的重要组成部分,它们为用户提供了高性能、可扩展和可靠的计算资源。在设计和部署云服务器时,仿真设计是一种非常有用的工具。通过仿真设计,可以模拟和评估不同的服务器配置、网络拓扑和负载情况,以优化性...
    99+
    2023-10-27
    可靠性 性能 服务器
  • 低配置电脑如何提升性能
    本篇内容主要讲解“低配置电脑如何提升性能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“低配置电脑如何提升性能”吧!低配置电脑提升性能的方法方法一: 右击桌面此电脑图标,选择“属性”。 在左侧找到...
    99+
    2023-07-01
  • 如何使用JavaScript的Map提升性能
    这篇文章将为大家详细讲解有关如何使用JavaScript的Map提升性能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Map与常规对象有什么不同Map和常规对象主要有2个...
    99+
    2022-10-19
  • 如何使用OPCache提升PHP的性能
    目录什么是 OPcache安装 Opcacheab 测试效果配置参考总结参考文档对于 PHP 这样的解释型语言来说,每次的运行都会将所有的代码进行一次加载解析,这样一方面的好处是代码...
    99+
    2022-11-12
  • 如何使用C++的StringBuilder提升性能
    今天就跟大家聊聊有关如何使用C++的StringBuilder提升性能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。介绍经常出现客户端打电话抱怨说:你们的程序慢如蜗牛。你开始检查可能...
    99+
    2023-06-17
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作