• <samp id="mz5ne"><acronym id="mz5ne"></acronym></samp>
      <ol id="mz5ne"></ol>
    1. <samp id="mz5ne"></samp>
      <mark id="mz5ne"></mark>

        <fieldset id="mz5ne"></fieldset>

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

        ×

        怎么編寫網(wǎng)站的HTTP 反向代理服務器

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

        怎么編寫網(wǎng)站的HTTP 反向代理服務器?在 Node.js 上實現(xiàn)一個簡單的 HTTP 代理程序還是非常簡單的,本文章的例子的核心代碼只有 60 多行,只要理解 內(nèi)置 http 模塊 的基本用法即可,具體請看下文。

         怎么編寫網(wǎng)站的HTTP 反向代理服務器?在 Node.js 上實現(xiàn)一個簡單的 HTTP 代理程序還是非常簡單的,本文章的例子的核心代碼只有 60 多行,只要理解 內(nèi)置 http 模塊 的基本用法即可,具體請看下文。

         
        接口設計與相關技術
         
        使用 http.createServer() 創(chuàng)建的 HTTP 服務器,處理請求的函數(shù)格式一般為 function (req, res) {} (下文簡稱為 requestHandler ),其接收兩個參數(shù),分別為 http.IncomingMessage 和 http.ServerResponse 對象,我們可以通過這兩個對象來取得請求的所有信息并對它進行響應。
         
        主流的 Node.js Web 框架的中間件(比如 connect )一般都有兩種形式:
         
        中間件不需要任何初始化參數(shù),則其導出結(jié)果為一個 requestHandler
         
        中間件需要初始化參數(shù),則其導出結(jié)果為中間件的初始化函數(shù),執(zhí)行該初始化函數(shù)時,傳入一個 options 對象,執(zhí)行后返回一個 requestHandler
         
        為了使代碼更規(guī)范,在本文例子中,我們將反向代理程序設計成一個中間件的格式,并使用以上第二種接口形式:
         
        // 生成中間件
         
        const handler = reverseProxy({
         
        // 初始化參數(shù),用于設置目標服務器列表
         
        servers: ["127.0.0.1:3001", "127.0.0.1:3002", "127.0.0.1:3003"]
         
        });
         
        // 可以直接在 http 模塊中使用
         
        const server = http.createServer(handler);
         
        // 作為中間件在 connect 模塊中使用
         
        app.use(handler);
         
        說明:
         
        上面的代碼中, reverseProxy 是反向代理服務器中間件的初始化函數(shù),它接受一個對象參數(shù), servers 是后端服務器地址列表,每個地址為 IP 地址:端口 這樣的格式
         
        執(zhí)行 reverseProxy() 后返回一個 function (req, res) {} 這樣的函數(shù),用于處理 HTTP 請求,可作為 http.createServer() 和 connect 中間件的 app.use() 的處理函數(shù)
         
        當接收到客戶端請求時,按順序循環(huán)從 servers 數(shù)組中取出一個服務器地址,將請求代理到這個地址的服務器上
         
        服務器在接收到 HTTP 請求后,首先需要發(fā)起一個新的 HTTP 請求到要代理的目標服務器,可以使用 http.request() 來發(fā)送請求:
         
        const req = http.request(
         
        {
         
        hostname: "目標服務器地址",
         
        port: "80",
         
        path: "請求路徑",
         
        headers: {
         
        "x-y-z": "請求頭"
         
        }
         
        },
         
        function(res) {
         
        // res 為響應對象
         
        console.log(res.statusCode);
         
        }
         
        );
         
        // 如果有請求體需要發(fā)送,使用 write() 和 end()
         
        req.end();
         
        要將客戶端的請求體( Body 部分,在 POST 、 PUT 這些請求時會有請求體)轉(zhuǎn)發(fā)到另一個服務器上,可以使用 Stream 對象的 pipe() 方法,比如:
         
        // req 和 res 為客戶端的請求和響應對象
         
        // req2 和 res2 為服務器發(fā)起的代理請求和響應對象
         
        // 將 req 收到的數(shù)據(jù)轉(zhuǎn)發(fā)到 req2
         
        req.pipe(req2);
         
        // 將 res2 收到的數(shù)據(jù)轉(zhuǎn)發(fā)到 res
         
        res2.pipe(res);
         
        說明:
         
        req 對象是一個 Readable Stream (可讀流),通過 data 事件來接收數(shù)據(jù),當收到 end事件時表示數(shù)據(jù)接收完畢
         
        res 對象是一個 Writable Stream (可寫流),通過 write() 方法來輸出數(shù)據(jù), end() 方法來結(jié)束輸出。
         
        以上就是小編對于怎么編寫網(wǎng)站的HTTP 反向代理服務器的解答。
         

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

        免費咨詢獲取折扣

        Loading
        国产精品视频白浆免费视频_久久久高清国产免费观看_亚洲一区二区三区在线免费观看_免费欧洲美女a视频一级毛片
      1. <samp id="mz5ne"><acronym id="mz5ne"></acronym></samp>
          <ol id="mz5ne"></ol>
        1. <samp id="mz5ne"></samp>
          <mark id="mz5ne"></mark>

            <fieldset id="mz5ne"></fieldset>
            澄城县| 澳门| 鄢陵县| 定远县| 平陆县| 治县。| 苍山县| 利川市| 布尔津县| 武邑县| 电白县| 贞丰县| 德昌县| 怀化市| 平潭县| 济南市| 嫩江县| 台北县| 许昌市| 南充市| 习水县| 平阴县| 象山县| 西安市| 忻州市| 吐鲁番市| 通河县| 常熟市| 长垣县| 靖江市| 綦江县| 滨州市| 民丰县| 长寿区| 兴安盟| 金川县| 象州县| 金昌市| 伽师县| 盐津县| 安仁县|