nodejs 服务器实现负载均衡
server.js
const express = require('express');
const { createProxyMiddleware } = require('http-proxy-middleware');
const axios = require('axios');const app = express();// 定义后端服务列表
const services = [{ target: 'http://localhost:3001' },{ target: 'http://localhost:3002' }
];// 检查服务存活性
async function isServiceAlive(target) {try {const response = await axios.get(target, { timeout: 2000 });return response.status === 200;} catch (error) {console.error(`Service at ${target} is not alive:`, error.message);return false;}
}// 获取活跃的服务
async function getActiveServices() {const checkPromises = services.map(async (service) => {const isAlive = await isServiceAlive(service.target);return isAlive ? service : null;});const results = await Promise.all(checkPromises);return results.filter(service => service);
}// 使用负载均衡中间件
app.use(async (req, res, next) => {const activeServices = await getActiveServices();if (activeServices.length > 0) {const randomService = activeServices[Math.floor(Math.random() * activeServices.length)];createProxyMiddleware({target: randomService.target,changeOrigin: true,onError: (err, req, res) => {console.error(`Proxy error: ${err.message}`);res.status(502).send('Bad Gateway');}})(req, res, next);} else {res.status(503).send('No available services');}
});// 启动负载均衡服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {console.log(`Load balancer is running on http://localhost:${PORT}`);
});
server1.js
const express = require('express');
const app = express();
const path = require("path")
app.use(express.static(path.join(__dirname, 'public')));const PORT = 3001;
app.listen(PORT, () => {console.log(`Server 1 is running on http://localhost:${PORT}`);
});
server2.js
const express = require('express');
const app = express();
const path = require("path")
app.use(express.static(path.join(__dirname, 'public')));const PORT = 3002;
app.listen(PORT, () => {console.log(`Server 2 is running on http://localhost:${PORT}`);
});
相关文章:
nodejs 服务器实现负载均衡
server.js const express require(express); const { createProxyMiddleware } require(http-proxy-middleware); const axios require(axios);const app express();// 定义后端服务列表 const services [{ target: http://localhost:3001 },{ target: http://localhost:…...
今日总结10.29
常见序列化协议有哪些 序列化(serialization)是将对象序列化为二进制形式(字节数组),一般也将序列化称为编码(Encode),主要用于网络传输、数据持久化等。常见的序列化协议包括以下几…...
使用 FastGPT 工作流实现 AI 赛博算卦,一键生成卦象图
最近那个男人写的汉语新解火遍了全网,那个男人叫李继刚,国内玩 AI 的同学如果不知道这个名字,可以去面壁思过了。 这个汉语新解的神奇之处就在于它只是一段几百字的提示词,效果却顶得上几千行代码写出来的应用程序。 这段提示词…...
vue3+ts实时播放视频,视频分屏
使用vue3以及播放视频组件Jessibuca Jessibuca地址 使用循环个数来实现分屏 效果图,四屏 九屏 dom代码 <div class"icon"><div class"icon-box"><span class"text">分屏:</span><el-icon …...
【网页设计】学成在线案例
Demo 典型的企业级网站,目的是为了整体感知企业级网站的布局流程,复习以前知识。 集合代码见文章最后。 5.1 准备素材和工具 学成在线 PSD 源文件。开发工具 PS(切图) sublime(代码) chrome࿰…...
一篇文章总结 SQL 基础知识点
1. 官方文档 MySQL:https://dev.mysql.com/doc/refman/8.4/en/ SQL Server:What is SQL Server? - SQL Server | Microsoft Learn Oracle:https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/loe.html 2. 术语 SQL S…...
vue Element U 解决表格数据不更新问题
最近在使用 Vue 和 Element UI 开发后台管理系统时,操作表单数据重新请求表格接口后遇到表格数据不更新的问题。后面查阅了些资料,这通常是由于 Vue 的响应式系统没有检测到数据的变化,或者数据更新后没有正确地触发视图的重新渲染。以下是一…...
PeView 命令行PE文件解析工具
PeView 是一款基于C/C开发的命令行版PE文件解析工具,专门用于解析Windows可执行文件并提供详尽的文件结构和交互式查询功能,帮助用户理解和分析目标程序的内部构成,是逆向分析和软件调试中的重要工具,本次分享工具源代码及使用方法…...
微信小程序25__实现卡片变换
先看效果图 实现代码如下: <view class"page" style"filter:hue-rotate({{rotation}}deg)"><view class"prev" catchtap"toPrev">《《《</view><view class"next" catchtap"toNext&q…...
使用Git进行团队协作开发
使用Git进行团队协作开发 Git简介 安装Git 在Windows上安装Git 在macOS上安装Git 在Linux上安装Git 设置Git用户信息 创建Git仓库 基本Git命令 添加文件 提交更改 查看状态 克隆仓库 推送更改 获取更改 分支管理 创建分支 切换分支 合并分支 删除分支 解决合并冲突 检查冲突…...
期货跟单、量化交易模拟演示系统
一、跟单下单 在“排行榜”中选择要跟单的用户,合约可以跟全部,也可以指定跟该用户的某一合约操作,选定跟单的倍数(操作手数的倍数)/手数(指定手数,可以不是对方的倍数),…...
Python小白学习教程从入门到入坑------第十八课 异常模块与包【下】(语法基础)
一、内置全局变量__name__ 在Python中,有一些内置的全局变量和特殊变量,它们是由Python解释器预定义的,可以在代码的任何地方直接使用。 这些变量通常用于提供关于当前解释器状态的信息,或者用于控制解释器的行为 在Python中&a…...
arcgis pro 3.3.1安装教程
一、获取方式: http://dt4.8tupian.net/2/29913a61b1500.pg3二、软件目录: 三、安装步骤: (1)安装软件运行环境windowsdesktop-runtime 8.0.4; (2)选中安装文件arcgispro_33zh_cn_190127.exe&…...
Spring 获取Cookie/Session
获取Cookie/Session Cookie & Session获取Cookie传统方法获取使用 Spring 获取 Cookie 获取Session传统方法使用 SpringBoot 获取 Session简洁获取 Session HTTP协议 自身是属于 无状态协议(默认情况下 HTTP 协议的客户端与服务端的这次通信,和下次的通信之间没…...
小红书接口数据查询优化指南
小红书,作为分享生活、购物心得与美妆护肤经验的热门社交媒体平台,对开发者而言,其数据接口具有极高的实用价值。本指南将聚焦于如何通过接口高效查询小红书数据,并提供清晰的步骤与示例代码。 一、前置准备 在深入查询之前&…...
数据结构 - 图
文章目录 一、图的基本概念二、图的储存结构1、邻接矩阵2、邻接表 三、图的遍历1、广度优先遍历2、深度优先遍历 四、最小生成树1、概念2、Kruskal算法3、Prim算法 五、最短路径问题1、单源最短路径--Dijkstra算法2、单源最短路径--Bellman-Ford算法3、多源最短路径--Floyd-War…...
如何在Linux系统中管理和优化Swap空间
如何在Linux系统中管理和优化Swap空间 Swap空间简介 检查Swap空间 创建Swap空间 创建Swap文件 创建Swap分区 配置Swap空间 编辑fstab文件 设置vm.swappiness Swap使用策略 调整vm.vfs_cache_pressure 设置vm.min_free_kbytes Swap空间的监控 使用top命令 使用free命令 Swap…...
瑞格智慧心理服务平台 NPreenSMSList.asmx sql注入漏洞复现
0x01 产品描述: 瑞格智慧心理服务平台是一个集心理测评、心理咨询、心理危机干预、心理放松训练等功能于一体的综合性心理健康服务平台。该平台由北京瑞格心灵科技有限公司开发,旨在为用户提供全方位的心理健康服务。0x02 漏洞描述:…...
大模型是否具备推理能力?解读苹果新论文:GSM-Symbolic和GSM8K
在人工智能领域,大模型的推理能力一直备受关注。OpenAI的GPT-4和其他大模型的表现令人惊叹,但究竟是否具备真正的数学推理和抽象逻辑能力?最近,苹果的研究人员发表了一篇题为“GSM-Symbolic:理解大语言模型中数学推理的…...
自动化部署-02-jenkins部署微服务
文章目录 前言一、配置SSH-KEY1.1 操作jenkins所在服务器1.2 操作github1.3 验证 二、服务器安装git三、jenkins页面安装maven四、页面配置自动化任务4.1 新建任务4.2 选择4.3 配置参数4.4 配置脚本 五、执行任务5.1 点击执行按钮5.2 填写参数5.3 查看日志 六、查看服务器文件七…...
Unity shader中TransformWorldToShadowCoord原理解析
TransformWorldToShadowCoord 的核心作用很简单:将你提供的世界坐标,转换到一个可以用于采样 Shadow Map 的坐标空间。它本质上是为你省去了手动编写矩阵乘法的繁琐步骤。🔍 核心原理:一个“三步走”的幕后过程函数内部主要执行了…...
Cursor AI免费VIP破解方案:如何绕过试用限制持续使用Pro功能
Cursor AI免费VIP破解方案:如何绕过试用限制持续使用Pro功能 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached yo…...
【JVM深度解析】第24篇:JVM内存模型(JMM)核心原理
摘要 JMM(Java Memory Model,Java 内存模型)是 Java 并发编程的基础,它定义了线程之间共享变量的可见性、有序性问题,以及如何通过 Happens-Before 规则和内存屏障来解决这些问题。理解 JMM,你才能真正明白…...
HTML怎么实现成就徽章放大预览_HTML悬停查看大图结构【教程】
用 transform: scale() 实现 hover 图片放大最省事,但需加 overflow: hidden 防溢出、transition 保证平滑、避免 position: absolute 破坏布局,并通过 data-large-src 或 background-image 解决高清图加载,同时适配移动端 touch 和 stacking…...
西门子1200 PLC罐装线项目:博图编程实践与精彩解析
西门子1200plc罐装线项目,程序包括modbus通讯,模拟量输入输出,西门子程序画面精彩,程序编辑分类清晰,非常具有参考学习意义,支持博图V13及以上版本打开在自动化控制领域,西门子1200 PLC以其强大…...
GHelper:如何用10MB替代华硕官方控制中心,实现极致轻量化的硬件掌控
GHelper:如何用10MB替代华硕官方控制中心,实现极致轻量化的硬件掌控 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyr…...
深入剖析C# OPC UA 服务器端源码:纯代码实现,无第三方支持库
C# OPC UA 服务器端源码 该源码未使用任何第三方支持库,纯代码实现一、项目概述 该源码是一个基于 C# 语言开发的 OPC UA 服务器端实现,未依赖任何第三方支持库,采用纯原生代码构建,遵循 OPC UA 规范,提供了完整的工业…...
前端路由管理方案
前端路由管理方案是现代Web应用开发中的核心技术之一,它决定了用户如何与单页面应用(SPA)交互,以及页面如何在不刷新的情况下实现动态切换。随着前端框架的普及,路由管理从简单的URL跳转演变为复杂的导航控制、权限校验…...
打造专属瑜伽海报!雯雯的后宫-造相Z-Image模型在内容创作中的实战应用
打造专属瑜伽海报!雯雯的后宫-造相Z-Image模型在内容创作中的实战应用 1. 引言:AI瑜伽海报创作新体验 在内容创作领域,视觉素材的重要性不言而喻。对于瑜伽教练、健康博主和内容创作者来说,高质量的专业瑜伽图片往往是稀缺资源。…...
用STM32和TFT屏做个点菜机:从硬件接线到菜单逻辑的完整实战(附源码)
STM32TFT点菜机实战:从硬件搭建到交互逻辑的全流程解析 在餐饮行业数字化转型的浪潮中,自助点餐终端正逐渐取代传统纸质菜单。对于嵌入式开发者而言,用STM32微控制器搭配TFT液晶屏打造一套点菜系统,不仅能巩固硬件驱动开发能力&am…...
