原文:EasyHTTP/2ServerwithNode.jsandExpress.js作者:AzatMardan代码:http2-expressWhatisHTTP/2forthemodernInternetTCP/IP协议于1975年发布,41年前的技术令人惊叹。自发布以来的大部分时间里,我们都使用HTTP及其后续版本HTTP/1.1进行客户端-服务器通信。它很好地流式传输网络,但如今开发人员构建网站的方式已经发生了巨大变化。有各种指向外部资源的链接,例如图像、CSS文件、JavaScript资源。资源类型的数量只会继续增长。HTTP/2是自1991年发布以来一直表现良好的旧协议HTTP15年来的第一次重大升级变化!它针对现代浏览器进行了优化。性能优越,无需使用域名分片(通过多个域名发送资源)或资源文件合并`(提供一个集成的大资源而不是多个小资源)等复杂行为。HTTP/2是当前网络的新标准,其原型是谷歌的SPDY协议。目前大部分主流浏览器都支持,很多网站已经实现了这个协议。例如,访问雅虎的Flickr就是使用HTTP/2协议(截图于2016年7月)。HTTP/2的优点和注意事项HTTP/2和HTTP/1.1的使用没有区别,类仍然可以在bodyxml语法中使用,使用header协议头域,状态码,cookies,方法,URL等。开发人员熟悉的一切都可以继续在HTTP/2中使用。HTTP/2的优点如下:多路复用:允许浏览器在单个TCP连接中包含多个请求,以便浏览器可以并行请求所有资源;服务器推送:服务器可以在浏览器知道需要资源之前,将其推送给浏览器(如:CSS、JS、Image),从而通过减少请求次数来加快页面加载时间;流优先级:允许浏览器控制资源的加载优先级,例如浏览器在加载其他CSS和JS文件之前请求HTML渲染;头部压缩(Headercompression):HTTP/1.1请求的头部总是重复相同的内容,而HTTP/2则强制对所有请求头部进行去重和压缩;事实上的强制加密:虽然加密不是强制的,但大多数浏览器仅支持HTTP/2overTLS(HTTPS)。虽然HTTP/2还不能完全满足一些需求,但在更好的技术出现之前,这是一个明显的技术进步。让我们来看看作为Web开发人员需要了解的内容。大多数适用于HTTP/1.1的优化技术在HTTP/2中变得多余,其中一些甚至会影响网站在HTTP/2上的性能,例如:资源文件合并;也应该停止使用sprites(图片sprites)、CSS和JS封装,因为只要改动一小部分,就会影响客户端缓存的效果;在HTTP/2协议上,更好的方法是使用多个小文件而不是一个大文件。作者希望Grunt、Gulp、Webpack等前端构建工具因为这个特性而被抛弃。它们使Web开发更加复杂,学习曲线极高,并管理项目依赖性。另一个适用于HTTP/1.1但不适用于HTTP/2的方法是域分片(为了绕过TCP对并行请求数量的限制)。虽然它不一定在所有情况下都有害,但它不再对HTTP/2多路复用传输有益。HTTP/2之所以不推荐域名分片,也是因为每个域名都会带来额外的查询负载。如果确实需要,更好的办法是将多个域名解析到同一个IP,并确保使用通配符证书或集成多个域名的证书,以减少域名查询时间。如果想了解更多关于HTTP/2的介绍,可以看看官网。Node.js构建HTTP/2现在,让我们看看如何使用Node.js构建HTTP/2服务器。部署证书使用自签名SSL证书创建一个新文件夹。$mkdirhttp2-express$cdhttp2-express$opensslgenrsa-des3-passoutpass:x-outserver.pass.key2048...$opensslrsa-passinpass:x-inserver.pass.key-out服务器。keywritingRSAkey$rmserver.pass.key$opensslreq-new-keyserver.key-outserver.csr...CountryName(2lettercode)[AU]:USStateorProvinceName(fullname)[一些-State]:California...Achallengepassword[]:...$opensslx509-req-sha256-days365-inserver.csr-signkeyserver.key-outserver.crt访问服务器时,因为浏览器服务器默认不信任自己颁发的证书,请务必选择“高级”和“继续访问localhost(不安全)”或将localhost设置为不安全访问的例外。通过npm初始化、依赖、入口,初始化项目package.json,安装spdy和express的依赖:npminitnpmiexpressspdy--save创建应用的入口文件index.js,主要用于引用和实例化constport=3000constspdy=require('spdy')constexpress=require('express')constpath=require('path')constfs=require('fs')constapp=express()定义Express.js路由实现Express。jsrouteapp.get('*',(req,res)=>{res.status(200).json({message:'ok'})})设置证书并启动服务器通过fs读取证书。readFileSync()constoptions={key:fs.readFileSync(__dirname+'/server.key'),cert:fs.readFileSync(__dirname+'/server.crt')}然后,将证书选项设置为Express对象:spdy.createServer(options,app).listen(port,(error)=>{if(error){console.error(error)returnprocess.exit(1)}else{console.log('监听端口:'+port+'.')}})最后,节点。启动服务器并查看结果通过浏览器的开发者工具查看协议,就像我们刚才查看雅虎的Flickr协议一样。如您所见,使用Node.js和Express.js以及库node-spdy实现HTTP/2简单易懂。大多数情况下,基本不需要修改你的业务代码。想必你的网站已经使用了HTTPS/SSL(除非你的服务器只提供静态资源,否则你应该使用安全的HTTPS/SSL),即使你不使用HTTP/2,也可以换成HTTP/1.1,使用SPDY。当然,在Node.js环境中,有很多库,不仅仅是提供HTTP/2实现的node-spdy,例如:node-http2EpilogueHTTP/2在不使用复杂优化技术的情况下提供了更多更好的好处。开始享受HTTP/2为您带来的这些好处。期待美好的未来!PS:本文源码地址为http2-express我的博客
