Node.JS編程入門59:負載均衡的實現。

在大型網絡結構中,或流量大的網站上,負載均衡是必備的。

用於實現流量負載、高可用

Node.JS編程入門59:負載均衡的實現。

負載均衡常用的是NGINX、HAProxy、F5等。

而我們的Node.JS開發,實現一個負載均衡,是不那麼困難的。

本文將實現一個負載均衡系統,而且是一個高端的動態負載均衡系統。

它將備以下功能:

1、動態添加負載;

2、自動、隨機選擇負載。

使用效果:

1、添加負載:

Node.JS編程入門59:負載均衡的實現。

密碼的設置是為了安全使用,防止被非法添加負載。

目標指的就是負載。

比如通過這裡操作三次,即添加三個負載。

2、訪問效果,負載見效:

Node.JS編程入門59:負載均衡的實現。

圖中的序號,顯示的是使用的負載序號,可見不同的負載已啟用。

在現實實用時,如果添加的是不同機器,不同服務器,則這個序號可能代表的是機器號等。

完整代碼:

本項目由兩個文件組成,一個主程序blance.JS用於實現負載均衡,一個網頁文件blance.HTML,用於添加負載。

Node.JS編程入門59:負載均衡的實現。

blance.JS代碼:

//*****************************************/

// Blance

//

// Auther: WangLiwen

//*****************************************/

//三方模塊

var express = require("express")();

var http_proxy = require("http-proxy");

var body_parser = require("body-parser");

//端口

var port = 8090;

//密碼

var password = "pass";

//調試開關

var debug = true;

//代理

var proxy = http_proxy.createProxyServer({});

//存放目標

var pool = [];

//監聽

express.listen(port);

console.log("blance server at port:",port);

proxy.on("error",function(err,req,res){

try{

res.end("error");

}catch(e){

console.log(e.message);

}

});

//body-parser

express.use(body_parser.urlencoded({extended: true}));

//註冊

express.post("/register_blance",function(req,res,next){

//密碼,用於校驗if(req.body.password == password){

//添加到負載均衡池

pool.push(req.body.target);

console.log("add blance:",req.body.target);

res.end("blance added!");

}else{

console.log("register blance error: password error!");

console.log("error!");

}

return;

});

//反註冊

express.post("/unregister_blance",function(req,res,next){

//密碼,用於校驗if(req.body.password == password){

//遍歷for(i=0; i

//匹配if(pool[i] == req.body.target){

//刪除delete pool[i];

pool.splice(i,1);

console.log("remove blance:",req.body.target);

res.end("blance removed!")

}

}

}else{

console.log("unregister blance error: password error!");

res.end("error!")

}

return;

});

//隨機訪問負載

express.use(function(req,res,next){

if(pool.length == 0){

console.log("error: blance pool is null.")

return;

}

//隨機數var rnd = random_number(0,pool.length - 1);

//訪問

proxy.web(req, res, {target: pool[rnd], selfHandleResponse : false, changeOrigin:false} );

console.log("blance visit: ",rnd, pool[rnd],",url:",req.url);

//next();

})

//範圍內隨機數

function random_number(min,max){

var range = max - min;

var rand = Math.random();

var num = min + Math.round(rand * range);

return num;

}

blance.HTML:

Document

密碼:

目標

由代碼中可知,這是一個DEMO,雖如此,但它與ShareWAF的商用負載均衡系統原理、實現基本一致,它是一個完整的負載均衡系統。



分享到:


相關文章: