欧美性猛交xxxx免费看_牛牛在线视频国产免费_天堂草原电视剧在线观看免费_国产粉嫩高清在线观看_国产欧美日本亚洲精品一5区

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

HTTP反向代理服務(wù)器的編寫程序

我快閉嘴 ? 作者:工程師李察 ? 2018-10-06 10:00 ? 次閱讀

如果你經(jīng)常使用 Node.js 編寫 Web 服務(wù)端程序,一定對(duì)使用 Nginx 作為 反向代理 服務(wù)并不陌生。在生產(chǎn)環(huán)境中,我們往往需要將程序部署到內(nèi)網(wǎng)多臺(tái)服務(wù)器上,在一臺(tái)多核服務(wù)器上,為了充分利用所有 CPU 資源,也需要啟動(dòng)多個(gè)服務(wù)進(jìn)程,它們分別監(jiān)聽不同的端口。然后使用 Nginx 作為反向代理服務(wù)器,接收來(lái)自用戶瀏覽器的請(qǐng)求并轉(zhuǎn)發(fā)到后端的多臺(tái) Web 服務(wù)器上。大概工作流程如下圖:

HTTP反向代理服務(wù)器的編寫程序

在 Node.js 上實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 HTTP 代理程序還是非常簡(jiǎn)單的,本文章的例子的核心代碼只有 60 多行,只要理解 內(nèi)置 http 模塊 的基本用法即可,具體請(qǐng)看下文。

接口設(shè)計(jì)與相關(guān)技術(shù)

使用 http.createServer() 創(chuàng)建的 HTTP 服務(wù)器,處理請(qǐng)求的函數(shù)格式一般為 function (req, res) {}(下文簡(jiǎn)稱為 requestHandler),其接收兩個(gè)參數(shù),分別為 http.IncomingMessage 和 http.ServerResponse 對(duì)象,我們可以通過(guò)這兩個(gè)對(duì)象來(lái)取得請(qǐng)求的所有信息并對(duì)它進(jìn)行響應(yīng)。

主流的 Node.js Web 框架的中間件(比如 connect)一般都有兩種形式:

中間件不需要任何初始化參數(shù),則其導(dǎo)出結(jié)果為一個(gè) requestHandler

中間件需要初始化參數(shù),則其導(dǎo)出結(jié)果為中間件的初始化函數(shù),執(zhí)行該初始化函數(shù)時(shí),傳入一個(gè) options 對(duì)象,執(zhí)行后返回一個(gè) requestHandler

為了使代碼更規(guī)范,在本文例子中,我們將反向代理程序設(shè)計(jì)成一個(gè)中間件的格式,并使用以上第二種接口形式:


HTTP反向代理服務(wù)器的編寫程序

說(shuō)明:

上面的代碼中,reverseProxy 是反向代理服務(wù)器中間件的初始化函數(shù),它接受一個(gè)對(duì)象參數(shù),servers 是后端服務(wù)器地址列表,每個(gè)地址為 IP地址:端口 這樣的格式

執(zhí)行 reverseProxy() 后返回一個(gè) function (req, res) {} 這樣的函數(shù),用于處理 HTTP 請(qǐng)求,可作為 http.createServer() 和 connect 中間件的 app.use() 的處理函數(shù)

當(dāng)接收到客戶端請(qǐng)求時(shí),按順序循環(huán)從 servers 數(shù)組中取出一個(gè)服務(wù)器地址,將請(qǐng)求代理到這個(gè)地址的服務(wù)器上

服務(wù)器在接收到 HTTP 請(qǐng)求后,首先需要發(fā)起一個(gè)新的 HTTP 請(qǐng)求到要代理的目標(biāo)服務(wù)器,可以使用 http.request() 來(lái)發(fā)送請(qǐng)求:

HTTP反向代理服務(wù)器的編寫程序

要將客戶端的請(qǐng)求體(Body 部分,在 POST、PUT 這些請(qǐng)求時(shí)會(huì)有請(qǐng)求體)轉(zhuǎn)發(fā)到另一個(gè)服務(wù)器上,可以使用 Stream 對(duì)象的 pipe() 方法,比如:

說(shuō)明:

req 對(duì)象是一個(gè) Readable Stream(可讀流),通過(guò) data 事件來(lái)接收數(shù)據(jù),當(dāng)收到 end 事件時(shí)表示數(shù)據(jù)接收完畢

res 對(duì)象是一個(gè) Writable Stream (可寫流),通過(guò) write() 方法來(lái)輸出數(shù)據(jù),end() 方法來(lái)結(jié)束輸出

為了簡(jiǎn)化從 Readable Stream 監(jiān)聽 data 事件來(lái)獲取數(shù)據(jù)并使用 Writable Stream 的 write() 方法來(lái)輸出,可以使用 Readable Stream 的 pipe() 方法

以上只是提到了實(shí)現(xiàn) HTTP 代理需要的關(guān)鍵技術(shù),相關(guān)接口的詳細(xì)文檔可以參考這里:https://nodejs.org/api/http.html#http_http_request_options_callback

當(dāng)然為了實(shí)現(xiàn)一個(gè)接口友好的程序,往往還需要很多 額外 的工作,具體請(qǐng)看下文。

簡(jiǎn)單版本

以下是實(shí)現(xiàn)一個(gè)簡(jiǎn)單 HTTP 反向代理服務(wù)器的各個(gè)文件和代碼(沒有任何第三方庫(kù)依賴),為了使代碼更簡(jiǎn)潔,使用了一些最新的 ES 語(yǔ)法特性,需要使用 Node v8.x 最新版本來(lái)運(yùn)行:

文件 proxy.js:


文件 log.js:

const util = require("util"); /** 打印日志 */ module.exports = function log(...args) { const time = new Date().toLocaleString(); console.log(time, util.format(...args)); };

說(shuō)明:

log.js 文件實(shí)現(xiàn)了一個(gè)用于打印日志的函數(shù) log(),它可以支持 console.log()一樣的用法,并且自動(dòng)在輸出前面加上當(dāng)前的日期和時(shí)間,方便我們?yōu)g覽日志

reverseProxy() 函數(shù)入口使用 assert 模塊來(lái)進(jìn)行基本的參數(shù)檢查,如果參數(shù)格式不符合要求即拋出異常,保證可以第一時(shí)間讓開發(fā)者知道,而不是在運(yùn)行期間發(fā)生各種 不可預(yù)測(cè) 的錯(cuò)誤

getTarget() 函數(shù)用于循環(huán)返回一個(gè)目標(biāo)服務(wù)器地址

bindError() 函數(shù)用于監(jiān)聽 error 事件,避免整個(gè)程序因?yàn)闆]有捕捉網(wǎng)絡(luò)異常而崩潰,同時(shí)可以統(tǒng)一返回出錯(cuò)信息給客戶端

為了測(cè)試我們的代碼運(yùn)行的效果,我編寫了一個(gè)簡(jiǎn)單的程序,文件 server.js:

執(zhí)行以下命令啟動(dòng):

nodeserver.js

然后可以通過(guò) curl 命令來(lái)查看返回的結(jié)果:

curlhttp://127.0.0.1:3000/hello/world

連續(xù)執(zhí)行多次該命令,如無(wú)意外輸出結(jié)果應(yīng)該是這樣的(輸出內(nèi)容端口部分按照順序循環(huán)):

注意:如果使用瀏覽器來(lái)打開該網(wǎng)址,看到的結(jié)果順序可能是不一樣的,因?yàn)闉g覽器會(huì)自動(dòng)嘗試請(qǐng)求/favicon,這樣刷新一次頁(yè)面實(shí)際上是發(fā)送了兩次請(qǐng)求。

單元測(cè)試

上文我們已經(jīng)完成了一個(gè)基本的 HTTP 反向代理程序,也通過(guò)簡(jiǎn)單的方法驗(yàn)證了它是能正常工作的。但是,我們并沒有足夠的測(cè)試,比如只驗(yàn)證了 GET 請(qǐng)求,并沒有驗(yàn)證 POST 請(qǐng)求或者其他的請(qǐng)求方法。而且通過(guò)手工去做更多的測(cè)試也比較麻煩,很容易遺漏。所以,接下來(lái)我們要給它加上自動(dòng)化的單元測(cè)試。

在本文中我們選用在 Node.js 界應(yīng)用廣泛的 mocha 作為單元測(cè)試框架,搭配使用 supertest 來(lái)進(jìn)行 HTTP 接口請(qǐng)求的測(cè)試。由于 supertest 已經(jīng)自帶了一些基本的斷言方法,我們暫時(shí)不需要 chai 或者 should 這樣的第三方斷言庫(kù)。

首先執(zhí)行 npm init 初始化一個(gè) package.json 文件,并執(zhí)行以下命令安裝 mocha和 supertest:

npminstallmochasupertest--save-dev

然后新建文件 test.js:

說(shuō)明:

在單元測(cè)試開始前,需要通過(guò) before() 來(lái)注冊(cè)回調(diào)函數(shù),以便在開始執(zhí)行測(cè)試用例時(shí)先把服務(wù)器啟動(dòng)起來(lái)

同理,通過(guò) after() 注冊(cè)回調(diào)函數(shù),以便在執(zhí)行完所有測(cè)試用例后把服務(wù)器關(guān)閉以釋放資源(否則 mocha 進(jìn)程不會(huì)退出)

使用 supertest 發(fā)送請(qǐng)求時(shí),代理服務(wù)器不需要監(jiān)聽端口,只需要將 server 實(shí)例作為調(diào)用參數(shù)即可

接著修改 package.json 文件的 scripts 部分:

如果一切正常,我們應(yīng)該會(huì)看到這樣的輸出結(jié)果,其中 passing 這樣的提示表示我們的測(cè)試完全通過(guò)了:

當(dāng)然以上的測(cè)試代碼還遠(yuǎn)遠(yuǎn)不夠,剩下的就交給讀者們來(lái)實(shí)現(xiàn)了。

接口改進(jìn)

如果要設(shè)計(jì)成一個(gè)比較通用的反向代理中間件,我們還可以通過(guò)提供一個(gè)生成 http.ClientRequest 的函數(shù)來(lái)實(shí)現(xiàn)在代理時(shí)動(dòng)態(tài)修改請(qǐng)求:

然后在原來(lái)的 http.request(info, (res2) => {}) 部分可以改為監(jiān)聽 response 事件:

constreq2=http.request(options.request(info));

req2.on("response",res2=>{});

同理,我們也可以通過(guò)提供一個(gè)函數(shù)來(lái)修改部分的響應(yīng)內(nèi)容:

此處只發(fā)散一下思路,具體實(shí)現(xiàn)方法和代碼就不再贅述了。

總結(jié)

本文主要介紹了如何使用內(nèi)置的 http 模塊來(lái)創(chuàng)建一個(gè) HTTP 服務(wù)器,以及發(fā)起一個(gè) HTTP 請(qǐng)求,并簡(jiǎn)單介紹了如何對(duì) HTTP 接口進(jìn)行測(cè)試。在實(shí)現(xiàn) HTTP 請(qǐng)求代理的過(guò)程中,主要是運(yùn)用了 Stream 對(duì)象的 pipe() 方法,關(guān)鍵部分代碼只有區(qū)區(qū)幾行。Node.js 中的很多程序都運(yùn)用了 Stream 這樣的思想,將數(shù)據(jù)當(dāng)做一個(gè)流,使用 pipe 將一個(gè)流轉(zhuǎn)換成另一個(gè)流,可以看出 Stream 在 Node.js 的重要性。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Web
    Web
    +關(guān)注

    關(guān)注

    2

    文章

    1271

    瀏覽量

    69746
  • HTTP
    +關(guān)注

    關(guān)注

    0

    文章

    511

    瀏覽量

    31539
  • 代理服務(wù)器
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    8028
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    10個(gè)關(guān)于linux中Squid代理服務(wù)器的實(shí)用面試問答

    (常被視作代理服務(wù)的代名詞)就是這樣一個(gè)應(yīng)用程序,它不但可以被作為代理服務(wù)器,其同時(shí)也是在該類工具中比較被廣泛使用的一種。本文旨在提高你在遇到關(guān)于
    發(fā)表于 09-28 10:19

    網(wǎng)絡(luò)代理服務(wù)器的內(nèi)存

    網(wǎng)絡(luò)代理服務(wù)器的內(nèi)存              網(wǎng)絡(luò)加速產(chǎn)品多采用SDRAM 和DDR SDRAM兩種內(nèi)存。  &nb
    發(fā)表于 01-07 14:06 ?598次閱讀

    網(wǎng)絡(luò)代理服務(wù)器的網(wǎng)絡(luò)接口

    網(wǎng)絡(luò)代理服務(wù)器的網(wǎng)絡(luò)接口         
    發(fā)表于 01-07 14:08 ?606次閱讀

    網(wǎng)絡(luò)代理服務(wù)器

    網(wǎng)絡(luò)代理服務(wù)器              網(wǎng)絡(luò)代理服務(wù)器有別于傳統(tǒng)的網(wǎng)絡(luò)加速軟件,它是專門指高速緩存服務(wù)器產(chǎn)品,即Cache
    發(fā)表于 01-07 14:09 ?1020次閱讀

    Apache代理服務(wù)器配置說(shuō)明

    Apache代理服務(wù)器 1. 安裝apache。 2. 修改\Apache\conf\httpd.conf配置文件, 首先要添加代理服務(wù)器模塊。找到下面這幾行: #LoadModule
    發(fā)表于 04-29 16:49 ?0次下載

    vpn代理服務(wù)器_VPN代理軟件下載

    vpn代理服務(wù)器使用,通過(guò)vpn代理登錄谷歌電子市場(chǎng),本文提供了vpn代理軟件下載,供vpn代理使用的朋友下載
    發(fā)表于 09-14 09:50 ?111次下載

    Nginx架構(gòu)介紹 Nginx服務(wù)器模型分析

    Nginx是一款免費(fèi)的、開源的、高性能、模塊化、輕量級(jí)的HTTP服務(wù)器、反向代理服務(wù)器以及電子郵件(IMAP/POP3)代理服務(wù)器。
    的頭像 發(fā)表于 01-10 16:32 ?9277次閱讀
    Nginx架構(gòu)介紹 Nginx<b class='flag-5'>服務(wù)器</b>模型分析

    正向代理反向代理的區(qū)別

    Nginx作為時(shí)下最流行的HTTP服務(wù)器之一,同時(shí)它是一個(gè)反向代理服務(wù)器,提到反向代理服務(wù)器,有
    的頭像 發(fā)表于 05-03 17:42 ?3552次閱讀
    正向<b class='flag-5'>代理</b>和<b class='flag-5'>反向</b><b class='flag-5'>代理</b>的區(qū)別

    基于高斯混合模型的Web代理服務(wù)器緩存

    基于高斯混合模型的Web代理服務(wù)器緩存
    發(fā)表于 06-23 16:46 ?17次下載

    代理服務(wù)器IP如何使用,這幾點(diǎn)需要注意了

    作為信息的中轉(zhuǎn)站,偽裝自己的真實(shí)IP,保障上網(wǎng)安全。那么,如何安全且合理的使用代理IP技術(shù)呢? 代理服務(wù)器是介于客戶端和Web服務(wù)器之間的另一臺(tái)服務(wù)器,有了它之后,瀏覽
    的頭像 發(fā)表于 07-22 17:19 ?4322次閱讀

    詳解Nginx高性能的HTTP反向代理服務(wù)器

    Nginx 是一個(gè)高性能的 HTTP反向代理服務(wù)器,特點(diǎn)是占用內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上 Nginx 的并發(fā)能力確實(shí)在同類型的網(wǎng)頁(yè)服務(wù)器中表現(xiàn)較好。
    的頭像 發(fā)表于 03-16 11:23 ?2516次閱讀

    恒訊科技分析:代理服務(wù)器的類型有哪些?

    代理服務(wù)器是一臺(tái)攔截和管理兩個(gè)設(shè)備、網(wǎng)絡(luò)或協(xié)議之間的流量的計(jì)算機(jī)。代理是充當(dāng)我們的計(jì)算機(jī)與我們正在使用的網(wǎng)站和互聯(lián)網(wǎng)服務(wù)之間的中介的網(wǎng)關(guān)。它們可以用作防火墻、過(guò)濾器、緩存或促進(jìn)共享網(wǎng)絡(luò)連接。這是
    的頭像 發(fā)表于 10-23 15:08 ?230次閱讀
    恒訊科技分析:<b class='flag-5'>代理服務(wù)器</b>的類型有哪些?

    代理服務(wù)器用戶名,主要作用是什么?

    代理服務(wù)器用戶名是指用于訪問和控制代理服務(wù)器的身份驗(yàn)證信息之一。用戶名通常由代理服務(wù)器的管理員或服務(wù)提供商設(shè)定,用于確保只有授權(quán)用戶能夠訪問和使用
    的頭像 發(fā)表于 09-13 09:48 ?265次閱讀

    使用Python構(gòu)建高效的HTTP代理服務(wù)器

    構(gòu)建一個(gè)高效的HTTP代理服務(wù)器在Python中涉及多個(gè)方面,包括性能優(yōu)化、并發(fā)處理、協(xié)議支持(HTTP/HTTPS)、錯(cuò)誤處理以及日志記錄等。
    的頭像 發(fā)表于 10-23 07:41 ?228次閱讀

    Python中代理服務(wù)器的配置與應(yīng)用

    在網(wǎng)絡(luò)通信中,代理服務(wù)器作為一種重要的網(wǎng)絡(luò)中間件,充當(dāng)著客戶端和目標(biāo)服務(wù)器之間的中間人角色。它能夠接收來(lái)自客戶端的請(qǐng)求,并將這些請(qǐng)求轉(zhuǎn)發(fā)給目標(biāo)服務(wù)器,然后將服務(wù)器的響應(yīng)返回給客戶端。P
    的頭像 發(fā)表于 11-12 07:13 ?226次閱讀