我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何提升Node.js 服务性能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何提升Node.js 服务性能

这篇文章给大家介绍如何提升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 服务性能就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何提升Node.js 服务性能

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

下载Word文档

猜你喜欢

阿里云服务器性能如何提升

阿里云服务器性能的提升,需要在以下几个方面进行优化:数据库优化:优化数据库性能,将数据库查询延迟时间降低,加快访问速度。通过调整查询语句、索引等方式,增加数据的访问效率。内存优化:内存优化可以提高数据库的读取效率,减少磁盘IO,提高数据处理的效率。建议使用LVS或GPT等高性能内存来优化内存使用。缓存优化:在数据库查询过程中,可以使用缓存来提高查询的性能。使用缓存可以减少磁盘I/O、减少
2023-10-26

如何提升阿里云服务器性能

1.优化服务器配置服务器配置是影响性能的关键因素之一。以下是一些优化服务器配置的方法:选择适当的实例类型:根据你的需求选择合适的实例类型,包括CPU、内存、存储和网络带宽等方面的配置。使用高性能的存储:选择适合你应用需求的存储类型,如SSD或者NVMeSSD,以提高读写性能。合理分配资源:根据应用的需求,合理分配CPU
如何提升阿里云服务器性能
2023-10-28

PHP函数如何提升服务器性能?

优化服务器性能的 5 个 php 函数:apc:缓存编译后的 php 脚本,提高加载速度。memcached:存储会话数据和频繁访问的数据,减少数据库查询。mysqli_prepare:创建预备语句,减少重复处理和查询时间。array_ch
PHP函数如何提升服务器性能?
2024-04-13

Node.js Redis vs. Node.js:性能提升的最佳途径

Node.js Redis 与 Node.js:性能提升的最佳途径
Node.js Redis vs. Node.js:性能提升的最佳途径
2024-04-03

阿里云ECS性能如何提升云计算服务性能?

随着云计算的发展,越来越多的企业和个人选择使用阿里云ECS(ElasticComputeService)来满足自己的计算需求。然而,如何提高阿里云ECS的服务性能,是许多用户关心的问题。本文将详细介绍如何提升阿里云ECS的性能,帮助用户更好地使用云计算服务。提升阿里云ECS性能的方法:选择合适的实例类型:阿里云提
阿里云ECS性能如何提升云计算服务性能?
2023-12-15

阿里云服务器性能如何提升的

阿里云服务器性能的提升取决于多个因素,例如服务器硬件配置、操作系统和应用程序、数据访问和存储的方式等。下面是一些可能提升性能的建议:更换高性能的服务器硬件阿里云服务器通常采用更高性能的服务器硬件。可以购买更高级别的硬件或将其替换为其他高性能硬件(例如,双路服务器和NVMeSSD),以提升服务器的性能。安装更好的操作系统阿里云服务器通常运行在云环境中,因此应该安装更好的操作系统。可以通过更改虚拟机配置或在操...
2023-10-27

PHP如何提升网站性能

这篇文章给大家分享的是有关PHP如何提升网站性能的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。***条、尽可能的减少 HTTP 的请求数 (Make Fewer HTTP Requests ) http请求是要开
2023-06-17

PHP7性能优化如何提升

这篇文章主要介绍“PHP7性能优化如何提升”,在日常操作中,相信很多人在PHP7性能优化如何提升问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”PHP7性能优化如何提升”的疑惑有所帮助!接下来,请跟着小编一起来
2023-06-21

Node.js Native Addons:C/C++ 的魅力如何提升你的应用性能

Node.js Native Addons 可以通过扩展 C/C 代码的方式提升 Node.js 应用性能,本文将介绍 Native Addons 的工作原理并提供详细的演示代码,帮助您充分利用 C/C 的强大功能。
Node.js Native Addons:C/C++ 的魅力如何提升你的应用性能
2024-02-25

性能巨星:Nest.js 如何提升 Node.js 应用程序的速度

Nest.js 如何提升 Node.js 应用程序的速度
性能巨星:Nest.js 如何提升 Node.js 应用程序的速度
2024-04-03

阿里云学生服务器升级:如何提升性能和稳定性?

简介阿里云学生服务器是一种专门为学生提供的云计算服务,旨在为学生提供高性能、高稳定性的计算资源。然而,随着学生需求的增加和业务的发展,有时候需要对服务器进行升级以满足更高的性能和稳定性要求。本文将介绍如何升级阿里云学生服务器,以提升其性能和稳定性。1.升级硬件配置升级阿里云学生服务器的硬件配置是提升性能和稳定性的重要途
阿里云学生服务器升级:如何提升性能和稳定性?
2024-01-30

Node.js 与 WebAssembly:携手提升性能和效率

Node.js 和 WebAssembly 的协作在 Web 开发中带来巨大的性能提升,通过优化密集型计算、提高应用程序响应速度和增强安全机制,提升开发者的效率和用户体验。
Node.js 与 WebAssembly:携手提升性能和效率
2024-02-19

索引如何提升Oracle OLAP性能

提升Oracle OLAP性能可以通过以下方法来实现:使用合适的硬件:确保服务器配置足够强大,包括CPU、内存和存储资源,以支持大规模OLAP查询和分析。优化索引:创建合适的索引可以大大提升查询性能。在Oracle OLAP中,可以通过创建
索引如何提升Oracle OLAP性能
2024-08-16

win10 2004游戏性能如何提升

本篇内容主要讲解“win10 2004游戏性能如何提升”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“win10 2004游戏性能如何提升”吧!win10 2004游戏性能怎么样:1、Window
2023-07-01

Node.js WebSocket 的性能优化:提升实时体验

提升 Node.js WebSocket 性能优化以改善实时体验
Node.js WebSocket 的性能优化:提升实时体验
2024-03-13

阿里云服务器升级IO,提升服务器性能

什么是IOIO(Input/Output)是指计算机与外部设备之间的数据传输。在服务器中,IO通常指硬盘的读写速度。IO速度越快,服务器的性能就越好。为什么要升级IO随着业务的发展,服务器的负载也会逐渐增加。如果服务器的IO速度跟不上,就会导致服务器响应变慢,甚至出现宕机等问题。因此,升级IO是提升服务器性能的重要手段。如何升级IO阿里云服务器提供了多种升级IO的方式:更换云盘类型:阿里云提供了多种云盘类型...
2023-10-27

编程热搜

目录