商务服务
如何编写一个 HTTP 反向代理服务器
2024-10-31 19:52

如果你经常使用 Node.js 编写 Web 服务端程序,一定对使用 Nginx 作为 反向代理 服务并不陌生。在生产环境中,我们往往需要将程序部署到内网多台服务器上,在一台多核服务器上,为了充分利用所有 CPU 资源,也需要启动多个服务进程,它们分别监听不同的端口。然后使用 Nginx 作为反向代理服务器,接收来自用户浏览器的请求并转发到后端的多台 Web 服务器上。大概工作流程如下图

如何编写一个 HTTP 反向代理服务器

在这里插入图片描述

在 Node.js 上实现一个简单的 HTTP 代理程序还是非常简单的,本文章的例子的核心代码只有 60 多行,只要理解 内置 http 模块 的基本用法即可,具体请看下文。

使用 创建的 HTTP 服务器,处理请求的函数格式一般为 (下文简称为 ,其接收两个参数,分别为 http.IncomingMessage 和 http.ServerResponse 对象,我们可以通过这两个对象来取得请求的所有信息并对它进行响应。

主流的 Node.js Web 框架的中间件(比如 connect)一般都有两种形式

  • 中间件不需要任何初始化参数,则其导出结果为一个
  • 中间件需要初始化参数,则其导出结果为中间件的初始化函数,执行该初始化函数时,传入一个 对象,执行后返回一个

为了使代码更规范,在本文例子中,我们将反向代理程序设计成一个中间件的格式,并使用以上第二种接口形式

  • 上面的代码中, 是反向代理服务器中间件的初始化函数,它接受一个对象参数, 是后端服务器地址列表,每个地址为 这样的格式
  • 执行 后返回一个 这样的函数,用于处理 HTTP 请求,可作为 和 connect 中间件的 的处理函数
  • 当接收到客户端请求时,按顺序循环从 数组中取出一个服务器地址,将请求代理到这个地址的服务器上

服务器在接收到 HTTP 请求后,首先需要发起一个新的 HTTP 请求到要代理的目标服务器,可以使用 来发送请求

要将客户端的请求体( 部分,在 这些请求时会有请求体)转发到另一个服务器上,可以使用 对象的 方法,比如

  • 对象是一个 Readable Stream(可读流,通过 事件来接收数据,当收到 事件时表示数据接收完毕
  • 对象是一个 Writable Stream (可写流,通过 方法来输出数据, 方法来结束输出
  • 为了简化从 Readable Stream 监听 data 事件来获取数据并使用 的 方法来输出,可以使用 的 方法

以上只是提到了实现 HTTP 代理需要的关键技术,相关接口的详细文档可以参考这里

https://nodejs.org/api/http.html#http_http_request_options_callback

当然为了实现一个接口友好的程序,往往还需要很多 额外 的工作,具体请看下文。

以下是实现一个简单 HTTP 反向代理服务器的各个文件和代码(没有任何第三方库依赖

  • 文件实现了一个用于打印日志的函数 ,它可以支持 一样的用法,并且自动在输出前面加上当前的日期和时间,方便我们浏览日志
  • 函数入口使用 模块来进行基本的参数检查,如果参数格式不符合要求即抛出异常,保证可以第一时间让开发者知道,而不是在运行期间发生各种 的错误
  • 函数用于循环返回一个目标服务器地址
  • 函数用于监听 事件,避免整个程序因为没有捕捉网络异常而崩溃,同时可以统一返回出错信息给客户端

为了测试我们的代码运行的效果,我编写了一个简单的程序,文件

执行以下命令启动

然后可以通过 命令来查看返回的结果

连续执行多次该命令,如无意外输出结果应该是这样的(输出内容端口部分按照顺序循环

注意:如果使用浏览器来打开该网址,看到的结果顺序可能是不一样的,因为浏览器会自动尝试请求,这样刷新一次页面实际上是发送了两次请求。

上文我们已经完成了一个基本的 HTTP 反向代理程序,也通过简单的方法验证了它是能正常工作的。但是,我们并没有足够的测试,比如只验证了 GET 请求,并没有验证 POST 请求或者其他的请求方法。而且通过手工去做更多的测试也比较麻烦,很容易遗漏。所以,接下来我们要给它加上自动化的单元测试。

在本文中我们选用在 Node.js 界应用广泛的 mocha 作为单元测试框架,搭配使用 supertest 来进行 HTTP 接口请求的测试。由于 已经自带了一些基本的断言方法,我们暂时不需要 chai 或者 should 这样的第三方断言库。

首先执行 初始化一个 文件,并执行以下命令安装 和

然后新建文件

  • 在单元测试开始前,需要通过 来注册回调函数,以便在开始执行测试用例时先把服务器启动起来
  • 同理,通过 注册回调函数,以便在执行完所有测试用例后把服务器关闭以释放资源(否则 mocha 进程不会退出
  • 使用 发送请求时,代理服务器不需要监听端口,只需要将 实例作为调用参数即可

接着修改 文件的 部分

执行以下命令开始测试

如果一切正常,我们应该会看到这样的输出结果,其中 这样的提示表示我们的测试完全通过了

当然以上的测试代码还远远不够,剩下的就交给读者们来实现了。

如果要设计成一个比较通用的反向代理中间件,我们还可以通过提供一个生成 http.ClientRequest 的函数来实现在代理时动态修改请求

然后在原来的 部分可以改为监听 事件

同理,我们也可以通过提供一个函数来修改部分的响应内容

    以上就是本篇文章【如何编写一个 HTTP 反向代理服务器】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/news/636.html 
     资讯      企业新闻      行情      企业黄页      同类资讯      首页      网站地图      返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多   
最新新闻
云南网络营销软件哪个好?权威推荐助您快速选择
在数字化时代,网络营销软件成为了许多企业实现营销目标的重要工具。然而,市面上网络营销软件琳琅满目,选择一个适合自己的并不
宫崎骏的时代结束了
在《你想活出怎样的人生》之前,宫崎骏一直是著名的退休诈骗犯。七次退休又七次复出,年过八旬,创作欲还是旺盛到令人害怕。然而
个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用
个人大数据信用查询平台哪个更准确一些?蘑菇画像个人大数据信用报告查询平台更好用,个人大数据信用查询平台市面上还是比较多的
小红书关键词热度查询!国风大潮下,品牌怎么玩出花样、玩出水平?
国风,是当下年轻人钟爱的潮流。汉服穿搭、文物手办、国潮仿妆……频频出圈。“民族的就是世界的”,国风的影响力可谓深远,一说
app推广接单发布平台哪个好?怎么领取任务赚钱?
最近几年,随着互联网的快速发展,利用网络兼职的赚钱方式也呈现越来越火,非常受大众欢迎的趋势。而且其种类也非常多:微商、社
【可打印】文学常识常考100题汇总,初中生练一练!(部编版初中语文)
关注本公众号,私信发送数字:2493,领取电子打印版文学常识1、成语“万事俱备,只欠东风”是根据《三国演义》________ (战役)
“迎旅发大会 游美丽望城”望城首届文旅短视频大赛,最高3万奖励等你来拿!
湘江水浩浩奔腾,流淌沧桑巨变。铜官窑静穆肃然,在这里诉说着望城的厚重历史,流传着“君生我未生,我生君已老”凄美爱情故事;落日
mysql导入大txt文件怎么打开_mysql怎么导入txt文件?
有时候我们在使用mysql数据库的时候,想导入txt文本文档,要怎么操作呢?下面本篇文章就来给大家介绍一下方法
寸头抖音短视频教程_人开始衰老的迹象是什么
岁月不饶人,我才50出头,可是许多衰老迹象已经越来越明显,惹得中医闺蜜笑话这样的我。1、觉得右后背和肩膀疼,出现“五十肩”
什么是网站页脚:以及最佳页脚设计示例
主体内容外,网站还包括页眉和页脚,用于帮助访问者的特定目的。由于我们认为网站页脚设计同样重要,我们整理了10个最佳免费网站
本企业新闻

点击拨打: