当前位置: 首页 > article >正文

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}`);
});


http://www.kler.cn/a/377458.html

相关文章:

  • stack和queue --->容器适配器
  • Spring 中的 Environment 对象
  • Kotlin的内置函数
  • A014-基于Spring Boot的家电销售展示平台设计与实现
  • 群控系统服务端开发模式-应用开发-业务架构逻辑开发第一轮测试
  • 建立maven项目常见问题解决办法
  • CF1152F2 Neko Rules the Catniverse (Large Version) 题解(插入类dp,状压,矩阵乘法,dp技巧)
  • npm入门教程19:npm包管理
  • 【Python】-蚂蚁森林问答题-查看当天的答案
  • C#核心(5)构造,析构,垃圾回收
  • 开源模型应用落地-qwen模型小试-Qwen2.5-7B-Instruct-玩转ollama-Modelfile文件(二)
  • 光耦合器的关键作用和创新---腾恩科技
  • 力扣1658.将x减到0的最小操作数
  • vue-verify-plugin。vue项目表单验证插件
  • Unity3D学习FPS游戏(8)装弹和弹夹UI显示
  • Android开发之——SOLID基础设计原则(掌握23种设计模式)其实开发之路如此简单
  • 苹果转向 Apple Silicon,Intel Mac 的支持时限倒计时
  • 通用型函数——冒泡排序
  • 商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?
  • spring-解析Scope注解
  • golang switch v := data.(type)
  • Flarum:简洁而强大的开源论坛软件
  • 活动回顾丨艾体宝《开源软件供应链安全的最佳实践》线下研讨会圆满落幕!
  • 五、SpringBoot3实战(1)
  • docker对nginx.conf进行修改后页面无变化或页面报错
  • 【运动的&足球】足球场地区域图像分割系统源码&数据集全套:改进yolo11-RFAConv