?需求說明
軟件功能需求:反向代理功能(描述:apollo、eureka控、apisix、sentinel、普米、kibana、timetask、grafana、hbase、skywalking-ui、pinpoint、cmak界面、kafka-map、nacos、gateway、elasticsearch、 oa-portal 業務應用等多個web資源等只能通過有限個代理地址訪問),不考慮SSO。
軟件質量需求:滿足基本的性能要求:頁面響應耗時:3s內(頁面本身不走代理就慢的情況除外)
約束條件:內部web資源權限控制的原因,可申請的web資源數量有限制,成百上千的web應用地址只能通過有限個(10個以內)代理地址訪問
原型界面【Axuare】
原型界面視頻講解
系統URL整合系列視頻二(界面原型)【axure原型界面】_系統url整合系列視頻二(界面原型)-配套文檔-CSDN博客
原型設計稿下載
https://download.csdn.net/download/jjk_02027/90335900
前端代碼實現【d3js】
前端代碼視頻講解
系統URL整合系列視頻三(前端代碼實現) 【d3js版本】-CSDN博客
前端代碼下載
https://download.csdn.net/download/jjk_02027/90335919
后端技術實現【nodejs實現】
在Node.js中,根據不同的條件將請求轉發到不同的后端服務可以通過多種方式實現,其中最常用的是使用中間件。這里我將介紹幾種常見的方法:
1. 使用?express
?框架
假設你正在使用?express
?框架,你可以使用?express-http-proxy
?或?http-proxy-middleware
?包來實現條件轉發。
使用?http-proxy-middleware
首先,你需要安裝這個包:
npm install http-proxy-middleware
然后,創建一個新的JavaScript文件,例如app.js
,并設置你的Express服務器,你可以創建一個代理中間件并根據條件轉發請求:
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');const app = express();// 定義一個條件路由
app.use((req, res, next) => {if (req.headers['x-api-key'] === 'secret123') {// 使用代理轉發到特定的后端服務return createProxyMiddleware({target: 'http://backend1.example.com', // 后端1的URLchangeOrigin: true, // 更改請求頭中的Host})(req, res, next);} else {// 使用另一個代理轉發到另一個后端服務return createProxyMiddleware({target: 'http://backend2.example.com', // 后端2的URLchangeOrigin: true, // 更改請求頭中的Host})(req, res, next);}
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
2. 使用?axios
?或?node-fetch
?手動轉發請求
如果你不希望使用代理中間件,也可以使用?axios
?或?node-fetch
?來手動轉發請求。
使用?axios
首先,安裝?axios
npm install axios
然后,編寫代碼來根據條件轉發請求:
const express = require('express');
const axios = require('axios');const app = express();app.use(async (req, res) => {let targetUrl;if (req.headers['x-api-key'] === 'secret123') {targetUrl = 'http://backend1.example.com'; // 后端1的URL} else {targetUrl = 'http://backend2.example.com'; // 后端2的URL}try {const response = await axios({ ...req, url: targetUrl }); // 使用axios轉發請求,保持原有的請求方法、頭部等屬性res.status(response.status).send(response.data); // 發送響應給客戶端} catch (error) {res.status(error.response ? error.response.status : 500).send(error.message); // 處理錯誤并返回給客戶端}
});app.listen(3000, () => {console.log('Server is running on port 3000');
});
3. 直接使用原生?http
?模塊(不推薦,除非有特殊需求)
雖然不推薦,但你也可以使用 Node.js 的原生?http
?或?https
?模塊來手動轉發請求:
const http = require('http');
const express = require('express');
const app = express();app.use((req, res) => {let targetUrl;if (req.headers['x-api-key'] === 'secret123') {targetUrl = 'http://backend1.example.com'; // 后端1的URL} else {targetUrl = 'http://backend2.example.com'; // 后端2的URL}const options = { ...req, url: targetUrl }; // 注意這里的url應為完整的URL或使用其他方式指定目標URL和端口等參數,此處僅為示意。實際使用時需調整。通常需要使用`url`模塊來處理完整的URL。const proxyReq = http.request(options, proxyRes => { // 使用原生http模塊創建代理請求。注意這里的options需要正確設置。通常需要額外處理headers等。此處僅為示意。實際使用時需調整。通常需要額外處理headers等。此處僅為示意。實際使用時需調整。通常需要額外處理headers等。此處僅為示意
?4、運行你的應用
保存你的更改并運行你的Express應用
node app.js
現在,你的Express應用會根據請求的路徑將請求轉發到不同的后端服務。例如,所有發送到['x-api-key'] === 'secret123'
的請求將被轉發到http://backend1.example.com
,而所有其他的請求將被轉發到http://backend2.example.com
。
附加:動態決定目標地址
如果你需要根據請求的某些動態條件(如頭部信息、查詢參數等)來決定目標地址,你可以在代理中間件中使用回調函數來動態設置target
屬性:
附件一:nodejs官方網站
Node.js — 在任何地方運行 JavaScript
Node.js · GitHub
附件二:NodeJS介紹
?Node.js?是一個基于Chrome V8引擎的JavaScript運行環境,專為構建高性能、可擴展的網絡應用而設計。它使用事件驅動和非阻塞I/O模型,使得JavaScript能夠在服務器端高效運行,特別適合處理高并發請求。?
歷史背景
Node.js由Ryan Dahl于2009年創建,最初是為了解決傳統服務器架構中存在的痛點,如阻塞式I/O導致的低效性能問題。Node.js的誕生極大地革新了后端開發,通過非阻塞I/O和事件驅動模型,實現了輕量級、高并發處理能力。
工作原理
Node.js的核心在于其事件循環和非阻塞I/O操作。它采用單線程模型,通過事件循環來實現異步處理任務。每當請求被發起時,Node.js會將請求放入隊列中,并繼續執行后續代碼。當請求的結果準備好后,通過回調函數來處理結果。
主要特性
- ?非阻塞I/O?:Node.js使用非阻塞I/O模型,允許服務器在等待I/O操作完成時繼續處理其他任務,從而提高性能。
- ?事件驅動?:基于事件循環機制,Node.js能夠處理大量并發連接,適合實時應用和微服務架構。
- ?高性能?:V8引擎的執行速度非常快,使得Node.js在處理高并發請求時表現出色。
- ?模塊化體系?:Node.js擁有活躍的npm生態,極大地加速了開發效率,廣泛應用于API服務器、實時應用、微服務架構等場景。
應用場景
- ?Web服務器?:Node.js可以用來搭建高效的Web服務器,特別適合處理大量并發請求。
- ?API服務?:利用Node.js創建RESTful API或GraphQL API,能夠快速處理請求。
- ?實時應用?:如即時聊天應用、在線多人游戲等,Node.js展現了其實時處理能力。
- ?微服務架構?:結合Serverless服務,Node.js開發者能更聚焦業務邏輯,利用云平臺自動擴展、按需計費的優勢,輕松部署及管理后端服務。
最新版本和更新
Node.js的最新版本為23.5.0,發布于2024年12月19日。軟件大小在28至60MB之間,持續更新以提升性能和功能。
附件三:JS在線運行環境
在線運行JavaScriptx
比W3cschool的功能更強大哦,快快點贊收藏吧~