NodeJs-HTTP/2

 后端   小卒子   2024-09-03 22:03   205
  nodejs

Node.js 的 http2 模块支持 HTTP/2 协议,HTTP/2 是 HTTP 协议的升级版本,旨在提高 Web 性能,通过多路复用、头部压缩和服务器推送等功能优化数据传输。http2 模块在 Node.js v8.4.0 及更高版本中可用,默认处于实验性阶段,但在更高版本中已经稳定。下面是 Node.js http2 模块的相关属性及方法的详细介绍。

1. 引入 http2 模块

首先,需要引入 http2 模块:

const http2 = require('http2');

2. HTTP/2 服务器

2.1 http2.createServer([options][, onRequest])

  • 功能: 创建一个支持 HTTP/2 协议的无加密服务器。
  • 参数:
    • options: 配置对象,可选,用于指定服务器的设置(如超时、允许的请求头、请求头大小限制等)。
    • onRequest: 回调函数,可选,接收 requestresponse 对象,与传统的 HTTP 服务器类似。
const server = http2.createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, HTTP/2!');
});

server.listen(3000, () => {
  console.log('HTTP/2 server running at http://localhost:3000');
});

2.2 http2.createSecureServer([options][, onRequest])

  • 功能: 创建一个支持 HTTP/2 协议的加密服务器(HTTPS)。
  • 参数:
    • options: 配置对象,必须包含 SSL/TLS 证书和私钥。
    • onRequest: 回调函数,可选,接收 requestresponse 对象。
const fs = require('fs');

const server = http2.createSecureServer({
  key: fs.readFileSync('server-key.pem'),
  cert: fs.readFileSync('server-cert.pem')
}, (req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello, Secure HTTP/2!');
});

server.listen(8443, () => {
  console.log('Secure HTTP/2 server running at https://localhost:8443');
});

3. HTTP/2 客户端

3.1 http2.connect(authority[, options][, listener])

  • 功能: 创建一个 HTTP/2 客户端连接。
  • 参数:
    • authority: 目标服务器的 URL。
    • options: 配置对象,可选,用于设置连接的各种选项(如 ALPN 协议、TLS 设置等)。
    • listener: 可选的回调函数,在 connect 事件发生时调用。
const client = http2.connect('https://localhost:8443', {
  ca: fs.readFileSync('server-cert.pem') // 信任自签名证书
});

client.on('connect', () => {
  console.log('Connected to server!');
});

client.on('error', (err) => console.error(err));

4. HTTP/2 流

HTTP/2 使用流来管理客户端和服务器之间的数据传输。一个流可以承载一个请求/响应周期。

4.1 session.request(headers[, options])

  • 功能: 在客户端上启动一个新的 HTTP/2 请求。
  • 参数:
    • headers: 请求头对象,必须包含 :method:path 字段。
    • options: 配置对象,可选,用于设置流选项(如优先级、超时等)。
const req = client.request({ ':method': 'GET', ':path': '/' });

req.on('response', (headers) => {
  console.log('Response headers:', headers);
});

req.on('data', (chunk) => {
  console.log('Response body:', chunk.toString());
});

req.on('end', () => {
  console.log('Response ended.');
  client.close();
});

req.end();

4.2 stream.respond(headers[, options])

  • 功能: 服务器端响应请求,发送响应头。
  • 参数:
    • headers: 响应头对象。
    • options: 配置对象,可选,用于设置流选项。
const server = http2.createServer();

server.on('stream', (stream, headers) => {
  stream.respond({ ':status': 200, 'content-type': 'text/plain' });
  stream.end('Hello, HTTP/2!');
});

server.listen(3000);

4.3 stream.pushStream(headers[, options][, callback])

  • 功能: 服务器端推送数据到客户端(服务器推送)。
  • 参数:
    • headers: 请求头对象。
    • options: 配置对象,可选,用于设置流选项。
    • callback: 回调函数,当流已经创建或发生错误时调用。
server.on('stream', (stream, headers) => {
  stream.respond({ ':status': 200, 'content-type': 'text/html' });
  stream.end('<h1>Hello, HTTP/2!</h1>');

  // 服务器推送
  stream.pushStream({ ':path': '/pushed' }, (err, pushStream) => {
    if (err) throw err;
    pushStream.respond({ ':status': 200, 'content-type': 'text/plain' });
    pushStream.end('This is a pushed resource.');
  });
});

4.4 stream.on(event, listener)

  • 功能: 监听流上的特定事件。
  • 常用事件:
    • 'aborted': 当请求或响应被中止时触发。
    • 'close': 当流关闭时触发。
    • 'data': 当有数据可读时触发。
    • 'end': 当数据流结束时触发。
    • 'error': 当发生错误时触发。
stream.on('data', (chunk) => {
  console.log('Received data:', chunk.toString());
});

stream.on('end', () => {
  console.log('Stream ended.');
});

5. HTTP/2 会话

HTTP/2 会话用于管理客户端与服务器之间的多个流。

5.1 session.settings([settings][, callback])

  • 功能: 设置 HTTP/2 会话的配置。
  • 参数:
    • settings: 一个对象,用于配置会话(如最大帧大小、最大并发流数等)。
    • callback: 设置完成后的回调函数。
client.settings({
  enablePush: true
}, () => {
  console.log('Settings updated.');
});

5.2 session.ping([payload][, callback])

  • 功能: 发送一个 HTTP/2 ping 帧。
  • 参数:
    • payload: 可选的 8 字节数据。
    • callback: 回调函数,在接收到 pong 响应时调用。
client.ping((err, duration) => {
  if (err) throw err;
  console.log(`Ping duration: ${duration}ms`);
});

5.3 session.close([callback])

  • 功能: 优雅地关闭 HTTP/2 会话。
  • 参数:
    • callback: 可选的回调函数,会话关闭时调用。
client.close(() => {
  console.log('Client session closed.');
});

5.4 session.destroy([error][, code])

  • 功能: 强制销毁 HTTP/2 会话。
  • 参数:
    • error: 可选的错误对象,解释销毁的原因。
    • code: 可选的错误代码。
client.destroy(new Error('Something went wrong'));

5.5 session.on(event, listener)

  • 功能: 监听会话上的特定事件。
  • 常用事件:
    • 'close': 当会话关闭时触发。
    • 'connect': 当客户端与服务器成功连接时触发。
    • 'error': 当会话发生错误时触发。
    • 'goaway': 当接收到 GOAWAY 帧时触发,表示服务器要关闭连接。
    • 'ping': 当接收到 ping 帧时触发。
    • 'stream': 当服务器端创建新流时触发。
client.on('error', (err) => {
  console.error('Session error:', err);
});

client.on('goaway', (errorCode, lastStreamID, opaqueData) => {
  console.log('Received GOAWAY frame');
});

6. HTTP/2 状态码和头信息

在 HTTP/2 中,状态码和头信息在处理请求和响应时起着重要作用。

6.1 常见的 HTTP/2 头字段

  • :method: HTTP 方法,例如 GETPOST
  • **`:

path**: 请求的路径,例如 /index.html`。

  • :authority: 请求的主机和端口,例如 example.com
  • :scheme: 请求的协议,例如 https

6.2 设置响应头和状态码

  • 在 HTTP/2 中,响应头和状态码通过 stream.respond() 设置。
stream.respond({
  ':status': 200,
  'content-type': 'text/html'
});

7. 总结

http2 模块为 Node.js 提供了对 HTTP/2 协议的全面支持。通过多路复用、服务器推送、头部压缩等特性,可以显著提升网络性能。理解和使用这些属性和方法可以帮助开发者充分利用 HTTP/2 的优势来构建高效的网络应用。