基于 Node.js 搭建 HTTP/2服务
来源:互联网 发布:中国四大财阀 知乎 编辑:程序博客网 时间:2024/05/21 11:19
上文已经提到了HTTP/2主要利用多路复用传输,头部压缩,服务端推送,可以减少网络延迟对性能带来的影响,优化首次访问速度,提高传输效率。
本文介绍基于Node.js搭建一个简单的HTTP/2应用,以及实现HTTP/2的Server Push特性,来直观的感受一下HTTP/2的特性。
准备SSL证书
- 生成服务器私钥key
# 生成密码文件,省去输入密码openssl genrsa -des3 -passout pass:123456 -out key/server.pass.key 2048 openssl rsa -passin pass:123456 -in key/server.pass.key -out key/server.key
- 生成证书请求文件CSR
openssl req -new -key key/server.key -out key/server.csr
- 生成证书
openssl x509 -req -days 3650 -in key/server.csr -signkey key/server.key -out key/server.crt
Node.js代码实现
- 新建项目
初始化项目并安装spdy和express:
npm init -ynpm i express spdy -D
- 创建入口文件index.js,实例化express和引入spdy
const port = 3000const spdy = require('spdy')const express = require('express')const path = require('path')const fs = require('fs')const app = express()
- 读取证书
const options = { key: fs.readFileSync(__dirname + '/key/server.key'), cert: fs.readFileSync(__dirname + '/key/server.crt')}
- 把证书传入spdy并创建服务
app.get('/', (req, res) => { res.end('hello from http/2')})spdy .createServer(options, app) .listen(port, (error) => { if (error) { console.error(error) return process.exit(1) } else { console.log('Listening on port: ' + port + '.') } })
- 启动服务
$ node index.js
- 浏览器打开页面测试 https://127.0.0.1:3000, 因为我们创建的证书并没有经过CA机构认证,所以会提示页面不安全,点击继续访问即可。 查看网络请求协议可以看到网站使用了HTTP/2(h2)。
到此一个简易的基于Node.js的HTTP/2实现已经完成。 接下来我们看看HTTP/2协议中的Server Push功能。
服务端推送Server Push
为了改善延迟,HTTP/2引入了 Server Push ,这允许服务器在明确的请求之前将资源推送到浏览器。这就允许服务器充分利用空闲的网络来改善加载时间。
添加服务端推送代码:
app.get('/', (req, res) => { var stream = res.push('/main.js', { status: 200, // optional method: 'GET', // optional request: { accept: '*/*' }, response: { 'content-type': 'application/javascript' } }) stream.on('error', function() {}) stream.end(fs.readFileSync('./public/main.js')) res.end(fs.readFileSync('./public/index.html'))})app.use('/', express.static(path.join(__dirname, 'public')))
网络请求可以看到main.js是由推送来的。在请求头部并没有太多的请求信息,因为和HTTP1.1不同,不需要客户端发起请求获取main.js,而是服务端在已经知道一个页面所需要的额外的资源,并且可以在响应初始请求时开始推送这些资源。
几个注意点:
1. 只能推送当前服务器上的资源,无法推送托管在CDN上的资源。
2. 除非客户端确定需要,否则不要推送,浏览器缓存的资源不要再推送。
3. 不要把客户端需要的所有资源的推送,根据实际情况按需推送。
参考资源
- HTTP/2 Push: The details
- HTTP/2 DEMO
- HTTP/2 explained
微信公众号
关注爱又米微信公众号获取更多最新技术文章。
阅读全文
0 0
- 基于 Node.js 搭建 HTTP/2服务
- node.js http服务
- javascript,第一个基于node.js的Http服务
- 使用node.js快速搭建简易本地HTTP服务
- node.js搭建https服务
- node.js 搭建简单服务
- node.js 搭建本地服务
- [译] Node.js, Express.js 搭建 HTTP/2 服务器
- 使用node搭建UDP,TCP,HTTP服务
- 基于Node.js搭建TCP聊天服务器
- 基于Node.js搭建静态服务器
- 使用 Node.js 和 Express.js 搭建简易 HTTP/2 服务器
- <<node.js探秘>>(02).建立一个http站点服务.
- node.js http请求详解和配置服务目录
- Node -- 构建HTTP服务
- Web Server之通过Node.js快速搭建服务
- 用node js 搭建 webrtc 信令服务
- 在云服务器用Node.js搭建个人网站
- Android 开发中的 uid pid tid
- TCP 与UDP 的区别
- 用js写表格,删除行
- 【Java】Java的继承和多态详解
- web.xml加载顺序及Spring包扫描注意
- 基于 Node.js 搭建 HTTP/2服务
- linux下的多进程通信(IPC)原理及实现方案(管道、队列、信号量、共享内存)
- 沟通能力之PPT综合能力方法
- C++ std::string 不可初始化为NULL及基本用法
- [在线Demo]使用Hibernate多租户实现SaaS服务
- 举例说明JMETER的用法-某网站压力测试
- 移动端适配方案
- 安装spark-1.5.0-cdh5.5.2所踩过的坑
- ftp自动上传