在实际工程开发中,会有前后端分离的需求。

为了平滑的完成前端请求到后端各个独立服务,需要一个中间件实现请求转发的功能,利用Nginx可以实现,在这里,使用nodejs实现一个反向代理服务器。
 
实际前端项目背景是node+express做前端路由,提供页面的基础渲染和请求转发。
后端使用java springboot开发多个微服务(这里没有使用spring cloud Eureka 做服务管理与API协调),每个服务的IP一致,端口不一致。
 
实验环境:nodejs+express端口是3001,启动一个java服务,端口是8088,在java中添加了一个filter,用来输出收到的请求地址,使用postman左右客户端发起请求
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) req;
System.out.println("请求地址是"+((HttpServletRequest) req).getRequestURI());

首先在原express工程下安装“http-proxy-middleware”中间件

npm install --save-dev http-proxy-middleware

在express的app.js中进行引用

var proxy = require('http-proxy-middleware');

根据实际使用情况,进行代理配置

1、转发所有http请求

var options = {
target: 'http://localhost:8088', // 目标主机
changeOrigin: true, // 需要虚拟主机站点
};
var exampleProxy = proxy(options); //开启代理功能,并加载配置
app.use('/', exampleProxy);//对地址为’/‘的请求全部转发

测试:向127.0.0.1:3001发起任何请求,查看java端接收的情况

请求URL     服务接输入结果
127.0.0.1:3001/ 请求地址是/
127.0.0.1:3001/test 请求地址是/test
127.0.0.1:3002/test 不转发

2、转发指定path的请求

app.use('/api', exampleProxy);

测试:

请求URL     服务接输入结果
127.0.0.1:3001/api/test 请求地址是/api/test
127.0.0.1:3001/test 不转发
127.0.0.1:3001/api 请求地址是/api
127.0.0.1:3002/test 不转发

3、对指定path规则进行重定向

var options = {
target: 'http://localhost:8088', // 目标主机
changeOrigin: true, // 需要虚拟主机站点
ws: true, // 是否代理websocket
pathRewrite: {
'^/api/old-path' : '/api/new-path',
'^/api/remove/path' : '/path',
'^/api/auth/login':'/path'
}
};
var exampleProxy = proxy(options); //开启代理功能,并加载配置
app.use('/api', exampleProxy);//对地址为’/‘的请求全部转发

测试:

请求URL     服务接输入结果
127.0.0.1:3001/api/old-path 请求地址是/api/new-path
127.0.0.1:3001/api/remove/path 请求地址是/path
127.0.0.1:3001/api/auth/login 请求地址是/path
127.0.0.1:3001/api/test 请求地址是/api/test
127.0.0.1:3001/test 不转发
4、对指定规则进行路由重定向
这里可以简单理解为,加入目前我启动了2个及以上的java服务,端口分别是8088,8089,但前端发起的请求均是指向127.0.0.1:3001的,代理需要根据实际的前端请求,解析路径后,分发到不同端口(8088,8089)的java服务中
var options = {
target: 'http://localhost:8089', // 这里默认转发目标为127.0.0.1:8089
router: {
'/rest': 'http://localhost:8088',//如果请求路径是/api/rest,则将url的请求路由重定向
'127.0.0.1:3001/api/8003': 'http://localhost:8003', // 服务该url则重定向
}
};
var exampleProxy = proxy(options); //开启代理功能,并加载配置
app.use('/api', exampleProxy);//对地址为’/‘的请求全部转发

测试:

请求URL     服务接输入结果
127.0.0.1:3001/api/rest 8088:请求地址是/api/rest
127.0.0.1:3002/api/rest 无响应
127.0.0.1:3001/api 8088:请求地址是/api
127.0.0.1:3001/api/8003 转发失败(因为我们目前没有8003端口的服务)
127.0.0.1:3001/api/rest/3232 8088:请求地址是/api/rest/3232
127.0.0.1:3001/api 8089:请求地址是/api
这里需要注意,代理默认对于/api下的所有请求,都转发至8089端口的服务,对于router中的配置采取例外处理,会工具规则转发至8088服务或8003服务
 
总结:
实际工程中,推荐采用第三种情况,通过“/api”等通配字符来区别所有要转发的请求和常规http的页面渲染请求。再根据实际后台服务接口,去配置不同的router规则即可。

使用Nodejs进行反向代理的更多相关文章

  1. windows下nginx配合nodejs进行反向代理

    本文原创,转载请附上原作者链接!https://www.cnblogs.com/LSWu/articles/14848324.html 1.安装node.js 从node.js官网上下载node.js ...

  2. IIS 下 部署nodejs 使用反向代理

    目标服务器:targetServer 配置反向代理的服务器:reveseProxServer iis应该是iis7及以上版本,才可以. 1.确定最终访问的网址:比如www.baidu.com  .ww ...

  3. 腾讯云下安装 nodejs + 实现 Nginx 反向代理

    本文将介绍如何给腾讯云上的 Ubuntu Server 12.04 LTS 64位主机安装 node 及 nginx,并简单配置反向代理. 笔者在整个安装过程中遇到不少麻烦(不赘述),如果你希望少踩坑 ...

  4. nginx做nodejs(express等通用)反向代理

    首先配置环境nginx+nodejs...(没有请看我的其他文章,此处不重复) cd 到nginx的site-available目录 ubuntu的在 cd /etc/nginx/site-avail ...

  5. 记录一下,如何配置nodejs nginx的反向代理

    本文是在mac下配置nodejs 在nginx下的反向代理 1.安装nodejs,之前就安装了. 2.安装nginx ,我采用的直接源码安装 3.进入 /usr/local/nginx/conf 目录 ...

  6. 在IIS7中使用ARR(Application Request Routing)反向代理虚拟目录到Nodejs站点

    目标: 1.访问www.arrdemo.com/proxy 跳转到 localhost:8898的Nodejs站点 2.Nodejs站点的页面可以返回到浏览器,包括js,css,图片 3.Nodejs ...

  7. CentOS安装Nginx,并配置nodejs反向代理

    安装介绍 安装位置:/usr/local/nginx nginx安装包下载地址:http://nginx.org/download/nginx-1.7.11.tar.gz 安装依赖软件 安装nginx ...

  8. mark一篇文章--用nodejs搭建一个本地反向代理环境

    调试线上代码的时候,我们经常遇到的一个问题就是 本地一套环境,线上一套环境,本地没有的文件用线上的这种需求.我简单来说下使用nodejs如何做到. 先说下不用nodejs我们怎么做,工具比如fiddl ...

  9. nodejs服务实现反向代理,解决本地开发接口请求跨域问题

    前后端分离项目需要解决第一个问题就是,前端本地开发时如何解决通过ajax请求产生的跨域的问题.一般的做法是通过本地配置nginx反向代理进行处理的,除此之外,还可以通过nodejs来进行代理接口.当然 ...

随机推荐

  1. python 接口自动化测试(一)

    一.测试需求描述 对服务后台一系列SOAP接口功能测试 参数传入:根据接口描述构造不同的参数输入值(Json格式) 二.程序设计 通过Excel配置具体的测试用例数据 保存参数为Json格式,预写入预 ...

  2. mysql语句sum求和为null的问题

    select sum(price) as price from order where status='SUCCESS'; 如果price对应的所有的值为0,那么算出来的和为null: 可以采用ifn ...

  3. virtual dom的实践

    最近基于virtual dom 写了一个小框架-aoy. aoy是一个轻量级的mvvm框架,基于Virtual DOM.虽然现在看起来很单薄,但我做了完善的单元测试,可以放心使用.aoy的原理可以说和 ...

  4. background-size IE8兼容方案

    根据canius(http://caniuse.com/#search=background-size),background-size兼容性为IE9以及以上浏览器,如下图所示. 实例代码: < ...

  5. 解锁redis锁的正确姿势

    解锁redis锁的正确姿势 redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为.这个时候我们就要用到锁.锁的方式有好几种,php不能在内存中用锁 ...

  6. Halloc内存分配器

    MAX_NSBS 8192:默认的最大superblocks数量 SB_SET_SZ(MAX_NSBS / WORD_SZ):superblock set的大小,每个set32个superblcoks ...

  7. Java异常处理总结

    题记:本文为工作十年回顾总结系列之Java语言之异常处理篇,主要内容为<Thinking in Java >第四版和<Effective Java>第二版的阅读笔记,网上流传的 ...

  8. Android基本控件和事件以及消息总结

    Android学生空间界面设计涉及到的常用基本控件有TextView,EditText,Button,ImageView,CheckBox,RadioButton,基本事件有触屏和键盘事件,包括onT ...

  9. 【前端童鞋看过来!】给大家分享网盘里前端相关书籍,主要是和网络通信(HTTP/TCP/IP)及javascript相关的

    百度云链接:https://pan.baidu.com/s/1kUPdf5H(无密码) 截图: <HTTP权威指南> [豆瓣书评]:此书第一部分是HTTP的概略,如果你没有时间,通读第一部 ...

  10. 图的基本算法(BFS和DFS)(转载)

    图是一种灵活的数据结构,一般作为一种模型用来定义对象之间的关系或联系.对象由顶点(V)表示,而对象之间的关系或者关联则通过图的边(E)来表示. 图可以分为有向图和无向图,一般用G=(V,E)来表示图. ...