溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用Nodejs進(jìn)行反向代理

發(fā)布時(shí)間:2020-07-31 11:12:10 來源:網(wǎng)絡(luò) 閱讀:668 作者:jjjyyy66 欄目:網(wǎng)絡(luò)安全

在實(shí)際工程開發(fā)中,會(huì)有前后端分離的需求。

為了平滑的完成前端請(qǐng)求到后端各個(gè)獨(dú)立服務(wù),需要一個(gè)中間件實(shí)現(xiàn)請(qǐng)求轉(zhuǎn)發(fā)的功能,利用Nginx可以實(shí)現(xiàn),在這里,使用nodejs實(shí)現(xiàn)一個(gè)反向代理服務(wù)器。

 

實(shí)際前端項(xiàng)目背景是node+express做前端路由,提供頁面的基礎(chǔ)渲染和請(qǐng)求轉(zhuǎn)發(fā)。

后端使用java springboot開發(fā)多個(gè)微服務(wù)(這里沒有使用spring cloud Eureka 做服務(wù)管理與API協(xié)調(diào)),每個(gè)服務(wù)的IP一致,端口不一致。

 

實(shí)驗(yàn)環(huán)境:nodejs+express端口是3001,啟動(dòng)一個(gè)java服務(wù),端口是8088,在java中添加了一個(gè)filter,用來輸出收到的請(qǐng)求地址,使用postman左右客戶端發(fā)起請(qǐng)求

@Override    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) req;
        System.out.println("請(qǐng)求地址是"+((HttpServletRequest) req).getRequestURI());

首先在原express工程下安裝“http-proxy-middleware”中間件

npm install --save-dev http-proxy-middleware

在express的app.js中進(jìn)行引用

var proxy = require('http-proxy-middleware');

 

根據(jù)實(shí)際使用情況,進(jìn)行代理配置

1、轉(zhuǎn)發(fā)所有http請(qǐng)求

使用Nodejs進(jìn)行反向代理

var options = {
        target: 'http://localhost:8088', // 目標(biāo)主機(jī)
        changeOrigin: true,               // 需要虛擬主機(jī)站點(diǎn)    };var exampleProxy = proxy(options);  //開啟代理功能,并加載配置app.use('/', exampleProxy);//對(duì)地址為’/‘的請(qǐng)求全部轉(zhuǎn)發(fā)

使用Nodejs進(jìn)行反向代理

測(cè)試:向127.0.0.1:3001發(fā)起任何請(qǐng)求,查看java端接收的情況

請(qǐng)求URL    服務(wù)接輸入結(jié)果
127.0.0.1:3001/請(qǐng)求地址是/
127.0.0.1:3001/test請(qǐng)求地址是/test
127.0.0.1:3002/test不轉(zhuǎn)發(fā)

2、轉(zhuǎn)發(fā)指定path的請(qǐng)求

app.use('/api', exampleProxy);

測(cè)試:

請(qǐng)求URL    服務(wù)接輸入結(jié)果
127.0.0.1:3001/api/test請(qǐng)求地址是/api/test
127.0.0.1:3001/test不轉(zhuǎn)發(fā)
127.0.0.1:3001/api請(qǐng)求地址是/api
127.0.0.1:3002/test不轉(zhuǎn)發(fā)

3、對(duì)指定path規(guī)則進(jìn)行重定向

使用Nodejs進(jìn)行反向代理

var options = {
        target: 'http://localhost:8088', // 目標(biāo)主機(jī)
        changeOrigin: true,               // 需要虛擬主機(jī)站點(diǎn)
        ws: true,                         // 是否代理websocket        pathRewrite: {            '^/api/old-path' : '/api/new-path',     
            '^/api/remove/path' : '/path',           
            '^/api/auth/login':'/path'
        }
    };var exampleProxy = proxy(options);  //開啟代理功能,并加載配置app.use('/api', exampleProxy);//對(duì)地址為’/‘的請(qǐng)求全部轉(zhuǎn)發(fā)

使用Nodejs進(jìn)行反向代理

測(cè)試:

請(qǐng)求URL    服務(wù)接輸入結(jié)果
127.0.0.1:3001/api/old-path請(qǐng)求地址是/api/new-path
127.0.0.1:3001/api/remove/path請(qǐng)求地址是/path
127.0.0.1:3001/api/auth/login請(qǐng)求地址是/path
127.0.0.1:3001/api/test請(qǐng)求地址是/api/test
127.0.0.1:3001/test不轉(zhuǎn)發(fā)

 

4、對(duì)指定規(guī)則進(jìn)行路由重定向

這里可以簡(jiǎn)單理解為,加入目前我啟動(dòng)了2個(gè)及以上的java服務(wù),端口分別是8088,8089,但前端發(fā)起的請(qǐng)求均是指向127.0.0.1:3001的,代理需要根據(jù)實(shí)際的前端請(qǐng)求,解析路徑后,分發(fā)到不同端口(8088,8089)的java服務(wù)中

使用Nodejs進(jìn)行反向代理

var options = {
        target: 'http://localhost:8089', // 這里默認(rèn)轉(zhuǎn)發(fā)目標(biāo)為127.0.0.1:8089        router: {             '/rest': 'http://localhost:8088',//如果請(qǐng)求路徑是/api/rest,則將url的請(qǐng)求路由重定向
             '127.0.0.1:3001/api/8003': 'http://localhost:8003',  // 服務(wù)該url則重定向        }
    };var exampleProxy = proxy(options);  //開啟代理功能,并加載配置app.use('/api', exampleProxy);//對(duì)地址為’/‘的請(qǐng)求全部轉(zhuǎn)發(fā)

使用Nodejs進(jìn)行反向代理

測(cè)試:

請(qǐng)求URL    服務(wù)接輸入結(jié)果
127.0.0.1:3001/api/rest8088:請(qǐng)求地址是/api/rest
127.0.0.1:3002/api/rest無響應(yīng)
127.0.0.1:3001/api8088:請(qǐng)求地址是/api
127.0.0.1:3001/api/8003轉(zhuǎn)發(fā)失?。ㄒ?yàn)槲覀兡壳皼]有8003端口的服務(wù))
127.0.0.1:3001/api/rest/32328088:請(qǐng)求地址是/api/rest/3232
127.0.0.1:3001/api8089:請(qǐng)求地址是/api

 

這里需要注意,代理默認(rèn)對(duì)于/api下的所有請(qǐng)求,都轉(zhuǎn)發(fā)至8089端口的服務(wù),對(duì)于router中的配置采取例外處理,會(huì)工具規(guī)則轉(zhuǎn)發(fā)至8088服務(wù)或8003服務(wù)

 

總結(jié):

實(shí)際工程中,推薦采用第三種情況,通過“/api”等通配字符來區(qū)別所有要轉(zhuǎn)發(fā)的請(qǐng)求和常規(guī)http的頁面渲染請(qǐng)求。再根據(jù)實(shí)際后臺(tái)服務(wù)接口,去配置不同的router規(guī)則即可。


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI