【动态路由】系统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会将请求放入队列中,并继续执行后续代码。当请求的结果准备好后,通过回调函数来处理结果。
主要特性
- 非阻塞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的功能更强大哦,快快点赞收藏吧~