1. 程式人生 > >使用Nodejs進行反向代理

使用Nodejs進行反向代理

代理服務器 spring public filter 中間件

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

為了平滑的完成前端請求到後端各個獨立服務,需要一個中間件實現請求轉發的功能,利用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/rest8088:請求地址是/api/rest
127.0.0.1:3002/api/rest無響應
127.0.0.1:3001/api8088:請求地址是/api
127.0.0.1:3001/api/8003轉發失敗(因為我們目前沒有8003端口的服務)
127.0.0.1:3001/api/rest/32328088:請求地址是/api/rest/3232
127.0.0.1:3001/api8089:請求地址是/api

這裏需要註意,代理默認對於/api下的所有請求,都轉發至8089端口的服務,對於router中的配置采取例外處理,會工具規則轉發至8088服務或8003服務

總結:

實際工程中,推薦采用第三種情況,通過“/api”等通配字符來區別所有要轉發的請求和常規http的頁面渲染請求。再根據實際後臺服務接口,去配置不同的router規則即可。


使用Nodejs進行反向代理