Nodejs學習記錄:http模組
概覽
http模組原始碼:https://github.com/nodejs/nod...
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 封裝的。
http.Agent
http.Agent
主要是為 http.request, http.get 提供代理服務的,用於管理 http 連線的建立,銷燬及複用工作。http.request, http.get 預設使用 http.globalAgent 作為代理,每次請求都是“建立連線-資料傳輸-銷燬連線”的過程,如果我們想讓多個請求複用同一個 connection,則需要重新定義 agent 去覆蓋預設的 http.globalAgent,下面我們看一下新建一個agent的需要哪些主要引數:
- 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 處於空閒狀態,但是不會被銷燬,等待下一次請求的到來。
使用 keepAlive 代理,有效的減少了建立/銷燬連線的開銷,開發者可以對連線池進行動態管理。
大體差不多就是這個意思,詳細可以看Node.js 官方文件