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

为了平滑的完成前端请求到后端各个独立服务,需要一个中间件实现请求转发的功能,利用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. Android + OpenCV - Finding extreme points in contours

    原文链接:http://answers.opencv.org/question/134783/android-opencv-finding-extreme-points-in-contours/ 导 ...

  2. SVN操作手册(part1&part2)——SVN安装

    SVN操作手册 1.关于SVN 有一个简单但不十分精确比喻: SVN = 版本控制 + 备份服务器 简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每次上传到这个服务器的档案内容. ...

  3. 对于用div+css随心所欲布局的思考

    在div+css取代Table成为主流的时代,学会用其进行随心所欲的布局是一个不可回避的技能.那么,重点掌握哪几个要点呢? 整体布局:从整体到局部的顺序进行布局,逐步定义div集css样式: 灵活运用 ...

  4. linux性能监控分析及通过nmon_analyse生成分析报表

    nmon是一款分析 AIX 和 Linux 性能的免费工具 nmon 工具还可以将相同的数据捕获到一个文本文件,便于以后对报告进行分析和绘制图形.输出文件采用电子表格的格式 (.csv). 性能介绍 ...

  5. 利用select实现伪并发的socket

    使用socket模块可以实现程序之间的通信,但是server在同一时刻只能和一个客户端进行通信,如果要实现一个server端可以和多个客户端进行通信可以使用 1.多线程 2.多进程 3.select ...

  6. MCMC(二)马尔科夫链

    MCMC(一)蒙特卡罗方法 MCMC(二)马尔科夫链 MCMC(三)M-H采样和Gibbs采样(待填坑) 在MCMC(一)蒙特卡罗方法中,我们讲到了如何用蒙特卡罗方法来随机模拟求解一些复杂的连续积分或 ...

  7. [SinGuLaRiTy] 2017-03-27 综合性测试

    [SinGuLaRiTy-1013] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. 这是 三道 USACO 的题...... 第一题:奶牛飞 ...

  8. 使用U盘安装ubuntu 12.04(使用大白菜u盘启动工具)

    家里有个u盘启动盘,用大白菜U盘工具做的. 1.把iso文件放到u盘里,把ISO文件中的casper目录下的vmlinuz和initrd拷贝到u盘根目录下: 2.修改启动顺序,选u盘启动: 3.启动时 ...

  9. 02 Learning to Answer Yes/No

    Perceptron Learning Algorithm 感知器算法, 本质是二元线性分类算法,即用一条线/一个面/一个超平面将1,2维/3维/4维及以上数据集根据标签的不同一分为二. 算法确定后, ...

  10. C#各个版本中的新增特性详解

    序言 自从2000年初期发布以来,c#编程语言不断的得到改进,使我们能够更加清晰的编写代码,也更加容易维护我们的代码,增强的功能已经从1.0搞到啦7.0甚至7.1,每一次改过都伴随着.NET Fram ...