99插插插,亚洲伦理中文在线,站长推荐一二三区欧美,青青草在线导航

×

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

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

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

 怎么編寫網(wǎng)站的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è)中間件的格式,并使用以上第二種接口形式:
 
// 生成中間件
 
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);
 
說(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)求:
 
const req = http.request(
 
{
 
hostname: "目標(biāo)服務(wù)器地址",
 
port: "80",
 
path: "請(qǐng)求路徑",
 
headers: {
 
"x-y-z": "請(qǐng)求頭"
 
}
 
},
 
function(res) {
 
// res 為響應(yīng)對(duì)象
 
console.log(res.statusCode);
 
}
 
);
 
// 如果有請(qǐng)求體需要發(fā)送,使用 write() 和 end()
 
req.end();
 
要將客戶端的請(qǐng)求體( Body 部分,在 POST 、 PUT 這些請(qǐng)求時(shí)會(huì)有請(qǐng)求體)轉(zhuǎn)發(fā)到另一個(gè)服務(wù)器上,可以使用 Stream 對(duì)象的 pipe() 方法,比如:
 
// req 和 res 為客戶端的請(qǐng)求和響應(yīng)對(duì)象
 
// req2 和 res2 為服務(wù)器發(fā)起的代理請(qǐng)求和響應(yīng)對(duì)象
 
// 將 req 收到的數(shù)據(jù)轉(zhuǎn)發(fā)到 req2
 
req.pipe(req2);
 
// 將 res2 收到的數(shù)據(jù)轉(zhuǎn)發(fā)到 res
 
res2.pipe(res);
 
說(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é)束輸出。
 
以上就是小編對(duì)于怎么編寫網(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)容,請(qǐng)發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

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

Loading
艹B视频网站在线观看| 韩日欧美日人妻| 中文字幕日婷也| 欧美高清黄片在线| 婷婷深爱激情网在线| 色色AV中文字幕| 亚洲火热曰B视频| 国产一区黄色片| 亚洲欧美激情五月婷婷| 五月婷婷成人肉体在线影院| 亚洲婷婷激情不卡一区在线| 殴美一级在线| 五月婷婷久久无码精品| 国产精品一区二区69| 欧美188区| 明星换脸一区二区三区| 人妻视频1区| 亚欧中文字幕一区| 亚洲欧美成人a∨在线| 刘玥在线一区二区三区| 九九精品中文字母| 熟女国产在线观| 香蕉快播超碰| 国产免费一二三四区吞精| 91麻豆久久久久一二三区| 好吊妞免费在线视频| 极品无码| 亚洲精品综合久久久久中文字幕| 精美视频在线视频| 亚洲精品久久99一区| 九九九九九香蕉视频一区| 天天干 天天操 天天日 天天热| B·B在线免费观看| 91中文精品视频| 超碰ri44caoporn| 免费无遮挡无码永久在线观看视频 | 97一区二区三区国产清品| 91字幕在线| 精品久aa| 国产视频精品四区| 日本高清在线中文字幕|