Java实现背压 java压测

admin2024-06-11  12

分布式压测

需求场景

一些关键接口需要压测到很高的QPS
需要设置更多的线程去模拟虚拟用户去请求接口
假如需要模拟2万个用户
因为jemeter使用java语言开发
每创建一个线程
jvm默认会为每个线程分配1M的堆栈内存空间
那么就需要20G内存
一般压测机器是4核8G或8核16G
因此需要更多台机器共同完成施压请求

一些关键接口需要压测到很高的QPS
需要设置更多的线程去模拟虚拟用户去请求接口
假如需要模拟2万个用户
因为jemeter使用java语言开发
每创建一个线程
jvm默认会为每个线程分配1M的堆栈内存空间
那么就需要20G内存
一般压测机器是4核8G或8核16G
因此需要更多台机器共同完成施压请求

分布式压测示意图



Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测,第1张

meter分布式测试环境中有两个角色:Master和Slaves

1、Master节点:向参与的Slaves节点发送测试脚本,并聚合Agent节点的执行结果,部署一台

2、Slaves节点:接收并执行Master节点发送过来的测试脚本,并将执行结果返回给Master,可部署多台

meter分布式测试环境中有两个角色:Master和Slaves

1、Master节点:向参与的Slaves节点发送测试脚本,并聚合Agent节点的执行结果,部署一台

2、Slaves节点:接收并执行Master节点发送过来的测试脚本,并将执行结果返回给Master,可部署多台

安装slave节点

docker pull runcare/jmeter-slave

docker run -it -d --name slave01 runcare/jmeter-slave
docker run -it -d --name slave02 runcare/jmeter-slave
docker run -it -d --name slave03 runcare/jmeter-slave

docker pull runcare/jmeter-slave

docker run -it -d --name slave01 runcare/jmeter-slave
docker run -it -d --name slave02 runcare/jmeter-slave
docker run -it -d --name slave03 runcare/jmeter-slave



Java实现背压 java压测,Java实现背压 java压测_docker_02,第2张

准备测试脚本

test.jmx



Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_03,第3张

查看slave机器的IP

docker inspect -f '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $(docker ps -q)

docker inspect -f '{{ .Name }} => {{ .NetworkSettings.IPAddress }}' $(docker ps -q)



Java实现背压 java压测,Java实现背压 java压测_Java实现背压_04,第4张

启动master docker并执行测试脚本

存放test.jmx脚本的目录

/Users/mengfanxiao/Documents/stream/jemeter/jmx/

/Users/mengfanxiao/Documents/stream/jemeter/jmx/

命令

result=`date +"%Y%m%d%H%M%S"` && docker run --rm -v /Users/mengfanxiao/Documents/stream/jemeter/jmx/:/data runcare/jmeter-master jmeter -n -t /data/test.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.17.0.6,172.17.0.7,172.17.0.8

result=`date +"%Y%m%d%H%M%S"` && docker run --rm -v /Users/mengfanxiao/Documents/stream/jemeter/jmx/:/data runcare/jmeter-master jmeter -n -t /data/test.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.17.0.6,172.17.0.7,172.17.0.8

或者

docker run --rm -v $(pwd):/data runcare/jmeter-master jmeter -n -t /data/test.jmx -l /data/result.jtl -j /data/result.log  -R 172.17.0.6,172.17.0.7,172.17.0.8

docker run --rm -v $(pwd):/data runcare/jmeter-master jmeter -n -t /data/test.jmx -l /data/result.jtl -j /data/result.log  -R 172.17.0.6,172.17.0.7,172.17.0.8



Java实现背压 java压测,Java实现背压 java压测_压测_05,第5张

结果文件

生产的结果文件,日志文件和报表文件在脚本文件test.jmx同一目录下

如果压测脚本中使用到了csv数据源文件,需要提前复制到Slaves的/data目录下

生产的结果文件,日志文件和报表文件在脚本文件test.jmx同一目录下

如果压测脚本中使用到了csv数据源文件,需要提前复制到Slaves的/data目录下



Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_06,第6张

注意事项

  • master和slaves需要在同一个网段
如果mac电脑Master使用安装在mac电脑中的Jmeter
Slaves使用Docker中的Slaves
需要在启动Slaves时将端口映射出来

docker run -it -d -p 1099:1099 -p 60001:60001 runcare/jmeter-slave

如果mac电脑Master使用安装在mac电脑中的Jmeter
Slaves使用Docker中的Slaves
需要在启动Slaves时将端口映射出来

docker run -it -d -p 1099:1099 -p 60001:60001 runcare/jmeter-slave
  • 执行Master发送脚本时也需要指定server.hostname和server.rmi.localport
进入test.jmx所在目录

result=`date +"%Y%m%d%H%M%S"` && jmeter -n -t test.jmx -l $result.jtl -j $result.log -e -o $result -Djava.rmi.server.hostname=30.208.47.45 -Dserver.rmi.localport=60002 -Dserver_port=1098


进入test.jmx所在目录

result=`date +"%Y%m%d%H%M%S"` && jmeter -n -t test.jmx -l $result.jtl -j $result.log -e -o $result -Djava.rmi.server.hostname=30.208.47.45 -Dserver.rmi.localport=60002 -Dserver_port=1098

Dockerfile源码

https://gitee.com/pingfanrenbiji/resource/tree/master/%E5%88%86%E5%B8%83%E5%BC%8Fjemeter

https://gitee.com/pingfanrenbiji/resource/tree/master/%E5%88%86%E5%B8%83%E5%BC%8Fjemeter

Jeecgboot微服务Feign

示例

服务jeecg-cloud-system 调用 jeecg-cloud-demo

服务jeecg-cloud-system 调用 jeecg-cloud-demo

jeecg-cloud-demo 服务接口

  • 接口

Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_07,第7张

  • 实现类

Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_08,第8张

  • 服务接口

Java实现背压 java压测,Java实现背压 java压测_客户端_09,第9张

jeecg-cloud-system编写feign客户端

方式一 feign客户端
  • 启动类加上@EnableFeignClients

Java实现背压 java压测,Java实现背压 java压测_docker_10,第10张

  • 编写feign客户端

Java实现背压 java压测,Java实现背压 java压测_Java实现背压_11,第11张

  • 编写测试方法

Java实现背压 java压测,Java实现背压 java压测_压测_12,第12张

方式二 动态feign客户端
  • 启动类 @EnableFeignClients

同上

  • 编写feign接口调用

同上

  • 编写测试方法

Java实现背压 java压测,Java实现背压 java压测_docker_13,第13张

Java实现背压 java压测,Java实现背压 java压测_压测_14,第14张

参数一表示feign接口类
参数二表示类名称

参数一表示feign接口类
参数二表示类名称



Java实现背压 java压测,Java实现背压 java压测_压测_15,第15张

feign原理

  • 架构图

Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_16,第16张

  • feign扫包和注册细节

Java实现背压 java压测,Java实现背压 java压测_压测_17,第17张

  • FeignClientFactoryBean 解析

Java实现背压 java压测,Java实现背压 java压测_客户端_18,第18张

  • 代理的实现过程

Java实现背压 java压测,Java实现背压 java压测_Java实现背压_19,第19张

  • 代理invoke的实际执行过程

Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_20,第20张

xxl-job定时任务集成

引入依赖



Java实现背压 java压测,Java实现背压 java压测_docker_21,第21张

客户端demo编写



Java实现背压 java压测,Java实现背压 java压测_Java实现背压_22,第22张

修改 jeecg-dev.yaml 配置文件

  • 开启 xxljob 并 修改 xxljob-admin的服务连接配置

Java实现背压 java压测,Java实现背压 java压测_压测_23,第23张

  • 启动xxl-job服务

数据库脚本

https://gitee.com/pingfanrenbiji/jeecg-boot/blob/1e3a4d6a6f53589a3cd53fd18c62bf4375467447/jeecg-boot/jeecg-cloud-module/jeecg-cloud-xxljob/doc/db/tables_xxl_job.sql

https://gitee.com/pingfanrenbiji/jeecg-boot/blob/1e3a4d6a6f53589a3cd53fd18c62bf4375467447/jeecg-boot/jeecg-cloud-module/jeecg-cloud-xxljob/doc/db/tables_xxl_job.sql

配置邮箱通知



Java实现背压 java压测,Java实现背压 java压测_Java实现背压_24,第24张

开启邮箱服务并生成授权码



Java实现背压 java压测,Java实现背压 java压测_压测_25,第25张

Java实现背压 java压测,Java实现背压 java压测_客户端_26,第26张

设置IMAP服务的SSL加密方式

https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=331

https://service.mail.qq.com/cgi-bin/help?subtype=1&&id=28&&no=331



Java实现背压 java压测,Java实现背压 java压测_docker_27,第27张

启动服务



Java实现背压 java压测,Java实现背压 java压测_docker_28,第28张

界面访问

http://localhost:9080/xxl-job-admin
admin
123456

http://localhost:9080/xxl-job-admin
admin
123456



Java实现背压 java压测,Java实现背压 java压测_压测_29,第29张

  • 创建定时任务

新增执行器



Java实现背压 java压测,Java实现背压 java压测_docker_30,第30张

新增定时任务



Java实现背压 java压测,Java实现背压 java压测_java模拟数据库压测_31,第31张

测试定时任务



Java实现背压 java压测,Java实现背压 java压测_Java实现背压_32,第32张

查看执行日志



Java实现背压 java压测,Java实现背压 java压测_客户端_33,第33张

Java实现背压 java压测,Java实现背压 java压测_客户端_34,第34张

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明原文出处。如若内容造成侵权/违法违规/事实不符,请联系SD编程学习网:675289112@qq.com进行投诉反馈,一经查实,立即删除!