<samp id="tdkee"></samp>

    <mark id="tdkee"><acronym id="tdkee"></acronym></mark>

  1. 免费看又黄又无码的网站_久久久高清国产免费观看_亚洲一区二区三区在线免费观看_免费欧洲美女a视频一级毛片_日本最新免费二区三区

    ×

    如何編網(wǎng)站的HTTP 反向代理服務(wù)器

    • 作者:新網(wǎng)
    • 來源:新網(wǎng)
    • 瀏覽:100
    • 2018-02-24 17:46:34

    為了簡化從 Readable Stream 監(jiān)聽 data 事件來獲取數(shù)據(jù)并使用 Writable Stream 的 write() 方法來輸出,可以使用 Readable Stream 的 pipe() 方法。那么如何編寫 HTTP 反向代理服務(wù)器?

     為了簡化從 Readable Stream 監(jiān)聽 data 事件來獲取數(shù)據(jù)并使用 Writable Stream 的 write() 方法來輸出,可以使用 Readable Stream 的 pipe() 方法。那么如何編寫 HTTP 反向代理服務(wù)器?

    U2550P2DT20130426183639.jpg
    簡單版本
     
    以下是實現(xiàn)一個簡單 HTTP 反向代理服務(wù)器的各個文件和代碼(沒有任何第三方庫依賴), 為了使代碼更簡潔,使用了一些最新的 ES 語法特性,需要使用 Node v8.x 最新版本來運行 :
     
    文件 proxy.js :
     
    const http = require("http");
     
    const assert = require("assert");
     
    const log = require("./log");
     
    /** 反向代理中間件 */
     
    module.exports = function reverseProxy(options) {
     
    assert(Array.isArray(options.servers), "options.servers 必須是數(shù)組");
     
    assert(options.servers.length > 0, "options.servers 的長度必須大于 0");
     
    // 解析服務(wù)器地址,生成 hostname 和 port
     
    const servers = options.servers.map(str => {
     
    const s = str.split(":");
     
    return { hostname: s[0], port: s[1] || "80" };
     
    });
     
    // 獲取一個后端服務(wù)器,順序循環(huán)
     
    let ti = 0;
     
    function getTarget() {
     
    const t = servers[ti];
     
    ti++;
     
    if (ti >= servers.length) {
     
    ti = 0;
     
    }
     
    return t;
     
    }
     
    // 生成監(jiān)聽 error 事件函數(shù),出錯時響應(yīng) 500
     
    function bindError(req, res, id) {
     
    return function(err) {
     
    const msg = String(err.stack || err);
     
    log("[%s] 發(fā)生錯誤: %s", id, msg);
     
    if (!res.headersSent) {
     
    res.writeHead(500, { "content-type": "text/plain" });
     
    }
     
    res.end(msg);
     
    };
     
    }
     
    return function proxy(req, res) {
     
    // 生成代理請求信息
     
    const target = getTarget();
     
    const info = {
     
    ...target,
     
    method: req.method,
     
    path: req.url,
     
    headers: req.headers
     
    };
     
    const id = `${req.method} ${req.url} => ${target.hostname}:${target.port}`;
     
    log("[%s] 代理請求", id);
     
    // 發(fā)送代理請求
     
    const req2 = http.request(info, res2 => {
     
    res2.on("error", bindError(req, res, id));
     
    log("[%s] 響應(yīng): %s", id, res2.statusCode);
     
    res.writeHead(res2.statusCode, res2.headers);
     
    res2.pipe(res);
     
    });
     
    req.pipe(req2);
     
    req2.on("error", bindError(req, res, id));
     
    };
     
    };
     
    文件 log.js :
     
    const util = require("util");
     
    /** 打印日志 */
     
    module.exports = function log(...args) {
     
    const time = new Date().toLocaleString();
     
    console.log(time, util.format(...args));
     
    };
     
    說明:
     
    log.js 文件實現(xiàn)了一個用于打印日志的函數(shù) log() ,它可以支持 console.log() 一樣的用法,并且自動在輸出前面加上當(dāng)前的日期和時間,方便我們?yōu)g覽日志
     
    reverseProxy() 函數(shù)入口使用 assert 模塊來進(jìn)行基本的參數(shù)檢查,如果參數(shù)格式不符合要求即拋出異常,保證可以第一時間讓開發(fā)者知道,而不是在運行期間發(fā)生各種不可預(yù)測的錯誤。
     
    getTarget() 函數(shù)用于循環(huán)返回一個目標(biāo)服務(wù)器地址
     
    bindError() 函數(shù)用于監(jiān)聽 error 事件,避免整個程序因為沒有捕捉網(wǎng)絡(luò)異常而崩潰,同時可以統(tǒng)一返回出錯信息給客戶端。
     
    以上就是小編對于編寫 HTTP 反向代理服務(wù)器的建議。
     

    免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

    免費咨詢獲取折扣

    Loading
    国产精品视频白浆免费视频_久久久高清国产免费观看_亚洲一区二区三区在线免费观看_免费欧洲美女a视频一级毛片

    <samp id="tdkee"></samp>

      <mark id="tdkee"><acronym id="tdkee"></acronym></mark>