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

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

. 对于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. java(5)循坏结构

    一. while循环 1.循环的优点? 减少重复代码的编写:程序会更加的简洁 2.语法 while(表达式){ // 1.表达式是[循环条件],结果必须是boolean类型 //2.{}中的代码,即[ ...

  2. CRL快速开发框架4.4版发布,支持主从读写分离

    经过一些调整和优化,4.3已经运行在生产环境,对于不久将会遇到的查询性能,读写分离需求列上日程 读写分离需求 对于一个数据库作了主从发布/订阅,主库为DB1,从库为DB2 所有写入通过DB1,所有查询 ...

  3. 3D旋转动画练习 demo

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  4. 不完全翻译:Threading in C#-Getting Started

    Introduction(引入,介绍) and Concepts(概念) 原文地址:http://www.albahari.com/threading/ 注:水平有限不能全文翻译,备注了个别字段和短句 ...

  5. git rebase -i命令修改commit历史

    [TOC] 修改commit历史的前提 修改历史的提交是可能有风险的,是否有风险取决于commit是否已经推送远程分支,未推送,无风险,如果已推送,就千万不要修改commit了. 修改commit历史 ...

  6. C++构造函数(一)

    本篇是介绍C++的构造函数的第一篇(共二篇),属于读书笔记,对C++进行一个系统的复习. 构造函数的概念和作用 全局变量未初始化时为0,局部变量未初始化时的值却是无法预测的.这是因为,全局变量的初始化 ...

  7. HTTP协议入门

    1.概述 (1)HTTP是应用层协议,是从Web服务器传输超文本到本地浏览器的传送协议,端口号为80.(2)默认情况下HTTP使用TCP,但是也可以基于以后存在的其他可靠传输协议.由于UDP无法提供可 ...

  8. docker registry私有仓库部署

    私有仓库服务端:12.40[root@centos7_golang ~]# docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry ...

  9. JAVA优雅停机的实现

    最近在项目中需要写一个数据转换引擎服务,每过5分钟同步一次数据.具体实现是启动engine server后会初始化一个ScheduledExecutorService和一个ThreadPoolExec ...

  10. oracle学习笔记(2)-基本术语

    oracle基本术语 先上图. 相当粗糙的一个图,可能有些地方不够精细,大致结构基本是对的. 逻辑结构上从大到小的依次为文件(file)->表空间(tablespace)->段(segme ...