在大型網絡結構中,或流量大的網站上,負載均衡是必備的。
用於實現流量負載、高可用。
負載均衡常用的是NGINX、HAProxy、F5等。
而我們的Node.JS開發,實現一個負載均衡,是不那麼困難的。
本文將實現一個負載均衡系統,而且是一個高端的動態負載均衡系統。
它將備以下功能:
1、動態添加負載;
2、自動、隨機選擇負載。
使用效果:
1、添加負載:
密碼的設置是為了安全使用,防止被非法添加負載。
目標指的就是負載。
比如通過這裡操作三次,即添加三個負載。
2、訪問效果,負載見效:
圖中的序號,顯示的是使用的負載序號,可見不同的負載已啟用。
在現實實用時,如果添加的是不同機器,不同服務器,則這個序號可能代表的是機器號等。
完整代碼:
本項目由兩個文件組成,一個主程序blance.JS用於實現負載均衡,一個網頁文件blance.HTML,用於添加負載。
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的商用負載均衡系統原理、實現基本一致,它是一個完整的負載均衡系統。