本篇和大家分享的是一个 并发请求工具,并发往往代表的就是压力,对于一些订单量比较多的公司这种情况很普遍,也因此出现了很多应对并发的解决方案如:分布式,队列,数据库锁等;

对于没有遇到过或者不可能线上来处理并发问题的我们来说,需要模拟这种环境,不错这就是写并发请求工具的目的:

. 对于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的更多相关文章

  1. 开源作品-PHP写的Redis管理工具(单文件绿色版)-SuRedisAdmin_PHP_1_0

    前言:项目开发用到了Redis,但是在调试Redis数据的时候,没有一款通用的可视化管理工具.在网络找了一些,但是感觉功能上都不尽人意,于是决定抽出一点时间,开发一个用起来顺手的Redis管理工具.秉 ...

  2. 开源作品-PHP写的在线文件管理工具(单文件绿色版)-SuExplorer_PHP_3_0

    前言:项目开发过程中,网站一般部署到远程服务器,所以文件管理就不能和本机操作一样方便.通常文件管理是用ftp下载到本地,修改后再上传,或者远程登录到服务器进行修改.但是这些操作都依赖于复杂的第三方软件 ...

  3. Web大规模高并发请求和抢购的解决方案

    电商的秒杀和抢购,对我们来说,都不是一个陌生的东西.然而,从技术的角度来说,这对于Web系统是一个巨大的考验.当一个Web系统,在一秒钟内收到数以万计甚至更多请求时,系统的优化和稳定至关重要.这次我们 ...

  4. 重复造轮子,编写一个轻量级的异步写日志的实用工具类(LogAsyncWriter)

    一说到写日志,大家可能推荐一堆的开源日志框架,如:Log4Net.NLog,这些日志框架确实也不错,比较强大也比较灵活,但也正因为又强大又灵活,导致我们使用他们时需要引用一些DLL,同时还要学习各种用 ...

  5. java中如何模拟真正的同时并发请求?

    有时需要测试一下某个功能的并发性能,又不要想借助于其他工具,索性就自己的开发语言,来一个并发请求就最方便了. java中模拟并发请求,自然是很方便的,只要多开几个线程,发起请求就好了.但是,这种请求, ...

  6. CountDownLatch和CyclicBarrier模拟同时并发请求

    有时候要测试一下某个功能的并发能力,又不要想借助于其他测试工具,索性就自己写简单的demo模拟一个并发请求就最方便了.如果熟悉jemter的测试某接口的并发能力其实更专业,此处只是自己折腾着玩. Co ...

  7. go-channel处理高并发请求

    目录 go-channel处理高并发请求 一.Channel简介 二.处理包并发请求 三.测试 1.测试工具 2.测试结果 go-channel处理高并发请求 最近看了一篇文章讲解怎样使用go-cha ...

  8. Android 开源控件与常用开发框架开发工具类

    Android的加载动画AVLoadingIndicatorView 项目地址: https://github.com/81813780/AVLoadingIndicatorView 首先,在 bui ...

  9. 开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~

    不知道你是否在工作中有遇到过类似情况: dubbo接口调试复杂,需要通过telnet命令或者通过consumer调用来触发. telnet语句参数格式复杂,每次编写都要小心谨慎,一旦出错又需重来. 复 ...

随机推荐

  1. shell网络客户端

    需要把线上的access日志发送到另一个程序接收 开始想着用python实现,虽然python也有实现类似tail -F的方式,但太麻烦,而且效率也有折扣 偶然发现了shell可以实现网络client ...

  2. 对于JSONObject,我只是临时抱佛脚

    说起JSON,大家就谈不上陌生了,因为对于数据传输语言,各位只认json,即使有XML语言,但是各位很少用吧.我也是,但是之前用过的json转换工具各种各样,我记忆中有过GSON(google).fa ...

  3. MVC架构简介及其测试策略

    最近在WEB端测试工作中陷入了瓶颈,单纯的手动功能测试在没有成熟的代码规范之前还是很容易坑的,WEB自动化测试一时半会还没有什么进展,所以决定先学习一下网站用的MVC架构,跟着教程写了一个小网站,大概 ...

  4. c++字符串的输入的思考

    字符串的输入,是学习c++的一个重点,也是一个极富有细节意味的知识点,如果你不了解这些细节,你可能会在写程序时犯错而一脸懵逼不知所措. 与此同时,我们要了解c++缓冲区的概念,程序的输入都建有一个缓冲 ...

  5. JAVA下JSON的类型输出及使用

    JSON类型的输出: import java.util.ArrayList; import java.util.HashMap; import net.sf.json.JSONArray; impor ...

  6. CoreLocation 框架

    获取设备的地理位置和方向 一.概述 CoreLocation框架,它提供了如下几种服务 确定设备的地理位置 高度 方向 或到附近 iBeacon 的相对位置. 这个框架使用所有可用的车载硬件.如 Wi ...

  7. NN-Neural Network

    开始学习神经网络(Neural Network) 已有线性与逻辑回归,为什么需要用到NN 实际的应用中,需要根据很多特征进行训练分类器,当今有两个特征下,可以通过下图表述: 然而还有太多的特征需要考虑 ...

  8. 移动端车牌识别、行驶证识别OCR为共享汽车APP增添技术色彩

    本文主题:移动端车牌识别.行驶证识别OCR为共享汽车APP增添技术色彩 本文关键词:车牌识别,证件识别,移动端车牌识别,行驶证识别,手机车牌识别,驾驶证识别 近两年,随着共享单车以及共享电车的兴起,有 ...

  9. Hybris 6.4 + Jrebel

    Jrebel官网参考地址:https://manuals.zeroturnaround.com/jrebel/standalone/hybris.html Wiki Hybris参考地址:https: ...

  10. java中常用的并发工具类

    · 1. 等待多线程完成的CountDownLatch 构造函数接收一个int类型的参数作为计数器,如果想等待N个点,就传入N.当调用CountDownLatch的countDown方法时,N就会减一 ...