99插插插,日本内射精品一区二区视频,日韩精品人妻一区二区尿失禁,欧美精品一区日韩亚洲

×

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

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

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

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

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

免費(fèi)咨詢獲取折扣

Loading
久久狠狠精品视频| 日韩色综合天天干| eeuss鲁丝一区二区三区老鲁夜| 中日韩乱码一区二区WW| 亚洲一区在线观看 色欲| 熟女大姐操逼| 日本亚洲日本久久| 明星换脸国产精品| 三级操逼视频大全| 亚洲精品 中文字幕 麻豆专区| 性生活视频免费网站| 日韩少妇制服后入| 51cao 无码| 日韩久久久久久久区| 蜜臀va成人精品蜜臀AV| 成年高潮网址| 不卡欧美在线国产日韩| 国产精品自拍偷拍a| 亚洲-区二区av| 亚洲成年无码天堂| 丁香五月婷婷中文字幕色| 一区二区三区高清无码传媒| 久少妇高潮视频| 欧美欧日韩A√| 天天日夜夜操男人天堂| 阴色婷婷大香蕉| 鸡吧小逼乳嗯啊爽AV| 色一色综合AV| 大香蕉一区二区XXX| 日小少妇5区| 亚洲少妇高潮视频| 香蕉三级黄| 日韩无码综合中文字幕| 少妇诱惑肛交视频| 一区二区三区日韩电影| AV传媒影视| 欧日韩一级av| 亚洲美女视频二区| 欧美黄片 免费| .国产成人电影中文字幕| 蜜臂精品久久69|