使用Nodejs進行反向代理


在實際工程開發中,會有前后端分離的需求。

為了平滑的完成前端請求到后端各個獨立服務,需要一個中間件實現請求轉發的功能,利用Nginx可以實現,在這里,使用nodejs實現一個反向代理服務器。
 
實際前端項目背景是node+express做前端路由,提供頁面的基礎渲染和請求轉發。
后端使用java springboot開發多個微服務(這里沒有使用spring cloud Eureka 做服務管理與API協調),每個服務的IP一致,端口不一致。
 
實驗環境:nodejs+express端口是3001,啟動一個java服務,端口是8088,在java中添加了一個filter,用來輸出收到的請求地址,使用postman左右客戶端發起請求
@Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest = (HttpServletRequest) req;
        System.out.println("請求地址是"+((HttpServletRequest) req).getRequestURI());

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

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

在express的app.js中進行引用

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

 

根據實際使用情況,進行代理配置

1、轉發所有http請求

var options = {
        target: 'http://localhost:8088', // 目標主機
        changeOrigin: true,               // 需要虛擬主機站點
    };
var exampleProxy = proxy(options);  //開啟代理功能,並加載配置
app.use('/', exampleProxy);//對地址為’/‘的請求全部轉發

測試:向127.0.0.1:3001發起任何請求,查看java端接收的情況

請求URL     服務接輸入結果
127.0.0.1:3001/ 請求地址是/
127.0.0.1:3001/test 請求地址是/test
127.0.0.1:3002/test 不轉發

2、轉發指定path的請求

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

測試:

請求URL     服務接輸入結果
127.0.0.1:3001/api/test 請求地址是/api/test
127.0.0.1:3001/test 不轉發
127.0.0.1:3001/api 請求地址是/api
127.0.0.1:3002/test 不轉發

3、對指定path規則進行重定向

var options = {
        target: 'http://localhost:8088', // 目標主機
        changeOrigin: true,               // 需要虛擬主機站點
        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);//對地址為’/‘的請求全部轉發

測試:

請求URL     服務接輸入結果
127.0.0.1:3001/api/old-path 請求地址是/api/new-path
127.0.0.1:3001/api/remove/path 請求地址是/path
127.0.0.1:3001/api/auth/login 請求地址是/path
127.0.0.1:3001/api/test 請求地址是/api/test
127.0.0.1:3001/test 不轉發

 

4、對指定規則進行路由重定向
這里可以簡單理解為,加入目前我啟動了2個及以上的java服務,端口分別是8088,8089,但前端發起的請求均是指向127.0.0.1:3001的,代理需要根據實際的前端請求,解析路徑后,分發到不同端口(8088,8089)的java服務中
var options = {
        target: 'http://localhost:8089', // 這里默認轉發目標為127.0.0.1:8089
        router: {
             '/rest': 'http://localhost:8088',//如果請求路徑是/api/rest,則將url的請求路由重定向
             '127.0.0.1:3001/api/8003': 'http://localhost:8003',  // 服務該url則重定向
        }
    };
var exampleProxy = proxy(options);  //開啟代理功能,並加載配置
app.use('/api', exampleProxy);//對地址為’/‘的請求全部轉發

測試:

請求URL     服務接輸入結果
127.0.0.1:3001/api/rest 8088:請求地址是/api/rest
127.0.0.1:3002/api/rest 無響應
127.0.0.1:3001/api 8088:請求地址是/api
127.0.0.1:3001/api/8003 轉發失敗(因為我們目前沒有8003端口的服務)
127.0.0.1:3001/api/rest/3232 8088:請求地址是/api/rest/3232
127.0.0.1:3001/api 8089:請求地址是/api

 

這里需要注意,代理默認對於/api下的所有請求,都轉發至8089端口的服務,對於router中的配置采取例外處理,會工具規則轉發至8088服務或8003服務
 
總結:
實際工程中,推薦采用第三種情況,通過“/api”等通配字符來區別所有要轉發的請求和常規http的頁面渲染請求。再根據實際后台服務接口,去配置不同的router規則即可。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM