开源个.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": 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跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/324424.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅析DNS域名解析过程

转载自 浅析DNS域名解析过程 对于每一个HTTP请求发起过程中&#xff0c;都有很重要的一个步骤——DNS解析&#xff0c;本篇文章将跟着DNS解析过程来分析域名是如何解析的。 一、DNS域名解析步骤 下图是DNS域名解析的一个示例图&#xff0c;它涵盖了基本解析步骤和原理。 下…

最好的方法,是为你们量身定制!

昨天还和佟老师在讨论3班的学习情况&#xff0c;整体来说&#xff0c;学习氛围还是比较好的。由于近几天各种事纠结在一块儿&#xff0c;本来想给三班的学生制作一个提升计划&#xff0c;一直都腾不出来手。今天&#xff0c;终于抽了一点点时间&#xff0c;在原来互帮互助计划的…

Entity Framework Core 命名约定

注意&#xff1a;我使用的是 Entity Framework Core 2.0 (2.0.0-preview2-final)。正式版发布时&#xff0c;功能可能存在变动。Entity Framework 迁移允许从模型生成数据库&#xff0c;这意味着必须从类名和属性名生成数据库对象的名称。对于大多数人来说使用默认名称是没有问…

ZOJ1654-Place the Robots【最大匹配,图论】

正题 大意 一个n*m个地方&#xff0c;有墙&#xff0c;草地和空地。在空地可以放机器人&#xff0c;机器人会将看到的其他机器人 [河蟹] 掉。他不能隔墙看。求最多能放多少个机器人。 解题思路 这里用一种奇特的构图方法&#xff0c; &#xff08;盗一下ppt里的图&#xff0…

彻底理解JVM常考题之分级引用模型

转载自 彻底理解JVM常考题之分级引用模型 本文通过探析Java中的引用模型&#xff0c;分析比较强引用、软引用、弱引用、虚引用的概念及使用场景&#xff0c;知其然且知其所以然&#xff0c;希望给大家在实际开发实践、学习开源项目提供参考。 Java的引用 对于Java中的垃圾…

越优秀的人越努力,越努力的人越幸运!

昨日晚间&#xff0c;学校值班&#xff0c;在楼道里面巡查几遍之后发现无异常情况&#xff0c;接着就去值班室中打开电脑忙自己的事。过了没一会儿&#xff0c;3班三学生去找我了&#xff0c;对我说&#xff0c;最近班里的学习情况不是太好&#xff0c;部分学生上课容易打盹&am…

SOA和微服务之间的区别

近几年&#xff0c;我们有很多文章对SOA和微服务之间的不同点和相似点进行了分析。有些人认为SOA有很多地方是值得微服务学习的&#xff0c;而有些人则认为区别对待微服务和SOA会更好。而Neal Ford认为&#xff0c;将单体迁移到面向服务的架构要比迁移到微服务来得容易。关于选…

考研生的努力程度是有多恐怖!

2021年全国研究生招生考试在12月26日开始&#xff0c;不过我没有参加。早就听闻考研生是多么多么的努力&#xff0c;今日一见&#xff0c;果然名不虚传&#xff0c;在这之前他们是有多努力我不知道&#xff0c;但是今天我所见到他们努力的程度&#xff0c;可以用恐怖来形容。偶…

全文索引 - Pomelo.EFCore.MySql

背景 全文索引&#xff1a;MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索&#xff0c;可以利用全文索引来提高匹配的速度。Pomelo.EntityFrameworkCore.MySql&#xff1a;一款第三方MySQL的Entity Framework Core驱动&#xff0c;在GitHub中开源&#xff0c…

“老师,为什么我一上课就感到困,听课听的总是走神?”

“老师,为什么我一上课就感到困,听课听的总是走神?” “老师,为什么我你讲的每个题我都能听明白,但是让我自己做我就一点思路都没有呢?” “老师,我记下来语法了,但是还是不会用怎么办?” “老师,我……” 怎么办?怎么办?急死了! 今天老师就给你解答一下你的为什么…

高并发场景下的限流策略

转载自 高并发场景下的限流策略 在高并发的场景下&#xff0c;我们的优化和保护系统的方式通常有&#xff1a;多级缓存、资源隔离、熔断降级、限流等等。 今天我们来聊聊限流。 为什么需要限流 举个比较简单的例子&#xff0c;正常来说&#xff0c;一个员工A他每天能够处理…

Entity Framework Core 批处理语句

在Entity Framework Core (EF Core)有许多新的功能&#xff0c;最令人期待的功能之一就是批处理语句。那么批处理语句是什么呢&#xff1f;批处理语句意味着它不会为每个插入/更新/删除语句发送单独的请求&#xff0c;它将在数据库的单次请求中批量执行多个语句。在这篇文章中&…

mybatis和spring整合时这个报错,应该这样解决!

01问题描述今天在写mybatis和spring整合的时候&#xff0c;出现了个问题&#xff0c;其实也没有多难&#xff0c;就是自己没有仔细看&#xff0c;特此记录一下。报错问题如下&#xff1a;org.springframework.beans.factory.BeanCreationException: Error creating bean with n…

一个简单的例子,学习自定义注解和AOP

转载自 一个简单的例子&#xff0c;学习自定义注解和AOP 记得今年年初刚开始面试的时候&#xff0c;被问的最多的就是你知道Spring的两大核心嘛&#xff1f;那你说说什么是AOP&#xff0c;什么是IOC&#xff1f;我相信你可能也被问了很多次了。 1、到底是什么是AOP&#xff…

Xamarin for iOS 11(一) - 初尝ARKit

编者语&#xff1a;Xamarin 的兼容性是它最大的优点&#xff0c;对于iOS / Android 新的功能支持也是无缝的&#xff0c;做到100%兼容。Xamarin.ios for iOS 11.0的支持已经开始&#xff0c;大家可以在这里下载最新的Preview支持 (https://releases.xamarin.com/preview-xcode-…

挺不喜欢下雪的

你要储蓄你的可爱&#xff0c;眷顾你的善良&#xff0c;变得勇敢。当这个世界越来越坏时&#xff0c;只希望你能越来越好。——《南山南》昨天夜间&#xff0c;窗外雪花飘飘&#xff0c;朋友圈中到处都是晒下雪的照片&#xff0c;有的说是“这是2020年的第一场雪”&#xff0c;…