专栏首页性能与架构使用 NodeJS 实现反向代理

使用 NodeJS 实现反向代理

为什么使用 Node.js 实现反向代理

提到 反向代理 时我们通常会想到 Nginx,它配置简单,性能很好

那么使用 Node.js 实现反向代理有什么必要呢?

一个典型的使用场景就是 微服务网关

服务网关就有反向代理的功能

后端有很多个服务,每个服务又可能由多个一起提供服务,对于客户端来说,不需要关心这些服务的细节,只需要和网关打交道,由服务网关来指定服务提供者

后端具体有哪些可用的服务,是动态的,例如有问题的服务下线、新服务上线,在这种动态场景下,Nginx 就不太适合了,使用 Node.js 来做服务网关的话会更方便一些

例如 所有的 service 都去 ZooKeeper 中注册,Node.js 去 ZooKeeper 中动态获取可用服务列表

实现方式

Node.js 的 Http Proxy 模块可以轻松实现反向代理的功能

(1)安装 Http Proxy

npm install http-proxy

(2)创建模拟后端服务的server

service.js(监听 8000)

var http = require("http");
http.createServer(function(request, response) {
    console.log('request received');
    response.writeHead(200, {
        "Content-Type": "text/plain"
    });
    response.write("I'm service A");
    response.end();
}).listen(8000);
console.log('service started');

(3)创建反向代理server

proxy.js(监听 8080)

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

var proxy = httpProxy.createProxyServer();

proxy.on('error', function(err, req, res) {
    res.end();
});

var proxy_server = http.createServer(function(req, res) {
    proxy.web(req, res, {
        target: 'http://localhost:8000'
    });
});

proxy_server.listen(8080, function() {
    console.log('proxy server is running ');
});

(4)测试

先启动 service.js

node service.js

再启动 proxy.js

node proxy.js

浏览器中访问 proxy

http://localhost:8080/

可以看到 service 输出的信息 I'm service A

实现了反向代理的基本功能

本文分享自微信公众号 - 性能与架构(yogoup),作者:杜亦舒

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-01-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 微服务最佳实践 -- 如何拆分

    首先我们要确定出微服务的大致数量,数量很关键,因为数量越多,维护成本越大,一定不要超出团队的承受范围。确定了数量,我们再考虑怎么拆。

    dys
  • JS模块化开发的价值

    非模块化方式开发的痛苦 (1)命名冲突 起初,我们定义了一个通用功能的JS文件,例如 utils.js(其中有一个 each 函数),谁需要谁调用即可 但随着项...

    dys
  • Medium 微服务策略

    微服务架构的目标是帮助技术团队更快、更安全、更高质量的推动产品,服务解耦可以让团队快速迭代,对系统的影响最小。

    dys
  • R 集成算法③ 随机森林

    按这种算法得到的随机森林中的每一棵都是很弱的,但是大家组合起来就很厉害了。我觉得可以这样比喻随机森林算法:每一棵决策树就是一个精通于某一个窄领域的专家,这样在随...

    用户1359560
  • ServiceMesh入门的起点:构建一个微服务网关

    本文是在看了国外 Solo 公司 CTO 的博客之后整理的,本来是想按原文翻译,但是考虑到我自己在公司实践的思路,还是想把他的思路和我自己的思路做一些结合。所以...

    黑光技术
  • svg平移缩放

    svg平移缩放,我刚开始尝试的是自己处理外层容器的控制,结果发现能用,但是效果不太好,有拖尾现象,后来用个js库svg-pan-zoom即可。如果想支持手机端手...

    IT晴天
  • nginx 负载均衡

    例如目前有两台服务器,一个nginx服务器,一个web服务器(例如tomcat),nginx负责把所有请求转发到web服务器 ? 配置如下 server { ...

    dys
  • 让程序猿安心过大年,解密腾讯云SDN网络流量调度

    转眼又到春节,又到了亲朋好友大团圆的时刻。对程序猿和攻城狮来说,能否安安稳稳的过年就主要取决于网络是否安稳了,谁都不想在合家团圆吃年夜饭的时候因为网络故障加班。...

    腾讯云网络产品团队
  • 使用 numpy 切分训练集和测试集

    在机器学习的任务中,时常需要将一个完整的数据集切分为训练集和测试集。此处我们使用 numpy 完成这个任务。iris 数据集中有 150 条数据,我们将 120...

    DrawSky
  • JS-提取字符串—>>普通方法VS正则表达式

    xing.org1^

扫码关注云+社区

领取腾讯云代金券