Go-Gateway反向代理,性能比拼Nginx

2023-11-09

前言

在以前的一篇文章《基于Fasthttp实现的Gateway,性能媲美Nginx》中,介绍给大家一款使用Go语言开发的实现反向代理功能的开源项目boot4go-gateway,boot4go-gateway项目以fasthttp作为http的底层服务通信,实现和springcloud gateway相同功能的API网关服务, 同时提供图形化的Gateway管理配置的功能, 在SpringCloud实现的微服务云架构的项目中,完全替代SpringCloud Gateway, SpringCloud Gateway底层只用Netty,结合 Reactor,使用flux的方式替代原有的Zuul的阻塞式响应(Zuul2也实现了非阻塞式响应),在SpringCloud的微服务云项目中成为Gateway功能的主要产品,boot4go-gateway具有比SpringCloud gateway更高的性能,同时还提供了SpringCloud Gateway所没有的图形化管理功能,本文主要给大家介绍的就是Boot4go-gateway的性能测试的过程,并且对比Nginx提供的反向代理的功能进行性能测试。

测试策略

对比Nginx的测试,在没有进行压力和并发测试之前,笔者就使用Chrome的开发者工具,通过开发者工具里的请求时间,简单的通过页面的调用,页面分别使用Nginx作为反向代理以及Gateway作为反向代理,在相同的环境下,代理目标到相同的API接口, 简单的目测结果Gateway的性能明显的优于Nginx的反向代理功能, 不过目测都是简单的点击,此时的性能测试的PK并不能真正的反映出两者在并发和压力情况的性能,这也就了本文的测试的来历;

本文中我们使用Jmeter作为并发和压力测试的工具,没有使用jmeter进行分布式的多个客户端的模拟测试,只是在单机的Jmeter机器上,通过Jmeter模拟出高并发的压力测试场景, 有必要的情况下,再通过Jmeter构建成更多的Jmeter客户端,进行更高量级的并发和压力测试场景。

环境都是安装在自己的笔记本上的, 没有压太多量,最大600的并发数, 持续加压的策略。

测试场景

测试用例分别各使用Nginx的反向代理功能和Boot4go-gateway来对WEB API目标节点(单个节点)进行反向代理,代理的WEB API目标节点都是使用Nginx部署的Http服务。通过对Nginx的反向代理提供的URL和Boot4go-gateway提供的反向代理的URL进行高并发的压力测试, 这样对于这场PK,目标的WEB API是一致的,网络环境是一致的,差异仅仅就在于提供反向代理的产品上面, 这样经过各种不同压力场景下得到的PK的结果,也可以反映出这两种不同的反向代理产品的性能差异了。

根据目标WEB API返回的数据字节大小,我们选择了4种不同的数据大小的返回结果作为各数据字节测试场景,以此来对各种不同的数据返回字节的情况下的性能测试PK的比较。由于Fasthttp的实现机制,在返回数据量比较大的情况下,可能出现Bug的诟病,我们在Gateway产品的实现上特别的进行针对性的代码优化和调整;

  • 场景1: 默认文件,index.html 45KB文件大小, html文件
  • 场景2: 中型文件 index-m.html 20KB文件大小, html文件
  • 场景3: 小型文件 index-s.html 5KB文件大小,html文件
  • 场景4: 超小型文件 index-xs.html 1KB文件大小,html文件

Gateway项目的产品定位是作为SpringCloud的微服务体系中的API网关,最大的数据包我们也只做到了45KB测试场景,毕竟不是作为Http服务器,没必要做大文件下载这样的考虑,同时上传数据包这块也没有做特别的场景测试,调用都是使用Get方式的调用,没有做Post,Put,Delete的场景测试,如果以后有必要可以做这些的场景测试,第一次进行PK,出于方便的考虑,就是通过简单的URL发送请求。

测试环境部署

测试环境都是通过Docker进行部署,2个作为反向代理目标机器的Nginx分别部署在Docker的两个容器内,作为反向代理的前端的Nginx部署在同个宿主机的容器内, 作为反向代理的前端的Gateway也部署在同个宿主机的容器内。

Nginx均使用官方的latest作为镜像, boot4go-gateway是golang实现,直接dockerfile制作成本地镜像进行容器的部署, 由于gateway使用了etcd作为数据存储,还有一个3个节点etcd集群作为gateway的服务治理端,etcd使用3.5.1的官方镜像, 三节点都是3.5.1的版本, 数据大小为100M左右

作为gateway的nginx配置

upstream gateway {

server 192.168.56.101:10081;

server 192.168.56.101:10082;

}

location / {

# root /usr/share/nginx/html;

# index index.html index.htm;

proxy_pass http://gateway;

}

反向代理Nginx的前端端口是10080, 后端目标机器的IP和端口分别为192.168.56.101:10081,192.168.56.101:10082; Docker宿主机的IP是192.168.56.101

通过Get访问反向代理前端Nginx的URL是http://192.168.56.101:10080, 负载均衡策略为轮询策略不加权;通过反向代理的依次访问目标机器192.168.56.101:10081,192.168.56.101:10082;

boot4go-gateway的反向代理配置

Boot4go-gateway提供管理界面,直接在管理界面里可以动态的进行反向代理规则的配置;修改后立即生效,不需要重启服务, boot4go-gateway的配置数据保存在etcd里。

如上配置, boot4go-gateway的前端访问地址http://192.168.56.101:9000,boot4go-gateway支持域名配置,支持ssl配置。boot4go-gateway支持多域名多网址代理模式。

反向代理策略配置

通过上图配置,反向代理通过前端gateway的处理后代理到后面的两台服务器 192.168.56.101:10081和192.168.56.101:10082, 负载均衡的策略是轮询策略(不加权);boot4go-gateway支持同IP或者域名的多级路径代理策略配置,支持请求类型(ANY/GET/POST/PUT/DELETE);不同路径可以配置不同的代理策略,如图中的配置

路径的映射是代理访问路径/nginx/下的所有请求,只要访问路径在/nginx/下的请求,都会按照当前的代理策略配置进行代理转发(根据后面的转换规则进行路径的转换);

图中的配置,实现就是转发所有/ngixn/下的所有请求,转换规则是直接转换,即

http://192.168.56.101:9000/nginx/index-s.html 转发到192.168.56.101:10081(192.168.56.101:10082)/index-s.html。

http://192.168.56.101:9000/nginx/index.html 转发到192.168.56.101:10081(192.168.56.101:10082)/index.html。

结束语

本文主要介绍文章《基于Fasthttp实现的Gateway,性能媲美Nginx》中的Boot4go-gatway和Nginx进行性能测试的相关性能测试的场景介绍, 场景准备后,将按照场景中规划的场景分别对Boot4go-gateway以及Nginx作为反向搭理的性能进行PK比拼,在下一文章中,我们将重点介绍两者作为反向代理的性能测试过程以及测试结果; 还请各位朋友及时关注。

请持续关注程序员紫龙,不要错过精彩内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go-Gateway反向代理,性能比拼Nginx 的相关文章

  • Amazon ECS - 在 Docker 入口点上使用 IAM 角色时权限被拒绝

    我正在寻找一种将机密 证书注入 Amazon ECS 容器的方法 就我而言 它是一个简单的 nginx 容器 我一直在使用 AWS Parameter Store 关注这篇文章 https aws amazon com blogs comp
  • Nginx 正在向 uWSGI 发出非常旧的请求?

    我看到一种奇怪的情况 Nginx 或 uwsgi 似乎正在建立一个很长的传入请求队列 并在客户端连接超时后很长时间内尝试处理它们 我想理解并停止这种行为 以下是更多信息 My Setup 我的服务器使用 Nginx 通过 Unix 文件套接
  • NGinx 域名重定向

    假设我有一个名为 xyz co 的网站 我还有其他具有相同前缀的域名 例如 xyz com xyz it xyz co it 现在 nginx 与端口 80 的 nginx conf 中的 server name xyz co 配合得很好
  • nginx 反向代理 websocket

    nginx 现在支持代理 websockets 但我无法找到任何有关如何在没有单独的情况下执行此操作的信息location应用于使用 websocket 的 URI 的块 我见过一些人推荐这种方法的一些变体 location proxy h
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • WebSockets 监听 UNIX 域套接字?

    是否可以在 nginx 服务器后面设置一个 WebSockets 服务器来处理 UNIX 域套接字上的连接 我目前在同一台计算机上有多个 WebSocket 服务器实例 并且存在端口共享问题 所有实例都必须分配一个唯一的端口 我想避免这种情
  • 如何正确链接 php-fpm 和 Nginx Docker 容器?

    我正在尝试链接 2 个单独的容器 nginx 最新 https registry hub docker com nginx php fpm https registry hub docker com php 问题是 php 脚本不起作用 也
  • NGINX hashbang 重写

    我想知道 hashbang url 的位置或重写 nginx 指令会是什么样子 基本上像前端控制器一样通过 hashbang 路由所有非 hashbanged url 所以 http example com about staff 将路由至
  • 将应用程序级别用户名/用户 ID 注入 nginx/Apache 日志

    有没有办法将应用程序级别的用户名或 id 在本例中为 django 用户名或 id 注入 Apache 或 ngnix 日志中 请注意 我不是询问 HTTP 身份验证用户名 我目前正在使用一个简短的自定义中间件将此数据添加到响应标头 如下所
  • nginx server_name 在流块内可能吗?

    目前设置如下 stream server listen 9987 udp server name subdomain EXAMPLE com this line is resulting in an error proxy pass loc
  • nginx代理认证拦截

    我有几个服务 它们支持 nginx 实例 为了处理身份验证 在 nginx 中 我拦截每个请求并将其发送到身份验证服务 在那里 如果凭据正确 我将设置一个包含用户相关信息的 cookie 现在 请求应该被路由到适当的服务 并设置 cooki
  • Beanstalk 部署忽略 .ebextensions 中的 nginx 配置文件

    我在单实例 Elastic Beanstalk 环境中托管 Java Web 应用程序 并添加了几个 ebextension 文件 这些文件在每次部署时成功为我创建配置文件 然而 我无法找到一种方法让 Beanstalk 在 etc ngi
  • 使用 Nginx 在 Docker 容器内部署带有路由器的 Angular2

    我正在尝试部署一个使用框架的路由器功能的 Angular 2 但在 docker 容器内使用 nginx 为其提供服务时遇到一些问题 由 angular cli 构建的 Angular 应用程序具有如下文件结构 dist 08c42df75
  • 如何使用gunicorn和bokeh服务配置Nginx

    我想提供一个 Flask 应用程序 该应用程序使用本地网络服务器上的嵌入式散景服务 为了说明这一点 我使用了一个例子散景服务示例 https github com bokeh bokeh blob 0 12 11 examples howt
  • Django + nginx + uwsgi 无法登录

    我有非常简单的登录逻辑 类似于官方 Django 解决方案 class Login FormView template name login html form class AuthenticationForm def get self a
  • Rails/Nginx 中的超时——最佳实践

    我正在开发一个应该在 Nginx 服务器上运行的 Rails 应用程序 根据输入 应用程序可能需要很长时间来处理请求 或者在出现错误时挂起 因此我想防止进程永远运行 除了确保客户端收到超时信号的 Nginx 配置之外 我想我可能仍然需要确保
  • 阻止 ingress-nginx 负载均衡器上的特定路径

    我有许多指向入口控制器 IP 的域 我想阻止所有域 站点的 特定路径 有没有办法做到这一点 我可以用nginx ingress kubernetes io configuration snippet 对于每个站点 但正在寻找同时处理所有站点
  • 使用查询参数值进行 NGINX 301 重定向

    我想重定向example com lang en to example com en 我正在使用 Python Django 我的服务器运行 Plesk Nginx 我尝试像这样在我的网页上重定向 但这是行不通的 rewrite lang
  • nginx上传client_max_body_size问题

    我正在运行 nginx ruby on rails 并且有一个简单的多部分表单来上传文件 一切正常 直到我决定限制要上传的文件的最大大小 为此 我设置了 nginxclient max body size to 1m 1MB 并且当该规则被
  • 如何配置 nginx 重写规则以使 CakePHP 在 CentOS 上运行?

    大家好 请帮帮我 我正在尝试在运行 Nginx 和 Fact CGI 的 Centos 服务器上设置 cakephp 环境 我已经在服务器上运行了一个 WordPress 站点和一个 phpmyadmin 站点 因此我已经正确配置了 PHP

随机推荐

  • EMC 共模电感选型

    最近开通了公众号 有文章更新 刚兴趣可以关注一下 谢谢 1 EMI 共模电流的产生机理 a 差分电流产生差模电磁场 使得差分回路面积内的走线产生共模电流 b 共模电流 辐射主要源头 工作电流经过单板地 由于地阻抗的存在 形成地上共模电压 地
  • Basic Level 1087 有多少不同的值 (20分)

    题目 当自然数 n 依次取 1 2 3 N 时 算式 n 2 n 3 n 5 有多少个不同的值 注 x 为取整函数 表示不超过 x 的最大自然数 即 x 的整数部分 输入格式 输入给出一个正整数 N 2 N
  • PID自控理论(频域bode图理论分析)

    PID 迟后超前矫正 临界比例度法整定PID 在低频区 主要是PI控制器起作用 用以提高系统型别消除或减小稳态误差 在中 高频区 主要是PD控制器起作用 用以增大幅值穿越频率和相位裕度 提高系统的响应速度 因此 PID控制器可以全面地提高系
  • 游戏数据运营--2.新版本效果分析案例

    文本内容如下 游戏B 新版本效果分析 游戏B 2017年1月1日4 0版本效果数据如下 1 新用户登录的激活转化率相比3 9版本提高10 目前为27 2 4 0版本首周日活跃人数比之前提高16 目前日均活跃达到10万人 点卡用户在线时长提高
  • Vuex有那几种状态和属性?

    vuex的流程 页面通过mapAction异步提交事件到action action通过commit把对应参数同步提交到mutation mutation会修改state中对于的值 最后通过getter把对应值跑出去 在页面的计算属性中 通过
  • PCB叠层设计与阻抗计算

    1 PCB叠层设计与阻抗计算 01走个流程 哔哩哔哩 bilibili 2 第十七讲 PCB的电源阻抗自动优化 哔哩哔哩 bilibili 3 32高速PCB设计之叠层与阻抗 阻抗计算案例 哔哩哔哩 bilibili 4 PCB阻抗计算工具
  • 一文读懂开源的7大理念

    原文 https www enmotech com web detail 1 844 1 html 软件正在慢条斯理地吞噬世界 开源正在慢条斯理地吞噬软件业 软件正在吞噬世界 是的 对于购物 吃饭 健身 交停车费都需要使用软件的年代 对于平
  • 一个报表的脚本以及输出结果

    Set up pagesize parameters SET NEWPAGE 0 SET PAGESIZE 55 Set the linesize which must match the number of equal signs use
  • OpenWrt设置开机自动启动/延迟启动

    最近在搞路由器自动登录 用到了OpenWrt的自动启动 因为我要运行的是一个Python程序 一条命令足够 就直接在 etc rc local里面改了 python etc Myprogram py 直接占用前台了 既需要让他后台运行 又不
  • python计算定积分

    求 0 1
  • 外部保存echars图片

    传递图表容器id function downloadImpByChart chartId var myChart echarts getInstanceByDom document getElementById chartId var ur
  • 浅谈当下火热的ChatGPT

    ChatGPT这个词语从今年初发布以来 一度成为一个火热的概念 包括CSDN也推出了C知道 不少大佬博友纷纷蹭热点 发布了无数关于ChatGPT的技术 使用 技能 展望未来的文档和博文 其实很多文章我都没有看过 只知道当下这个工具非常的火
  • 快速入门Spring Cloud Hystrix(服务降级、服务熔断、服务监控)

    文章目录 前言 一 服务雪崩 1 服务雪崩概述 2 造成服务雪崩的原因 3 如何防止雪崩 二 Spring Cloud Hystrix 1 什么是Spring Cloud Hystrix 豪猪哥 2 搭建测试环境 1 创建cloud pro
  • Java 23种设计模式通俗理解

    文章目录 工厂方法 建造者模式 抽象工厂 原型模式 单态模式 适配器模式 桥梁模式 合成模式 装饰模式 门面模式 享元模式 代理模式 责任链模式 命令模式 解释器模式 迭代模式 调停者模式 备忘录模式 观察者模式 状态模式 策略模式 模板方
  • 刀具半径补偿 c语言,数控铣床编程时刀具半径补偿指令及运用

    摘要 本文分析了刀具半径补偿概念及指令 如何灵活和合理地运用刀补值 正确编制加工程序以保证数控加工的有效性和准确性等问题 关键词 数控铣床编程 刀具半径补偿指令 一 刀具半径补偿的概念 在数控铣床上进行轮廓加工时 由于铣刀的刀位点通常是定在
  • mysql查询语句提示Unknown column ‘xxx’ in ‘where clause’

    今天写接口自动化测试 在运行结果中提示Unknown column xxx in where clause 的问题 经过大神的指导 顿时明白其中缘由 如果sql中定义的类型是int型的可以不用加引号 但是如果是字符串类型的 必须加引号 例如
  • C++&QT day1

    思维导图
  • CTF(Web方向练习题)(持续更新)

    1 Training WWW Robots 打开应用场景 如下 网址后面添加 robots txt 查看其中内容 robots协议也叫robots txt 统一小写 是一种存放于网站根目录下的ASCII编码的文本文件 内容如下 根据提示 访
  • numpy.random.choice坑

    numpy random choice 默认是有放回 其中有个 replace 的参数控制 默认是 True 如划分数据集用到 注意重复 Code import numpy as np a np arange 5 print a for i
  • Go-Gateway反向代理,性能比拼Nginx

    前言 在以前的一篇文章 基于Fasthttp实现的Gateway 性能媲美Nginx 中 介绍给大家一款使用Go语言开发的实现反向代理功能的开源项目boot4go gateway boot4go gateway项目以fasthttp作为ht