Nodejs學習記錄:http模塊

概覽

http模塊源碼: https://github.com/nodejs/nod...html

function createServer(opts, requestListener) {
  return new Server(opts, requestListener);
}

function request(url, options, cb) {
  return new ClientRequest(url, options, cb);
}

function get(url, options, cb) {
  var req = request(url, options, cb);
  req.end();
  return req;
}

咱們不難發現,http 模塊提供三個主要的函數: http.request, http.get, http.createServer。前兩個函數主要是爲了建立 http 客戶端,向其它服務器發送請求,http.get 只是 http.request 的發送 get 請求的便捷方式;而 http.createServer 是爲了建立 Node 服務,好比 Koa 服務框架就是基於 http.createServer 封裝的。node

http.Agent

圖片描述

http.Agent 主要是爲 http.request, http.get 提供代理服務的,用於管理 http 鏈接的建立,銷燬及複用工做。http.request, http.get 默認使用 http.globalAgent 做爲代理,每次請求都是「創建鏈接-數據傳輸-銷燬鏈接」的過程,git

Object.defineProperty(module.exports, 'globalAgent', {
  configurable: true,
  enumerable: true,
  get() {
    return httpAgent.globalAgent;// 默認使用 http.globalAgent 做爲代理
  },
  set(value) {
    httpAgent.globalAgent = value; // 若是咱們想讓多個請求複用同一個 connection,則須要從新定義 agent 去覆蓋默認的 http.globalAgent
  }
});

若是咱們想讓多個請求複用同一個 connection,則須要從新定義 agent 去覆蓋默認的 http.globalAgent,下面咱們看一下新建一個agent的須要哪些主要參數:github

  • keepAlive:{Boolean} 是否開啓 keepAlive,多個請求公用一個 socket connection,默認是 false。
  • maxSockets:{Number} 每臺主機容許的socket的最大值,默認值爲Infinity。
  • maxFreeSockets:{Number} 處於鏈接池空閒狀態的最大鏈接數, 僅當開啓 keepAlive 纔有效。
let http = require('http');
const keepAliveAgent = new http.Agent({ 
    keepAlive: true,
    maxScokets: 1000,
    maxFreeSockets: 50 
})
http.get({
  hostname: 'localhost',
  port: 80,
  path: '/',
  agent: keepAliveAgent 
}, (res) => {
  // Do stuff with response
});

只有向相同的 host 和 port 發送請求才能公用同一個 keepAlive 的 socket 鏈接,若是開啓 keepAlive ,同一時間內多個請求會被放在隊列裏等待;若是當前隊列爲空,該 socket 處於空閒狀態,可是不會被銷燬,等待下一次請求的到來。segmentfault

使用 keepAlive 代理,有效的減小了創建/銷燬鏈接的開銷,開發者能夠對鏈接池進行動態管理。api

大致差很少就是這個意思,詳細能夠看Node.js 官方文檔服務器

clipboard.png

參考

https://nodejs.org/docs/lates...
http://nodejs.cn/api/http.htm...
以上圖片來自:https://segmentfault.com/a/11...
https://segmentfault.com/a/11...框架

相關文章
相關標籤/搜索