【動態路由】系統Web URL資源整合系列(后端技術實現)【nodejs實現】

?需求說明

軟件功能需求:反向代理功能(描述: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會將請求放入隊列中,并繼續執行后續代碼。當請求的結果準備好后,通過回調函數來處理結果。

主要特性

  1. ?非阻塞I/O?:Node.js使用非阻塞I/O模型,允許服務器在等待I/O操作完成時繼續處理其他任務,從而提高性能。
  2. ?事件驅動?:基于事件循環機制,Node.js能夠處理大量并發連接,適合實時應用和微服務架構。
  3. ?高性能?:V8引擎的執行速度非常快,使得Node.js在處理高并發請求時表現出色。
  4. ?模塊化體系?: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的功能更強大哦,快快點贊收藏吧~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/71387.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71387.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/71387.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Git 修改或刪除某次提交信息

Git 修改或刪除某次提交信息 情況一:未推送到遠程倉庫修改提交信息刪除提交信息(替換為空信息)修改歷史提交信息刪除歷史提交信息 情況二:已推送到遠程倉庫修改最新提交信息并推送到遠程倉庫修改歷史提交信息并推送到遠程倉庫 情況…

DeepSeek崛起:如何在云端快速部署你的專屬AI助手

在2025年春節的科技盛宴上,DeepSeek因其在AI領域的卓越表現成為焦點,其開源的推理模型DeepSeek-R1擅長處理多種復雜任務,支持多語言處理,并通過搜索引擎獲取實時信息。DeepSeek因其先進的自然語言處理技術、廣泛的知識庫和高性價比…

DeepSeek部署到本地(解決ollama模型下載失敗問題)

一、下載ollama軟件安裝 1、下載ollama軟件 Ollama 下載完成后可以直接進行安裝(外網,速度可能會有點慢) 2、修改安裝目錄 進去下載的目錄,使用cmd打開終端輸入OllamaSetup.exe /DIRE:\MySoftware\Ollama 輸入完成后會自動打開…

GPT1 大模型

GPT1 大模型 模型架構訓練過程 GPT-1 : 采用傳統的語言模型方法進行預訓練,擅長處理自然語言生成任務(NLG)OpenAI 在 2018 年 6 月推出 1.17 億個參數的 GPT-1 (Generative Pre-training , 生成式預訓練) 數據集 : 數據來源 : BooksCorpus…

?1.HTML、CSS 和 JavaScript 是什么?

?? HTML、CSS 和 JavaScript 是構建網頁的三大核心技術,它們相互協作,讓網頁呈現出豐富的內容、精美的樣式和交互功能。以下為你詳細介紹: 🦋1. HTML(超文本標記語言) 定義:HTML 是一種用于描…

x86平臺基于Qt+opengl優化ffmpeg軟解碼1080P視頻渲染效率

一般的在arm嵌入式平臺,大多數板子都要硬解碼硬件渲染的框架,使用即可。 在x86下比較麻煩了。 優化的思路一共有以下幾個方面, 1. 軟解碼變成硬解碼 2. 將YUV轉QImage的操作轉移到GPU 3. QWidget渲染QImage變成opengGL渲染AVFrame 這三點…

ocr智能票據識別系統|自動化票據識別集成方案

在企業日常運營中,對大量票據實現數字化管理是一項耗時且容易出錯的任務。隨著技術的進步,OCR(光學字符識別)智能票據識別系統的出現為企業提供了一個高效、準確的解決方案,不僅簡化了財務流程,還大幅提升了…

docker批量pull/save/load/tag/push鏡像shell腳本

目錄 注意: 腳本內容 執行效果 注意: 以下腳本為shell腳本通過docker/nerdctl進行鏡像獨立打包鏡像的相關操作腳本內倉庫信息和鏡像存取路徑需自行更改需自行創建images.txt并填寫值,并且與腳本位于同級目錄下 [rootmaster01 sulibao]# l…

利用Java爬蟲精準獲取商品銷量詳情:實戰案例指南

在電商領域,商品銷量數據是衡量產品受歡迎程度和市場表現的關鍵指標。精準獲取商品銷量詳情不僅能幫助商家優化產品策略,還能為市場研究和數據分析提供豐富的數據資源。本文將詳細介紹如何利用Java爬蟲技術精準獲取商品銷量詳情,并分享關鍵技…

30 款 Windows 和 Mac 下的復制粘貼軟件對比

在日常電腦操作中,復制粘貼是極為高頻的操作,一款好用的復制粘貼軟件能極大提升工作效率。以下為你詳細介紹 30 款 Windows 和 Mac 下的復制粘貼軟件,并對比它們的優缺點,同時附上官網下載地址,方便大家獲取軟件。 Pa…

【Linux】Linux 文件系統——有關 inode 不足的案例

??大家好,我是練小杰,今天周二了,明天星期三,還有三天就是星期五了,堅持住啊各位!!!😆 本文是對之前Linux文件權限中的inode號進行實例討論,看到博客有錯誤…

WPF快速創建DeepSeek本地自己的客戶端-基礎思路版本

開發工具:VS 2015 開發環境:.Net 4.0 使用技術:WPF 本篇文章內容: 本地部署DeepSeek以后一般使用網頁工具(如Chatbox)或者DOS窗口與其對話。本篇文章使用WPF創建一個基礎版的對話工具。 一、搭建本地DeepS…

VSCode本地python包“無法解析導入”

問題現象 在使用 VSCode 編寫 Python 代碼時,雖然程序能正常運行,但遇到“無法解析導入”的問題,導致代碼無法高亮。 解決方法 配置 python.autoComplete.extraPaths 打開 VSCode 設置(CtrlShiftP -> Preferences: Open Wo…

目標檢測IoU閾值全解析:YOLO/DETR模型中的精度-召回率博弈與工程實踐指南

一、技術原理與數學本質 IoU計算公式: IoU \frac{Area\ of\ Overlap}{Area\ of\ Union} \frac{A ∩ B}{A ∪ B}閾值選擇悖論: 高閾值(0.6-0.75):減少誤檢(FP↓)但增加漏檢(FN↑…

藍橋杯備考:二分算法之木材加工

P2440 木材加工 - 洛谷 這種題我們就是把答案枚舉出來,然后對答案進行二分,然后再進行判斷 比如我們這道題,我們枚舉切割的長度,然后由于切割長度越長切割段數越少 切割長度越短,切割段數越多的性質,我們…

Mongodb數據管理

Mongodb數據管理 1.登錄數據庫,查看默認的庫 [rootdb51~]# mongo> show databases; admin 0.000GB config 0.000GB local 0.000GB> use admin switched to db admin > show tables system.version > admin庫:admin 是 MongoDB 的管理…

QT基礎七、用純代碼編寫界面

終于迎來了界面開發的實戰環節!今天我們將通過純代碼的方式,親手打造一個界面。如果你對 Qt 感興趣,歡迎訂閱我的 Qt 基礎入門專欄 (完全免費哦)。雖然前面幾篇文章主要是基礎知識講解,可能會顯得稍微平淡&…

我用AI做數據分析之數據清洗

我用AI做數據分析之數據清洗 AI與數據分析的融合效果怎樣? 這里描述自己在使用AI進行數據分析(數據清洗)過程中的幾個小故事: 1. 變量名的翻譯 有一個項目是某醫生自己收集的數據,變量名使用的是中文,分…

C++11 thread

文章目錄 C11 線程庫線程對象的構造方式無參的構造函數調用帶參的構造函數調用移動構造函數thread常用成員函數 this_thread命名空間join && detachmutex C11 線程庫 線程對象的構造方式 無參的構造函數 1、調用無參的構造函數,調用無參的構造函數創建出來的線程對象…

List<Map<String, Object>> 如何對某個字段求和

在Java中&#xff0c;如果你有一個List<Map<String, Object>>的結構&#xff0c;并且你想要對某個特定字段進行求和&#xff0c;你可以使用Java 8的Stream API來簡化這個過程。下面是一個示例代碼&#xff0c;演示如何對某個字段進行求和。 假設你有一個List<M…