在實際工程開發(fā)中,會有前后端分離的需求。
高唐ssl適用于網(wǎng)站、小程序/APP、API接口等需要進行數(shù)據(jù)傳輸應(yīng)用場景,ssl證書未來市場廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場價格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:18980820575(備注:SSL證書合作)期待與您的合作!為了平滑的完成前端請求到后端各個獨立服務(wù),需要一個中間件實現(xiàn)請求轉(zhuǎn)發(fā)的功能,利用Nginx可以實現(xiàn),在這里,使用nodejs實現(xiàn)一個反向代理服務(wù)器。
實際前端項目背景是node+express做前端路由,提供頁面的基礎(chǔ)渲染和請求轉(zhuǎn)發(fā)。
后端使用java springboot開發(fā)多個微服務(wù)(這里沒有使用spring cloud Eureka 做服務(wù)管理與API協(xié)調(diào)),每個服務(wù)的IP一致,端口不一致。
實驗環(huán)境:nodejs+express端口是3001,啟動一個java服務(wù),端口是8088,在java中添加了一個filter,用來輸出收到的請求地址,使用postman左右客戶端發(fā)起請求
@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');
根據(jù)實際使用情況,進行代理配置
1、轉(zhuǎn)發(fā)所有http請求
var options = { target: 'http://localhost:8088', // 目標主機 changeOrigin: true, // 需要虛擬主機站點 };var exampleProxy = proxy(options); //開啟代理功能,并加載配置app.use('/', exampleProxy);//對地址為’/‘的請求全部轉(zhuǎn)發(fā)
測試:向127.0.0.1:3001發(fā)起任何請求,查看java端接收的情況
請求URL | 服務(wù)接輸入結(jié)果 |
127.0.0.1:3001/ | 請求地址是/ |
127.0.0.1:3001/test | 請求地址是/test |
127.0.0.1:3002/test | 不轉(zhuǎn)發(fā) |
2、轉(zhuǎn)發(fā)指定path的請求
app.use('/api', exampleProxy);
測試:
請求URL | 服務(wù)接輸入結(jié)果 |
127.0.0.1:3001/api/test | 請求地址是/api/test |
127.0.0.1:3001/test | 不轉(zhuǎn)發(fā) |
127.0.0.1:3001/api | 請求地址是/api |
127.0.0.1:3002/test | 不轉(zhuǎn)發(fā) |
3、對指定path規(guī)則進行重定向
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);//對地址為’/‘的請求全部轉(zhuǎn)發(fā)
測試:
請求URL | 服務(wù)接輸入結(jié)果 |
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 | 不轉(zhuǎn)發(fā) |
4、對指定規(guī)則進行路由重定向
這里可以簡單理解為,加入目前我啟動了2個及以上的java服務(wù),端口分別是8088,8089,但前端發(fā)起的請求均是指向127.0.0.1:3001的,代理需要根據(jù)實際的前端請求,解析路徑后,分發(fā)到不同端口(8088,8089)的java服務(wù)中
var options = { target: 'http://localhost:8089', // 這里默認轉(zhuǎn)發(fā)目標為127.0.0.1:8089 router: { '/rest': 'http://localhost:8088',//如果請求路徑是/api/rest,則將url的請求路由重定向 '127.0.0.1:3001/api/8003': 'http://localhost:8003', // 服務(wù)該url則重定向 } };var exampleProxy = proxy(options); //開啟代理功能,并加載配置app.use('/api', exampleProxy);//對地址為’/‘的請求全部轉(zhuǎn)發(fā)
測試:
請求URL | 服務(wù)接輸入結(jié)果 |
127.0.0.1:3001/api/rest | 8088:請求地址是/api/rest |
127.0.0.1:3002/api/rest | 無響應(yīng) |
127.0.0.1:3001/api | 8088:請求地址是/api |
127.0.0.1:3001/api/8003 | 轉(zhuǎn)發(fā)失?。ㄒ驗槲覀兡壳皼]有8003端口的服務(wù)) |
127.0.0.1:3001/api/rest/3232 | 8088:請求地址是/api/rest/3232 |
127.0.0.1:3001/api | 8089:請求地址是/api |
這里需要注意,代理默認對于/api下的所有請求,都轉(zhuǎn)發(fā)至8089端口的服務(wù),對于router中的配置采取例外處理,會工具規(guī)則轉(zhuǎn)發(fā)至8088服務(wù)或8003服務(wù)
總結(jié):
實際工程中,推薦采用第三種情況,通過“/api”等通配字符來區(qū)別所有要轉(zhuǎn)發(fā)的請求和常規(guī)http的頁面渲染請求。再根據(jù)實際后臺服務(wù)接口,去配置不同的router規(guī)則即可。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。