【深入解析spring cloud gateway】12 gateway参数调优与分析

news2024/11/24 15:10:15

本节主要对网关主要的一些参数做一些解释说明,并用压测工具测试一下网关的接口,通过压测来验证参数配置是否合理

一、连接池参数

参数示例

spring:
  application:
    name: gateway
  cloud:
    gateway:
      # http连接设置
      httpclient:
        # 全局的响应超时时间,网络链接后,后端服务多久不返回网关就报错 The response timeout. PT10S代表10秒的意思
        response-timeout: PT30S
        # 全局的TCP连接超时时间默认时间是45秒,修改为5秒
        connect-timeout: 5000
        # 链接池配置
        pool:
          # 最大连接数
          max-connections: 10000
          # 获取连接的超时时间,单位毫秒
          acquire-timeout: 1000
          # channel空闲时,最大的存活时间,如果为空,没有最大空闲时间
          max-idle-time: 120000
          # channel存在的最长时间,如果为null,则没有最大生命时间限制
#          max-life-time: 10
          # 在后台进行清除channel的时间间隔,默认情况下为0,即不进行定期清除
          eviction-interval: 180000
          # 设置固定链接池
          type: fixed

Http超时配置

全局超时配置

spring:
  cloud:
    gateway:
      # http连接设置
      httpclient:
        # 全局的响应超时时间,网络链接后,后端服务多久不返回网关就报错 The response timeout. PT10S代表10秒的意思
        response-timeout: PT10S
        # 全局的TCP连接超时时间默认时间是45秒,修改为5秒
        connect-timeout: 5000

如果是想针对单个路由配置超时,可以配置在路由上

spring:
  cloud:
    gateway:
      routes:
      - id: requestratelimiter_route
        uri: http://localhost:3000/
        predicates:
        - Path=/normal/**
        metadata:
          response-timeout: 7000
          connect-timeout: 2000

连接池类型

spring.cloud.gateway.httpclient.pool.type,该参数一共有三种类型

  • ELASTIC:弹性链接池,连接数上限为Integer.MAX,默认值就是这个类型
  • FIXED: 固定连接池,最大连接数采用spring.cloud.gateway.httpclient.pool.max-connections的配置
  • DISABLED:不使用任何连接池

其余参数见注释说明

二、线程池参数

Gateway底层是使用的netty来处理网络请求。如果你了解过netty,那你应该知道netty的线程模型是使用了两个线程池,bossGroup和workGroup。分别用于处理IO的连接请求,以及业务。
查看一下Gateway源码,可以看到

public interface LoopResources extends Disposable {
    int DEFAULT_IO_WORKER_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioWorkerCount", "" + Math.max(Runtime.getRuntime().availableProcessors(), 4)));
    int DEFAULT_IO_SELECT_COUNT = Integer.parseInt(System.getProperty("reactor.netty.ioSelectCount", "-1"));
    //省略大量代码
  }
  • DEFAULT_IO_WORKER_COUNT,工作线程数,默认值是CPU核心数,如果核心数少于4,那么就是最小为4
  • DEFAULT_IO_SELECT_COUNT ,IO线程数,默认为-1,当它为-1时,其实就等于IO线程数

如果想手动修改线程参数值,可以这么做

  • 添加环境变量,reactor.netty.ioWorkerCount=xx,reactor.netty.ioSelectCount=xx
  • 或者动设置属性值,如下代码
@SpringBootApplication
public class GatewayDemoApplication {

	public static void main(String[] args) {
		System.setProperty(ReactorNetty.IO_SELECT_COUNT,"8");
		System.setProperty(ReactorNetty.IO_WORKER_COUNT,"8");
		SpringApplication.run(GatewayDemoApplication.class, args);
	}
}

三、压力测试

本机环境 4核CPU,16G内存,三个服务,eureka-server,euerka-client,gateway

环境准备:JeMeter+JProfile

  • 下载JProfile,安装好
  • 下载JMeter,安装好
  • idea安装jprofile插件
    在这里插入图片描述

测试代码编写

hello-service定义一个接口,模拟耗时200ms

@Controller
@Slf4j
public class BusinessController {

    @RequestMapping(value = "/mock/business", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, String> modifyRequest(@RequestBody Map<String, String> map) {
        try {
            Thread.sleep(200L);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        return map;
    }
}
  • 启动微服务和eureka注册中心
  • 启动gateway网关,点击那个蓝色的小图标

在这里插入图片描述
然后就可以启好网关,并且通过JProfile看到线和、CPU、内存的运行状态了
在这里插入图片描述
等会我们通过JMeter再实时观察一下各参数的情况,方便验证我们的网关参数
JMeter配置
定义一个线程组:
1000个线程,10秒内启动,循环100次
在这里插入图片描述
定义一个http取样器,同时设置好请求,如下
在这里插入图片描述
由于是post请求,请求数据为json,所以添加一个头信息管理器
在这里插入图片描述
定义请求结果的报告
在这里插入图片描述
在这里插入图片描述

JMeter结果:
在这里插入图片描述
JMeter中的聚合报告中,主要有十几项的参数,参数如下:

  • 1、Label:每个请求的名称,比如HTTP请求等
  • 2、#Samples:表示这次测试中一共发出了多少个请求,如果模拟10个用户,每个用户迭代10次,那么这里显示100;【我的是用户有100,只迭代一次,因此也是100】
  • 3、Average:平均响应时间——默认情况下是单个 Request 的平均响应时间,当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间;
  • 4、Median:中位数,也就是 50% 用户的响应时间;
  • 5、90% Line ~ 99% Line:90% ~99%用户的响应时间;
  • 6、Min:最小响应时间;
  • 7、Maximum:最大响应时间;
  • 8、Error%:本次测试中出现的错误率,即 错误的请求的数量/请求的总数;
  • 9、Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction ;
  • 10、Received KB/src:每秒从服务器端接收到的数据量;
  • 11、Sent KB/src:每秒从客户端发送的请求的数量。
    在这里插入图片描述
    可以看到,请求结果中,是有些报错的,
    通过JMeter查看一下线程情况
    在这里插入图片描述
    可以看到,gateway的线程数,并没有因为请求数增加而增加,线程一般启起来都是固定的。基于reactor响应式编程模型和netty框架的支持,一个线程是可以同时处理多个连接(channel)的。
    上图中,可以看到,此时运行的线程数为4,IO处理线程为4
    内存占用情况,可以在这里看到
    在这里插入图片描述

————————————————
用JMeter时遇到了如下问题:
JMeter压测时Address Already in use:connect错误解决
在windows 环境下使用jmeter 进行压测的过程中,通常会遇到这样的错误“JMeter Address Already in use:connect”, 查阅了不少资料,发现这是windows本身提供的端口访问机制的问题。
Windows提供给TCP/IP连接的端口为1024-5000,并且要4分钟来循环回收它们,这就导致了我们在短时间内发起大量请求的时候将端口占满了。

解决方案一:
Jmeter里的http sample勾选了keep alive,导致会话一直保持,而windows本身的端口有限,导致端口被占用完后,无法分配新的端口,因此会产生java.net.BindException: Address already in use: connect 报错。

    解决方法:HTTP SAMPLE 不勾选"KeepAlive"即可,如下图所示:

在这里插入图片描述

解决方案二:
step1:win+r 在cmd中,用regedit命令打开注册表
step2:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 目录下,
(1)右键Parameters 新建DWORD,名字为MaxUserPort,输入数值65534(十进制)
(2)再次右键 Parameters 新建DWORD,名字为TCPTimedWaitDelay,输入数值30(十进制)表示30秒回收端口
在这里插入图片描述

step3:重启计算机。
问题解决

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1327709.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大语言模型(LLM)与 Jupyter 连接起来了!

现在&#xff0c;大语言模型&#xff08;LLM&#xff09;与 Jupyter 连接起来了&#xff01; 这主要归功于一个名叫 Jupyter AI 的项目&#xff0c;它是官方支持的 Project Jupyter 子项目。目前该项目已经完全开源&#xff0c;其连接的模型主要来自 AI21、Anthropic、AWS、Co…

【Git】在 IDEA 中合并多个 commit 为一个

文章目录 1 未提交到远程分支1.1 需求说明1.2 reset 操作1.3 再次 push 2 已经提交到远程分支2.1 需求说明2.2 rebase 操作2.3 强制 push 分两种情况&#xff1a; 一种是本地提交还没推到远程&#xff0c;这种好处理另一种是已经提交到远程分支&#xff0c;这个略麻烦 1 未提…

【Java代码审计】RCE篇

【Java代码审计】RCE篇 1.Java中的RCE2.ProcessBuilder命令执行漏洞3.Runtime exec命令执行漏洞4.脚本引擎代码注入5.RCE的防御 1.Java中的RCE 在PHP开发语言中有system()、exec()、shell_exec()、eval()、passthru()等函数可以执行系统命令。在Java开发语言中可以执行系统命令…

如何从 Android 手机免费恢复已删除的通话记录/历史记录?

有一个有合作意向的人给我打电话&#xff0c;但我没有接听。更糟糕的是&#xff0c;我错误地将其删除&#xff0c;认为这是一个骚扰电话。那么有没有办法从 Android 手机恢复已删除的通话记录呢&#xff1f;” 塞缪尔问道。如何在 Android 上恢复已删除的通话记录&#xff1f;如…

STM32CubeMX驱动ST7789

环境 1、单片机:STM32F103C8T6 2、开发平台&#xff1a;STM32CUBEMXkeil mdk 3、屏幕&#xff1a;ST7789&#xff0c;分辨率240*240 STM32配置 1、使用硬件SPI1驱动屏幕。配置如下&#xff1a; 2、屏幕控制引脚配置&#xff1a; 注意&#xff1a;只配置了DC,RST,CS这3个控…

BearPi Std 板从入门到放弃 - 后天篇(3)(ESP8266透传点灯)

简介 电脑搭建一个TCP Server&#xff0c; ESP8266 串口设置好透传模式, 再由TCP Server发送指令控制灯的亮灭; 开灯指令&#xff1a; led_on回车 &#xff1b; 关灯指令: led_off回车 主芯片: STM32L431RCT6 LED : PC13 \ 推挽输出即可 \ 高电平点亮 串口: Usart1 / LPUART E…

html之如何设置音频和视频

文章目录 前言一、音频标签&#xff1a;audio1.audio简介2.常用属性controlsautoplayloop代码演示&#xff1a; 二、视频标签&#xff1a;video1.video2.常用的视频元素controlsautoplayloop代码演示&#xff1a; 总结视频元素总结音频元素总结 前言 html中插入音频和视频的方…

网络通信--深入理解网络和TCP / IP协议

计算机网络体系结构 TCP/IP协议族 TCP / IP 网络传输中的数据术语 网络通信中的地址和端口 window端查看IP地址和MAC地址&#xff1a;ipconfig -all MAC层地址是在数据链路层的&#xff1b;IP工作在网络层的 MAC是48个字节&#xff0c;IP是32个字节 在子网&#xff08;局域…

4 postman响应数据解析

上一篇:3 使用postman批量创建测试数据-CSDN博客 在接口测试中,从接口的响应结果中获取数据是很常用的。比如说做断言的时候,需要确保接口返回数据是符合预期的。又比如有些接口的输入参数值,需要用到前面接口运行返回的数据。下面先介绍如何解析响应数据(以json数…

轻量封装WebGPU渲染系统示例<54>- 拱形门

当前示例源码github地址: https://github.com/vilyLei/voxwebgpu/blob/feature/material/src/voxgpu/sample/GLBMaterialTest.ts 当前示例运行效果:

vue中最重要的点,双向数据绑定是什么?

一、什么是双向绑定 我们先从单向绑定切入单向绑定非常简单&#xff0c;就是把Model绑定到View&#xff0c;当我们用JavaScript代码更新Model时&#xff0c;View就会自动更新双向绑定就很容易联想到了&#xff0c;在单向绑定的基础上&#xff0c;用户更新了View&#xff0c;Mo…

Eigen库之Quaterniond

Eigen::Quaterniond 是 Eigen C 库中用于表示四元数的类&#xff0c;四元数在计算机图形学、机器人学等领域中广泛用于表示旋转操作。 四元数是一种数学结构&#xff0c;通常用于表示和计算三维空间中的旋转。一个四元数由一个实部和三个虚部组成&#xff0c;可以写成如下形式&…

mysql主从复制(在虚拟机centos的docker下)

1.安装docker Docker安装(CentOS)简单使用-CSDN博客 2.部署2个mysql docker run --name some-mysql1 -p 33061:3306 -e MYSQL_ROOT_PASSWORD123456 -d mysql:5.7 --character-set-serverutf8mb4 --collation-serverutf8mb4_unicode_cidocker run --name some-mysql2 -p 330…

Android 13 - Media框架(23)- ACodecBufferChannel

这一节我们将了解 ACodecBufferChannel 上一节我们了解到input buffer 和 output buffer 是如何分配的了&#xff0c;allocateBuffersOnPort 方法的最后会将ACodec::BufferInfo 中的 mData 成员组织成为数组&#xff0c;最后提交给 ACodecBufferChannel 管理。这一节我们将尝试…

MySQL数据库基本操作语言:SQL

SQL 概述 SQL是一 种用于操作数据库的语言&#xff0c;SQL适用于所有关系型数据库。 MySQL、Oracle、 SQLServer是一 一个数据库软件,这些数据库软件支持标准SQL,也就是通过SQL可以使用这些软件,不过每一个数据库系统会在标准SQL的基础 上扩展自己的SQL语法。 大部分的NoSQ…

Flink电商实时数仓(三)

DIM层代码流程图 维度层的重点和难点在于实时电商数仓需要的维度信息一般是动态的变化的&#xff0c;并且由于实时数仓一般需要一直运行&#xff0c;无法使用常规的配置文件重启加载方式来修改需要读取的ODS层数据&#xff0c;因此需要通过Flink-cdc实时监控MySql中的维度数据…

GraphPad Prism 10 for Mac v10.0.0.3 安装教程

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

ansible(二)

模块七&#xff1a; hostname模块&#xff0c;修改主机名 模块八&#xff1a; copy模块&#xff1a;用于复制指定主机的文件到远程主机的模块&#xff08;必须要用绝对路径&#xff09; 常用的参数&#xff1a; Dest:指出要复制的文件在哪&#xff08;去哪&#xff09;&am…

C语言—每日选择题—Day59

指针相关博客 打响指针的第一枪&#xff1a;指针家族-CSDN博客 深入理解&#xff1a;指针变量的解引用 与 加法运算-CSDN博客 第一题 1. 以下关于 typedef 正确的描述是&#xff08;&#xff09;【多选】 A&#xff1a;用typedef可以定义各种类型别名&#xff0c;但不能定义变量…

CSS:元素显示模式与背景

CSS&#xff1a;元素显示模式与背景 元素显示模式什么是元素显示模式块级元素 block行内元素 inline行内块元素 inline-block元素显示模式对比元素显示模式转换 display 背景背景颜色 background-color背景图片 background-image背景平铺 background-repeat背景图片位置 backgr…