当前位置: 首页 > 科技观察

如何优化你的Node.jsAPI

时间:2023-03-16 19:52:38 科技观察

先决条件要完全理解本文的内容,你必须了解以下概念:Node.js设置和安装如何使用Node创建API如何使用PostmanJavaScript的async/await工作原理操作API优化到底是什么意思?优化涉及改进API的响应时间。响应时间越短,API越快。在本文中,我将分享一些技巧,帮助您缩短响应时间、减少延迟、管理错误和吞吐量,以及最大限度地减少CPU和内存使用。如何优化Node.jsAPI1。始终使用异步函数异步函数就像JavaScript的核心。因此,优化CPU使用率的最佳方法是编写异步函数来执行非阻塞I/O操作。I/O操作包括读取和写入数据。它可以在数据库、云存储或任何本地磁盘上完成。使用异步函数可以提高I/O密集型应用程序的效率。因为没有阻塞I/O,当一个请求在做输入/输出操作时,CPU可以同时处理多个请求。例如:varfs=require('fs');//执行阻塞I/Ovarfile=fs.readFileSync('/etc/passwd');console.log(file);//执行非阻塞I/Ofs。readFile('/etc/passwd',function(err,file){if(err)returnerr;console.log(file);});使用Node包fs处理文件readFileSync()是一个同步函数,会被执行阻塞线程readFile()是一个异步函数,会立即返回并在后台运行2.避免在API中使用session和cookie,只发送数据在API响应中,当我们使用cookie或session来存储临时状态时,它会使用大量的服务器内存。现在普遍使用无状态API,还有JWT、OAuth等认证机制。身份验证令牌保存在客户端,以便服务器可以管理状态。JWT是用于API身份验证的基于JSON的安全令牌。JWT可以看到,但一旦发送就无法修改。JWT只是一个序列,没有加密。OAuth不是API或服务——相反,它是授权的开放标准。OAuth是获取令牌的一组标准步骤。另外,不要浪费时间使用Node.js提供静态文件。NGINX和Apache在这方面做得更好。使用Node构建API时,不要在响应中发送完整的HTML页面。当仅通过API发送数据时,Node工作得更好。大多数Node应用程序使用JSON数据。3.优化数据库查询优化NodeAPI的一个重要部分是优化查询。特别是对于大型应用程序,我们需要多次查询数据库,因此一次错误的查询会降低应用程序的整体性能。索引是一种通过最小化处理查询所需的磁盘访问次数来优化数据库性能的方法。它是一种数据结构技术,用于快速定位和访问数据库中的数据。索引是使用多个数据库列创建的。假设我们有一个没有索引的数据库模式,数据库包含100万条记录。使用不带索引的模式的简单查找查询将扫描更多记录以查找比带索引的模式匹配的记录。没有索引的查询>db.user.find({email:'ofan@skyshi.com'}).explain("executionStats")有索引的查询>db.getCollection("user").createIndex({"email":1},{"name":"email_1","unique":true}){"createdCollectionAutomatically":false,"numIndexesBefore":1,"numIndexesAfter":2,"ok":1}扫描文件数量不同大大~1038:方法扫描没有索引1039索引14的文件。使用PM2集群模式优化APIPM2是专为Node.js应用程序设计的生产过程管理器。它有一个内置的负载均衡器,允许应用程序在不修改代码的情况下作为多个进程运行。使用PM2时,应用程序停机时间几乎为零。总体而言,PM2确实提高了API性能和并发性。在生产中部署代码并运行以下命令以查看PM2集群如何在所有可用CPU上扩展:pm2startapp.js-i05.ReducingTTFB(TimetoFirstByte)TimetoFirstByte是一种测量模式,用于表示Web服务器或其他网络资源的响应时间。TTFB测量从用户或客户端发出HTTP请求到客户端浏览器接收到页面的第一个字节的时间。不可能让所有用户在他们的浏览器中访问同一个页面都在100毫秒内加载,仅仅是因为服务器和用户之间的物理距离。我们可以通过使用CDN和全球本地数据中心缓存内容来减少第一个字节的时间。这有助于用户以最小的延迟访问内容。您可以从Cloudflare提供的CDN解决方案入手。6.将错误脚本与日志一起使用监控API是否正常工作的最佳方法是记录行为,因此日志记录就派上用场了。一种常见的方法是登录到控制台(使用console.log())。比console.log()更有效的方法是使用Morgan、Buyan和Winston。我将在这里以温斯顿为例。Winstonlogging的使用方法-该功能支持4个日志级别可以自由选择,如:info、error、verbose、debug、silly和warn支持查询日志简单分析可以使用同一个类型进行多个transports的输出捕获和记录uncaughtException可以使用以下命令行设置Winston:npminstallwinston--save下面是使用Winston进行日志记录的基本配置:constwinston=require('winston');letlogger=newwinston.Logger({transports:[newwinston.transports.File({level:'verbose',timestamp:newDate(),filename:'filelog-verbose.log',json:false,}),newwinston.transports.File({level:'error',时间戳:新日期(),文件名:'filelog-error.log',json:false,})]});logger.stream={write:function(message,encoding){logger.info(message);}};7、用HTTP/2代替HTTP除了上面用到的这些技巧,我们还可以用HTTP/2代替HTTP,因为它有以下优点:多路复用标头压缩服务器推送二进制格式它着重于提高性能和解决HTTP问题问题。它使网页浏览更快、更容易,并且消耗更少的带宽。8.并行任务使用async.js来运行任务。并行化任务极大地提高了API的性能,它减少了延迟并最大限度地减少了阻塞操作。并行意味着同时运行多个任务。当您并行化任务时,您不需要控制程序执行的顺序。这是一个使用数组异步并行的简单示例:constasync=require("async");//使用对象而不是数组async.parallel({task1:function(callback){setTimeout(function(){console.log('任务一');回调(null,1);},200);},task2:function(callback){setTimeout(function(){console.log('任务二');回调(null,2);,100);}},function(err,results){console.log(results);//结果等同于:{task2:2,task1:1}});在上面的例子中,我们使用了async.js异步执行两个任务。任务1需要200毫秒才能完成,但任务2不需要等待任务1完成才能执行-它会在设定的100毫秒后执行。并行任务对API的性能有很大影响。它减少了延迟并最大限度地减少了阻塞操作。9、使用Redis缓存应用Redis是Memcached的高级版本。它通过在服务器的主内存中存储和检索数据来优化API响应时间。它提高了数据库查询的性能,还减少了访问延迟。在下面的代码片段中,我们在不使用和使用Redis的情况下调用API并比较响应时间。响应时间的巨大差异~899.37毫秒:方法响应时间没有Redis900mswithRedis0.621ms以下是没有Redis的节点:'usestrict';//定义所有需要的依赖constexpress=require('express');constresponseTime=require('response-time')constaxios=require('axios');//加载Express框架varapp=express();//创建一个在响应头中添加X-Response-Time的中间件应用程序。使用(响应时间());constgetBook=(req,res)=>{让isbn=req.query.isbn;让url=`https://www.googleapis.com/books/v1/volumes?q=isbn:${isbn}`;axios.get(url).then(response=>{letbook=response.data.itemsres.send(book);}).catch(err=>{res.send('你要找的书不是found!!!');});};app.get('/book',getBook);app.listen(3000,function(){console.log('你的节点运行在3000端口!!!')});下面是NodeusingRedis:'usestrict';//定义所有需要的依赖constexpress=require('express');constresponseTime=require('响应时间')constaxios=require('axios');constredis=require('redis');constclient=redis.createClient();//加载Express框架varapp=express();//创建中间件app.use(responseTime())在响应头中添加X-Response-Time;constgetBook=(req,res)=>{letisbn=req.query.isbn;让url=`https://www.googleapis.com/books/v1/volumes?q=isbn:${isbn}`;returnaxios.get(url).then(response=>{letbook=response.data.items;//在缓存中设置string-key:isbn并缓存content:title//设置缓存的过期时间为1hour(60minutes)client.setex(isbn,3600,JSON.stringify(book));res.send(book);}).catch(err=>{res.send('你正在看的书forisnotfound!!!');});};constgetCache=(req,res)=>{letisbn=req.query.isbn;//对照服务器的redisclient.get(isbn,(err,result)=>{if(result){res.send(result);}else{getBook(req,res);}});//检查缓存数据}app.get('/book',getCache);app.listen(3000,function(){console.log('你的节点运行在3000端口!!!'))};总结在本指南中,我们了解了如何优化Node.jsAPI的响应时间。JavaScript严重依赖于函数,因此使用异步函数可以使脚本运行得更快并且不会阻塞。除此之外,我们还可以使用缓存内存(Redis)、数据库索引、TTFB和PM2集群来提高响应速度。最后,请记住注意路由的安全性并尽可能优化它们也很重要。我们不能为了提高API响应能力而牺牲安全性。因此,在Node.js中构建优化的API时,应保留所有标准安全检查。