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

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

. 对于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": 10,

"Param": "",

"ResultLogPath": ""

},

{

"Method": "httpget",

"Url": "https://cloud.baidu.com/",

"LinkNum": 10,

"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": 10,      "Param": "",      "ResultLogPath": ""},{      "Method": "httppost_json",      "Url": "http://localhost:5000/api/Values/PostJson",      "LinkNum": 1,      "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 = 1;

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 <= 0) { 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 = 1;

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": 10 或者跟多:

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版本的工具。

原文地址:http://www.cnblogs.com/wangrudong003/p/7235323.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

开源个.NetCore写的 - 并发请求工具PressureTool相关推荐

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

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

  2. 开源一个自写的病毒技术工具集

    文章目录 前言 界面 代码视图 功能介绍 基础技术 防双开 释放资源 注入技术 全局钩子注入 远程线程注入 APC注入 启动技术 三种方式创建进程 内存加载运行dll 自启动技术 注册表 快速启动目录 ...

  3. php 和mysql实现抢购功能_php处理抢购类功能的高并发请求

    本文以抢购.秒杀为例.介绍如何在高并发状况下确保数据正确. 在高并发请求下容易参数两个问题 1.数据出错,导致产品超卖. 2.频繁操作数据库,导致性能下降. 测试环境 Windows7 apache2 ...

  4. tsung压测mysql_高并发测试工具Tsung使用教程

    tsung是erlang开发的一款开源的多协议分布式负载并发测试工具, 可用作HTTP.WebDAV.SOAP.PostgreSQL.MySQL.LDAP 和 Jabber/XMPP的服务器压力测试. ...

  5. php处理抢购类功能的高并发请求,php处理抢购类

    ...d> 最近在做抢购系统,但头疼的是,在多用户高并发的情况下经常会库存出现问题.排查到,在同一时间内多用户同时下单导致查询和插入不同步了,而查询中跟插入又有时间差而在高并发的情况下导致库存问 ...

  6. php同时抢购 代码,php如何处理抢购类功能的高并发请求

    在高并发请求下容易参数两个问题 1.数据出错,导致产品超卖. 2.频繁操作数据库,导致性能下降. 本文主要和大家详细介绍了php处理抢购类功能的高并发请求,具有一定的参考价值,感兴趣的小伙伴们可以参考 ...

  7. python协程学习——写个并发获取网站标题的工具

    ​ 平时做渗透的时候,有时候给的是一些域名.一些 url .一些 ip 或者三者都有,手动去一个个地打开比较浪费时间.我们需要用最短时间发现一些有趣的目标,如 xx 管理后台.于是让我们用 pytho ...

  8. dubbo的端口地址和ip写在那_开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~...

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

  9. python3 爬虫例子_如何让你写的爬虫速度像坐火箭一样快【并发请求】

    开坑个新系列,主要面向新手,老司机可以忽略. 这个系列内的文章将会让你知道如何做到让你写的爬虫在运行的时候速度能像火箭一样快! 很多初学爬虫的朋友对于这方面的知识似乎是空白的,甚至还有一些在爬虫岗位上 ...

最新文章

  1. 不是计算机专业学python能找到工作吗-非计算机行业为什么要转行学习Python编程...
  2. 海龟交易代码java_海龟交易算法,实现量化交易(1)数据获取
  3. LeetCode177 第N高的薪水
  4. 在现代引擎游戏中使用正确的渲染打光流程
  5. .Net 程序集 签名工具sn.exe 密钥对SNK文件 最基本的用法
  6. Win11系统如何解除网络限制
  7. Python中使用psutil查看内存占用的情况(内存)
  8. ionic Toggle(开关控件)
  9. 很多人在网络上创业看不到本质
  10. 软件测试---------兼容性 / 安装卸载 / 易用性测试点(超详细)
  11. 微信公众号开发——基础认识
  12. 初级计算机基础知识教程,计算机基础知识(初中级教程)
  13. 2023年CISSP考点及预约时间参考
  14. 你还不了解的OKRs-E是什么?
  15. 【Linux-Linux常用命令】Linux常用命令总结
  16. 利用sklearn库决策树模型对iris数据多分类并进行评估
  17. 小飞鱼通达二开 解决通达OA数据库服务不能启动的问题(图文)
  18. 史上最强算法论战:请不要嘻哈,这是哈希 文章中算法的java实现
  19. 一名开发人员的奋斗历程
  20. Android Toast 自定义显示时长

热门文章

  1. linux下A免密码登录B
  2. 自制WiFiPineapple
  3. java.net.sockettimeoutexception read timed out
  4. MAUI 移植 Xamarin.Forms 自定义渲染器
  5. 如何捕获 EF 生成的 SQL 脚本?
  6. 研发考核难的本质是因为这三个特点
  7. 聊一聊对外API接口的存活检查可以怎么做
  8. WPF 密码框水印与明文切换
  9. [Abp vNext 源码分析] - 18. 单元测试
  10. 趣味图解+源码分析,轻松吃透Linux