开源个.NetCore写的 - 并发请求工具PressureTool
本篇和大家分享的是一个 并发请求工具,并发往往代表的就是压力,对于一些订单量比较多的公司这种情况很普遍,也因此出现了很多应对并发的解决方案如:分布式,队列,数据库锁等;
对于没有遇到过或者不可能线上来处理并发问题的我们来说,需要模拟这种环境,不错这就是写并发请求工具的目的:
. 对于api接口做并发请求
. NetCore来写的能跨平台运行
. 允许配置多个目标地址,进行同时并发请求
. 支持Get,Post请求方式(post参数支持:xml,json格式)
工具设计的原理
工具的全部代码都开源至:https://github.com/shenniubuxing3/PressureTool(不妨标个*),下面将举例演示如何使用;工具设计的原理主要采用Task,通过配置目标地址,请求数量来拆分成多个Task,以此完成并行的请求:

由上图可以看出,该工具主要有3层树形结构,最底层是真实发出对目标url地址的请求,使用的Task,Task对于多核CPU来说效果更显著;在讲解例子前咋们先来看看配置文件对应的实体类:
#region 配置信息
public class MoToolConf
{
/// <summary>
/// 执行结果日志记录路径(全局,默认程序根目录)
/// </summary>
public string ResultLogPath { get; set; }
/// <summary>
/// 多个任务
/// </summary>
public List<MoTaskInfo> MoTaskInfoes { get; set; }
}
/// <summary>
/// 任务信息
/// </summary>
public class MoTaskInfo
{
/// <summary>
/// 请求方式,目前支持:httpget,httppost
/// </summary>
public string Method { get; set; }
/// <summary>
/// 请求地址
/// </summary>
public string Url { get; set; }
/// <summary>
/// 连接数
/// </summary>
public int LinkNum { get; set; }
/// <summary>
/// 参数(post使用)
/// </summary>
public string Param { get; set; }
/// <summary>
/// 执行结果日志记录路径(私有>全局)
/// </summary>
public string ResultLogPath { get; set; }
}
#endregion
httpget请求的配置
首先我们需要在根目录下找到配置文件:PressureTool.json,然后配置成如下get请求设置:
{
"ResultLogPath": "",//默认不设置,日志记录在根目录
"MoTaskInfoes": [
{
"Method": "httpget",
"Url": "https://www.baidu.com/",
"LinkNum": ,
"Param": "",
"ResultLogPath": ""
},
{
"Method": "httpget",
"Url": "https://cloud.baidu.com/",
"LinkNum": ,
"Param": "",
"ResultLogPath": ""
}
]
}
httpget应该是最简单的请求方式了,如果你需要传递什么参数,就直接往您url上追加就行了,get请求方式是用不到Param参数的:

httppost请求的配置 - 参数为json
post的配置与get不同的是设置不同的Method参数( "Method": "httppost_json" ),并且如果你有参数那么还需要配置Param节点( "Param": "{\"Number\": 1,\"Name\": \"张三\"}" ),参考如下配置:
{
"ResultLogPath": "", //默认不设置,日志记录在根目录
"MoTaskInfoes": [
{
"Method": "httpget",
"Url": "https://www.baidu.com/",
"LinkNum": ,
"Param": "",
"ResultLogPath": ""
},
{
"Method": "httppost_json",
"Url": "http://localhost:5000/api/Values/PostJson",
"LinkNum": ,
"Param": "{\"Number\": 1,\"Name\": \"张三\"}",
"ResultLogPath": ""
}
]
}
这里为了测试我写了一个简单的api接口,分别接收json和xml的参数,测试api接口代码如下:
[Route("api/[controller]/[action]")]
public class ValuesController : Controller
{
public static List<MoStudent> _students = new List<MoStudent>();
// GET api/values
[HttpGet]
public async Task<MoBaseResponse> Get()
{
return new MoBaseResponse { Data = _students };
}
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public MoBaseResponse PostJson([FromBody]MoStudent student)
{
var response = new MoBaseResponse() { Msg = "添加失败" };
if (student == null) { return response; }
_students.Add(student);
response.Msg = "添加成功";
response.Status = ;
return response;
}
[HttpPost]
public async Task<MoBaseResponse> PostXml()
{
var response = new MoBaseResponse() { Msg = "添加失败" };
var strReq = string.Empty;
using (var stream = Request.Body)
{
using (var reader = new StreamReader(stream))
{
strReq = await reader.ReadToEndAsync();
}
}
if (string.IsNullOrWhiteSpace(strReq)) { return response; }
var match = Regex.Match(strReq, "<Number>(?<number>[^<]+)</Number>[^<]*<Name>(?<name>[^<]+)</Name>");
if (match == null || match.Groups.Count <= ) { return response; }
var student = new MoStudent();
student.Number = Convert.ToInt32(match.Groups["number"].Value);
student.Name = match.Groups["name"].Value;
_students.Add(student);
response.Msg = "添加成功";
response.Status = ;
return response;
}
}
public class MoBaseResponse
{
public int Status { get; set; }
public string Msg { get; set; }
public object Data { get; set; }
}
public class MoStudent
{
public int Number { get; set; }
public string Name { get; set; }
}
我们往测试api地址 http://localhost:5000/api/Values/PostJson 发出请求,传递学生基本信息参数,然后通过api的get接口看看效果:

这里演示的只请求一次api,如果你想测试你自己api接口并发情况,你可以设置参数: "LinkNum": 或者跟多:

httppost请求的配置 - 参数为xml
post方式传递xml参数的配置和json差不多,需要注意的是需要修改Method( "Method": "httppost_xml" ),因为工具吧xml和json的配置区分开了,下面来演示下json和xml分别配置5次请求数的效果:

然后通过api的get接口获取下效果:

好了到这里演示就完了,如果您觉得该工具可以你可以去git源码:https://github.com/shenniubuxing3/PressureTool ,或者加入 NineskyQQ官方群:428310563 获取Framework版本的工具。
开源个.NetCore写的 - 并发请求工具PressureTool的更多相关文章
- 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0
前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...
- 开源作品-PHP写的在线文件管理工具(单文件绿色版)-SuExplorer_PHP_3_0
前言:项目开发过程中,网站一般部署到远程服务器,所以文件管理就不能和本机操作一样方便.通常文件管理是用ftp下载到本地,修改后再上传,或者远程登录到服务器进行修改.但是这些操作都依赖于复杂的第三方软件 ...
- Web大规模高并发请求和抢购的解决方案
电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...
- 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)
一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...
- java中如何模拟真正的同时并发请求?
有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...
- CountDownLatch和CyclicBarrier模拟同时并发请求
有时候要测试一下某个功能的并发能力,又不要想借助于其他测试工具,索性就自己写简单的demo模拟一个并发请求就最方便了.如果熟悉jemter的测试某接口的并发能力其实更专业,此处只是自己折腾着玩. Co ...
- go-channel处理高并发请求
目录 go-channel处理高并发请求 一.Channel简介 二.处理包并发请求 三.测试 1.测试工具 2.测试结果 go-channel处理高并发请求 最近看了一篇文章讲解怎样使用go-cha ...
- Android 开源控件与常用开发框架开发工具类
Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...
- 开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~
不知道你是否在工作中有遇到过类似情况: dubbo接口调试复杂,需要通过telnet命令或者通过consumer调用来触发. telnet语句参数格式复杂,每次编写都要小心谨慎,一旦出错又需重来. 复 ...
随机推荐
- shell网络客户端
需要把线上的access日志发送到另一个程序接收 开始想着用python实现,虽然python也有实现类似tail -F的方式,但太麻烦,而且效率也有折扣 偶然发现了shell可以实现网络client ...
- 对于JSONObject,我只是临时抱佛脚
说起JSON,大家就谈不上陌生了,因为对于数据传输语言,各位只认json,即使有XML语言,但是各位很少用吧.我也是,但是之前用过的json转换工具各种各样,我记忆中有过GSON(google).fa ...
- MVC架构简介及其测试策略
最近在WEB端测试工作中陷入了瓶颈,单纯的手动功能测试在没有成熟的代码规范之前还是很容易坑的,WEB自动化测试一时半会还没有什么进展,所以决定先学习一下网站用的MVC架构,跟着教程写了一个小网站,大概 ...
- c++字符串的输入的思考
字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲 ...
- JAVA下JSON的类型输出及使用
JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...
- CoreLocation 框架
获取设备的地理位置和方向 一.概述 CoreLocation框架,它提供了如下几种服务 确定设备的地理位置 高度 方向 或到附近 iBeacon 的相对位置. 这个框架使用所有可用的车载硬件.如 Wi ...
- NN-Neural Network
开始学习神经网络(Neural Network) 已有线性与逻辑回归,为什么需要用到NN 实际的应用中,需要根据很多特征进行训练分类器,当今有两个特征下,可以通过下图表述: 然而还有太多的特征需要考虑 ...
- 移动端车牌识别、行驶证识别OCR为共享汽车APP增添技术色彩
本文主题:移动端车牌识别.行驶证识别OCR为共享汽车APP增添技术色彩 本文关键词:车牌识别,证件识别,移动端车牌识别,行驶证识别,手机车牌识别,驾驶证识别 近两年,随着共享单车以及共享电车的兴起,有 ...
- Hybris 6.4 + Jrebel
Jrebel官网参考地址:https://manuals.zeroturnaround.com/jrebel/standalone/hybris.html Wiki Hybris参考地址:https: ...
- java中常用的并发工具类
· 1. 等待多线程完成的CountDownLatch 构造函数接收一个int类型的参数作为计数器,如果想等待N个点,就传入N.当调用CountDownLatch的countDown方法时,N就会减一 ...