当前位置:   article > 正文

Node.JS实战59:负载均衡的实现。_nodejs proxy 负载均衡

nodejs proxy 负载均衡

在大型网络结构中,或流量大的网站上,负载均衡是必备的。

用于实现流量负载、高可用

负载均衡常用的是NGINX、HAProxy、F5等。

而我们的Node.JS开发,实现一个负载均衡,是不那么困难的。

本文将实现一个负载均衡系统,而且是一个高端的动态负载均衡系统。

它将备以下功能:

1、动态添加负载;

2、自动、随机选择负载。

使用效果:

1、添加负载:

密码的设置是为了安全使用,防止被非法添加负载。

目标指的就是负载。

比如通过这里操作三次,即添加三个负载。

2、访问效果,负载见效:

 

图中的序号,显示的是使用的负载序号,可见不同的负载已启用。

在现实实用时,如果添加的是不同机器,不同服务器,则这个序号可能代表的是机器号等。

完整代码:

本项目由两个文件组成,一个主程序blance.JS用于实现负载均衡,一个网页文件blance.HTML,用于添加负载。

blance.JS代码:

  1. //*****************************************/
  2. // Blance
  3. // ShareWAF.com 负载均衡模块
  4. // Auther: WangLiwen
  5. //*****************************************/
  6. //三方模块
  7. var express = require("express")();
  8. var http_proxy = require("http-proxy");
  9. var body_parser = require("body-parser");
  10. //端口
  11. var port = 8090;
  12. //密码
  13. var password = "pass";
  14. //调试开关
  15. var debug = true;
  16. //代理
  17. var proxy = http_proxy.createProxyServer({});
  18. //存放目标
  19. var pool = [];
  20. //监听
  21. express.listen(port);
  22. console.log("blance server at port:",port);
  23. proxy.on("error",function(err,req,res){
  24. try{
  25. res.end("error");
  26. }catch(e){
  27. console.log(e.message);
  28. }
  29. });
  30. //body-parser
  31. express.use(body_parser.urlencoded({extended: true}));
  32. //注册
  33. express.post("/register_blance",function(req,res,next){
  34. //密码,用于校验
  35. if(req.body.password == password){
  36. //添加到负载均衡池
  37. pool.push(req.body.target);
  38. console.log("add blance:",req.body.target);
  39. res.end("blance added!");
  40. }else{
  41. console.log("register blance error: password error!");
  42. console.log("error!");
  43. }
  44. return;
  45. });
  46. //反注册
  47. express.post("/unregister_blance",function(req,res,next){
  48. //密码,用于校验
  49. if(req.body.password == password){
  50. //遍历
  51. for(i=0; i<pool.length; i++){
  52. //匹配
  53. if(pool[i] == req.body.target){
  54. //删除
  55. delete pool[i];
  56. pool.splice(i,1);
  57. console.log("remove blance:",req.body.target);
  58. res.end("blance removed!")
  59. }
  60. }
  61. }else{
  62. console.log("unregister blance error: password error!");
  63. res.end("error!")
  64. }
  65. return;
  66. });
  67. //随机访问负载
  68. express.use(function(req,res,next){
  69. if(pool.length == 0){
  70. console.log("error: blance pool is null.")
  71. return;
  72. }
  73. //随机数
  74. var rnd = random_number(0,pool.length - 1);
  75. //访问
  76. proxy.web(req, res, {target: pool[rnd], selfHandleResponse : false, changeOrigin:false} );
  77. console.log("blance visit: ",rnd, pool[rnd],",url:",req.url);
  78. //next();
  79. })
  80. //范围内随机数
  81. function random_number(min,max){
  82. var range = max - min;
  83. var rand = Math.random();
  84. var num = min + Math.round(rand * range);
  85. return num;
  86. }

blance.HTML:

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <style>
  9. </style>
  10. </head>
  11. <body>
  12. <form action="http://localhost:8090/register_blance" method="post">
  13. <div>密码:<input type="password" name="password"></div>
  14. <div>目标<input type="text" name="target"></div>
  15. <div><input type="submit" name="" value="提交"></div>
  16. </form>
  17. </body>
  18. </html>

由代码中可知,这是一个DEMO,虽如此,但它与ShareWAF的商用负载均衡系统原理、实现基本一致,它是一个完整的负载均衡系统。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/凡人多烦事01/article/detail/378136
推荐阅读
相关标签
  

闽ICP备14008679号