使用Nodejs 的http-proxy 模块做代理服务器的尝试

我今天突然想到一个问题,如果使用nginx 作为nodejs 的代理服务器,那么如果nodejs的应用需要进行升级的话,如何实现热更新。

  第一种办法:使用nodejs搭建一个代理服务器,通过对请求的监听来判断当前的nodejs服务实例的工作情况(有多少未处理完的请求)来过滤请求,比如我有三个服务实例,1,2,3,我现在想进行升级,需要对服务进行重启,但是三个实例不能同时重启,这个时候,就需要这个代理服务器进行一个判定,通过这个代理服务器,可以看到每个实例当前的在处理的请求数量,同时也可以指定哪个进程进行断后,哪些 进程进行挂断,当然挂断的步骤是:先由代理服务器切断请求,不在给该进程发送新的请求,同时,代理服务器随时监听这些被“判死刑”的进程的请求数量的数量,如果没有请求的挂起,那就重启。当这些进程重启完成以后,这个断后的进程按照以上的步骤进行重启。 代理服务器的核心代码如下。

var http = require('http'),
    httpProxy = require('http-proxy');

//
// Create a proxy server with latency
//
var proxy = httpProxy.createProxyServer();

var reqNum  = 0; // 缓存目前请求的数量



proxy.on("proxyRes",()=>{
    reqNum --;
    console.log("完成一个请求,当前的剩余的请求数量是 "+reqNum);
})
proxy.on("proxyReq",()=>{
    reqNum++;
    console.log("接收到一个请求,当前的请求数量是 "+reqNum);
})

//
// Create your server that makes an operation that waits a while
// and then proxies the request
//
http.createServer(function (req, res) {
    // This simulates an operation that takes 500ms to execute
    setTimeout(function () {
        proxy.web(req, res, {
            target: 'http://localhost:9008'
        },(e)=>{
           console.log("proxy error call back ");
           console.log(e);
        });
    }, 10);
}).listen(8008);

//
// Create your target server
//
http.createServer(function (req, res) {
    setTimeout(()=>{
        res.writeHead(200, { 'Content-Type': 'text/plain' });
        res.write('request successfully proxied to: ' + req.url + '\n' + JSON.stringify(req.headers, true, 2));
        res.end();
    },10*1000)
}).listen(9008);


第二种办法:更改nginx的配置文件,比如,我的nginx代理了 82、81 这两个内部的服务程序,现在我想升级,这两个服务都需要重启,做法可以是这样的,再重启两个进程,端口分别是 83,,84。 同时更改nginx的配置文件,分别代理 83,84,但是更改完成之后需要平滑重启。这种方式比较上面的简单很多,也不用自己写程序实现。


总结:我还是回到了程序员的思维,一想到什么事情,首先得第一反应就是自己能不能开发一个程序来解决问题,没思考现有的程序、工具是否能够完成这个事情。虽然在思考如何实现的过程中,我也能学习很多的东西,比如http-proxy的使用,但是这不应该是我的第一个反应,而是其次的反应。



你可能感兴趣的:(Nodejs)