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

为了平滑的完成前端请求到后端各个独立服务,需要一个中间件实现请求转发的功能,利用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. 机器学习基石 1 The Learning Problem

    机器学习基石 1 The Learning Problem Introduction 什么是机器学习 机器学习是计算机通过数据和计算获得一定技巧的过程. 为什么需要机器学习 1 人无法获取数据或者数据 ...

  2. SpringMVC中重定向底层原理

      只要将数据放入model中, 也能取到值,原因是model临时放入session域中,当从定向到另一个url时,底层把数据拼接在url地址后面(重定向一定是get请求方式),同时将session域 ...

  3. TCP/IP笔记(三)数据链路层

    数据链路的作用 数据链路层的协议定义了通过通信媒介互连的设备之间传输的规范.通信媒介包括双绞线电缆.同轴电缆.光纤.电波以及红外线等介质.此外,各个设备之间有时也会通过交换机.网桥.中继器等中转数据. ...

  4. 分离数据库时出错:无法对数据库'XXX' 执行删除,因为它正用于复制"的解决方法

    出现的原因是要分离的数据库是一个发布订阅的数据库.因为正在复制,所以无法脱机. 解决办法是停止发布订阅,或者删掉它..再分离.有部分情况是在复制目录下并没有看到发布订阅. 有可能是因为以前建立发布订阅 ...

  5. python文件读写出现乱码总结

    1.错误的打开方式 #coding=utf-8f = open("test.txt",'w+')f.write('Mars is slim,isn\'he? \n 火星教')pri ...

  6. IOS开发创建开发证书及发布App应用(六)——打包应用

    6.打包应用 如下图,生成之后点击下面红框的按钮,按时间排序,然后点最新的一次生成 从右侧生成日志中找到如下图红框标识的部分,找到 -output ,把下面浅蓝色选中,这是app生成的文件夹路径 点击 ...

  7. SQL 游标的应用

    ----------------SQL游标应用-----------------if object_id('tempdb..#test0001') is not null drop table #te ...

  8. 手机自动化测试:Appium源码分析之跟踪代码分析五

    手机自动化测试:Appium源码分析之跟踪代码分析五   手机自动化测试是未来很重要的测试技术,作为一名测试人员应该熟练掌握,POPTEST举行手机自动化测试的课程,希望可以训练出优秀的手机测试开发工 ...

  9. UIDatePicker的使用

    UIDatePicker的介绍 UIDatePicker这个类的对象让用户可以在多个车轮上选择日期和时间.iPhone手机上的‘时钟’应用程序中的时间与闹铃中便使用了该控件.使用这个控件时,如果你能配 ...

  10. IONIC2新建项目并添加导航

    一.   基础搭建 1.      新建IONIC2项目 ionic start myApp tabs --v2 不加--v2会新建ionic1的项目 2.      运行项目 cd myApp io ...