ccforward / cc

Code & Blog
1.59k stars 193 forks source link

35.HTTP/2 + Node.js #36

Open ccforward opened 8 years ago

ccforward commented 8 years ago

HTTP/2 + Node.js

HTTP/2是基于Google的SPDY协议为基础开发的新的web协议。HTTP/2算是从1991年以来HTTP的第一次重大升级。

Yahoo 旗下的 Flickr 貌似在2016年7月开始用上了HTTP2,如图

http2

虽然 HTTP/2 是基于 SPDY 协议开发的,但是两者还是有不同点的:

  1. HTTP/2支持明文的HTTP传输,但是SPDY强制要求使用HTTPS
  2. HTTP/2 消息头的压缩算法采用 HPACK,而非 SPDY 采用的 DEFLATE

HTTP2的优势:

因为我们基于node实现的h2用的是spdy模块,所以必须建立在https的基础上,先生成自签名的证书

$ mkdir h2-node
$ cd h2-node
$ openssl genrsa -des3 -passout pass:x -out server.pass.key 2048 
$ openssl rsa -passin pass:x -in server.pass.key -out server.key
$ openssl req -new -key server.key -out server.csr
# ...
# 输入证书相关信息(随意填写)
# ...
$ openssl x509 -req -sha256 -days 365 -in server.csr -signkey server.key -out server.crt
$ rm server.pass.key

初始化 package.json 文件并添加 spdy 和 express 模块

npm init
npm i express spdy --save

新建一个 index.js 文件作为应用入口

const spdy = require('spdy');
const express = require('express');
const path = require('path');
const fs = require('fs');

添加 express 并配置路由

const port = 3000;
const app = express();

app.get('*', (req, res) => {
    res
      .status(200)
      .json({error: 0, msg: "http2 OK"});
})

加载https的证书

const options = {
    key: fs.readFileSync(__dirname + '/server.key'),
    cert:  fs.readFileSync(__dirname + '/server.crt')
}

最后 spdy创建服务器,并加载 ssl 配置和 express 实例

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 然后访问

因为浏览器默认情况下不信任自签名的证书,所以这里点击 继续前往localhost(不安全) 即可

代码地址: https://github.com/ccforward/cc/tree/master/h2-node

jrainlau commented 8 years ago

你好,请问为什么我的chrome浏览器的network选项没有protocol这一列的呢?我的是chrome 54

rccoder commented 8 years ago

@jrainlau

qq20161010-0 2x
jrainlau commented 8 years ago

谢谢!