00:00
啊,Hello,大家好,然后之前给大家分享了啊,两种压测模式的两个虚拟类啊,今天给大家分享一下,就是基于单个HTTP请求的,呃,两个虚拟类的一个具体实现啊,然后我们看两个代码啊,把它关掉,嗯,就在这,就是request time,还有request,还有一个request time,然后呃,两个类型差不多啊,我们就还先从这个时间开始讲吧,为还在最前面,呃,首先它继承于这个呃这个呃,Limited time count这个啊大家看没有写那个泛型啊,这里就可以不用写那个泛型了,嗯,这里写了有一个嗯记录啊,好像没有下面没有用到,嗯,然后看一下。
01:00
首先呃这是一个基于呃单个HTTP请求的一个呃多线程类的一个实现,呃首先我们看它有一个呃http request背这个对象,呃其次呢,它是有这一个,还有这一个构造方法。我们先看他是第一个构造方法,就是。啊,通过一个HTTP的呃,Request对象和这个另外一个响应呃不总的请求,呃循环时间的一个啊参数,然后大家看这里面就是一个。啊,这这个。A times marked。啊,这两个对象都是空,然后这儿有个类似于筷子的,这是一个比较常规的啊,还有一个是这样的。
02:00
就是他有那个。嗯,这里呢,呃,就主要方为了方便嘛,就是加了一个多加了一个这个一般呃,可能就会一般这个mark都是要有的,因为那个HTTP的对象。留在我这个对象呢,就标记起来还是比较简单的,就标记一个,像我们现在就标记一个快速的ID就可以了。嗯,然后那个有一个啊空山的过的方法啊,大家看这个before,来看这个这个before before就是掉之前的啊,就那个虚拟类的这个before,然后就把这个全局的K,嗯改成for就可以了,然后再有个GCC的呃,Start的呃这个方法大家看一下,之前有一个呃上次讲的时候好像有一点小问题,然后我已经改过来了,呃这里面就主要是因为这个flag,呃flag有个全局的一个呃这个多线呃这个多线程资源回收的一个呃标记,然后这个标记其实每次运行完一次都是要呃在这个stop或者说是呃这个地方都是会要关闭,把它自成为啊,所以说每次起来的,每次重启这个线程的时候。
03:29
当然不一定是同一个对象,嗯,重启的时候,这个全局的静态的这个flag没有关,那没有开啊,这里面在这个C到一的时候,哎已经把它打开了,就在这里啊,大家看这个它有一个呃静态的呃这个修饰符的是呃那个嗯Java里面有个内存一致性的这个啊,然后这里面你看这个盈匿的方法。
04:01
适用的这个同步符号修的这个静态方法的话,那这两个呃呃标呃这两个那个修饰符一用的话,就基本可以保证,嗯怎么说呢,就保证在某一段时间之内只有一个这个调这个方法,然后只有一个积极对象啊呃不GC线呃这个线程的对象这样。然后我们看这个start的这个方法,就是先将这个GC的呃,这个线成的状态给那个标记一下,然后拿出来之后,如果它是new的啊,说明这个线程已经是创建完了,但是它没有开始运行的话,然后我们就调那个t star的方法,这个嗯写的有点像大家看一下g star的方法,就像调一个那个线程的通过那个呃启动线程,那多线能那个方法,呃,如果它是呃这个结束了,或者是别的这一个要看这个线程是这样的,这个线程的一个状态,然后它是叫那个重新将这个这这个是现成的,好像是有一个现成的几个状态吧,我们看一下啊,New就是new新建的这个运行的。
05:25
就是主色的,还有这是等待的,就是这个微信的这这个应该是结束的一种现成状态,完事之后,然后如果是那什么的话,呃,这个GC就会被重新隐匿它,呃第一个呢,就是呃保证就是每次呃多线程HTTP请求多线程截开始的时候就会将那个线程启动,但如果它启动了之后呢,因为这里面有个同步符,呃去那个修饰了这个方法,所以说只有一个现成的访问的,呃如果它已经启动了,然后就啊就OK了。
06:05
然后如果它已经这个线程状态已经over了,就就这线程已经结束了之后,我们就重新对它进行复制,这个经里面会会返回到大家看返回的是new啊,New的话就是会返回一个重新的呃那个呃那个线程对象。然后我们回到刚才那个方法里面。这就是他before之前做的事情了,Before之前就是打开全局的开关,然后把那个呃资源回收线程给启动,然后doing呢啊就是发送这个request,这个这个比较简单,大家去看一下发送这个request,然后呃返回这个request的那个反应是in反应,实体里面的内容没有做过多的校验,嗯,因为这里面呢,嗯,一般来说呢,接口请求如果是成功的话,呃就要看业务了,呃一般来说这种单单接口的请求的话,就是不太不太在乎呃不太去做业务上的校验,嗯这个这一块呢,主要留给那个呃服务端日志和服务端的监控去做这个事情,嗯,是这样的,嗯。
07:33
嗯,所以说这里面只只简写了呃只是把请求发出去,然后拿到解析响应,并没有对解析响应进行做呃任何的处理,是这样的,呃大家如果是自己当前测试的接口就是呃对业务要求就非常高,就还必须要呃对业务呃返回到接口,接口返回进行业务验证的话,呃大家可呃需要就是可以再集成一下,重写一下这个方法,拿到那个响应之后去对响应的内容进行校验,然后这有一个可用的方法,然大家看这个就是我先用一个空间的构造方法,然后把这个呃造呃构造出来,然后把它的time赋值,然后这request用的是这个request的呃那个C方法,然后呃这里面如如果是嗯大家要多用。
08:33
哦不,如果说大家是多线程,比如说我现在100个线程,然后用到的全都是一个request了,因为这个就一个request的就OK的话,如果用一个request的,大家一定要copy个100份啊这里面呃原因就是在于如果多个线程共享一个request的对象的话,呃在在mark,呃大家看会有一个head mark里面嗯,去标记那个对象的时候,你看CB标记对象的时候,它会有一个remove,还name会先remove,那在这个时候如果是中线程去同时访问这个,这个方法执行到这一步的时候就会就有可能会报错啊,就是呃怎么说呢,就是比如说你每次有不同的head单,呃不同的比如说这个head单name就有快子来D,不同的有快子的。
09:33
我需要先把这个呃,Request的对象的requestd给remove掉,然后再给它put,再给它放进去一个新的啊,是这样的啊,所以这个地方呃大家应该嗯之前如如果是对多线安全有一些了解的话,就就知道,如果是呃当前这一个对象你put了之后会发送出去,这个你发送的这个标记的这个对象就不一定就发,比如说你标记有快速的ID123,第一第十个线程标记快ID123,但是这个线这个request有可能被第11个线程发走了,然后第十个线程去发出去,有快速的的话,可能就是比如说第第50个线程标记完之后的有快速的就被呃不有快速的呃ID就被第十根线能标走了。还有一种可能就是。
10:28
当这一个request的对象只有一个呃,Request ID的话,两个线能同时remove的话,就有可能出错,所以说我这里建议所有的呃,我对于单呃多线程去执行请求的话,线程之间嗯不要有共享任何对象啊,其中包括htd request的一定要将呃所有的都呃隔离开,嗯,包括这个啊,标记对象mark啊这里面用的是一个范request的克隆啊,Request的对象的一个方法啊,是这样的,这是一个啊,之前给大家讲过啊,就是先把呃,Attp request busy对象解析呃它的它其实线程就是请求方法,请求地址,呃,Host name,然后这是请求,嗯。
11:29
呃,行里面的内容啊,不对啊,请求行里面的呢,就方法协议类型和接口地址啊,还有请求头里面host的有可能在请求头里面,但是在这个呃,Request对象里面就可可以直接拿到host,然后就是head,呃完了之后是那个head完之后就是请求body,一共就是个三部分内容,把它解析完之后,然后重新再组装成一个request,嗯,这里面有一个,嗯,这里面有一个问,就在这地方有个do copy这个地方啊,因为这个地方这个atv那个自带的一个copy方法,那好像不太不是特别好用,我试了一下就不太好用,所以说我就自己重新写了一个,然后这是一个马,然后把这个呃return回去,然后这就是一个那个。
12:26
基本的呃,基于单个http request的对象的一个啊,多线程任务类的一个具体实现啊,是这样的啊,具体怎么用呢?看看有没有啊哦啊还是有有有用的啊在这里这里是用到了,大家看这个,就是你看我是呃拿到一个,先拿到一个E丢盖的对象,完了之后我去创建了一个呃这样的一个对象,大家看到没有,就是head mark,就我标记了一个快速的ID这个,然后我先拿那个呃去请求一下,然后我这里把那个access。
13:26
项等于负一啊这样的,就我把所有的我的标记对象和我的啊,所有的那个请求的快的ID我都会,呃响应时间加上有快ID我都会把它记录下来,然后这个就是创建这个对象的方法啊,然后这里面呃是讲究的那个执行类的方法,这个里面乘以二呢,行在这里,嗯,这是格位语法的一个啊妙处吧,直接乘以二就可以,乘以二可以重写它这个乘法是这样的,然后呢,嗯,我们回到这个快速的这个时间超过时间的,然后这个就比较简单了,因为大的呃,绝大业务呃,绝大部分的逻辑处理的话,它是在那个在那个那个呃虚拟类里面,那个run方法里面,所以说这里面就不用管。
14:28
资源就不用管了。啊,这个是这样的。嗯,然后呢,嗯,我们去看那个次数的。啊,次数的差不太多。这差不太多,但次数的呃东西刚才看到了,比较复杂一些啊,这个这个会记录一个超时的请求吧,但是我好像然后他也是有一个快的背的对象的这个啊,这个好像是多余的啊,因为这个记录的筷子的这个操作,我已经在这里面记录了这个地方。
15:24
就是记录所有。超时的请求在这个地方已经记录了啊,在这个地方就如果他的时间差大于我可接受的时间差的话,我就会把这个加进来。然后呢,我们接着看这个啊,这是一样的啊,这个也多了,Sorry,然后这个也是两个构造方法,Time跟那个time是一样的两个构造方法,然后这是一个空间的构造方法,然后这个比before是一样的,这这里是呃在嗯大家在做压力测试的时候,一个GVM米呢,我进我建议就是呃只运行一个保险的任务,等一个验保险任务运行完之后再运行另外一个,然后大家看这个跟那个以时间为限制的一模一样的,这就是这两个,呃一个是呃通过运行一定时间的这个多线程任务类,然后这个运行一定次数的多线程任务类。
16:49
啊,这样方法都是一样的,然后这一波可用方法,然后新建,然后把它的属性全都呃铺的全都重新复制,或者说如果是对象的话,就拷的那个这里面这样,然后这个用起来也也会比较简单。
17:14
我再找一个。那个是另外来看这个,这个也是盖,跟刚才那个是一样的。然后执行第二个盖,然后在这里面执行这个,然后在这里面去执行,就把那time和这个mark的标记对象完了之后,创建完之后放到这里面,然后执行完啊执行就这个这个这个鬼样子,然后这么觉得可以添一句,嗯,看一下这个就把它就描述也给加进去,我运行一下,因为这个这个车的框架是用那个写的,嗯嗯,他他以前关键字都是give那些东西,嗯,我现在是把他的放到这个地方啊在这地方有这就是两次。
18:36
那不是一共就是两个线程,两次有四次的请求时间,每个的请求时间。说。然后嘞,我们看那个mark里面有标记的。这就是每次请求的。不,呃,这是响应时间,这是请求的request来D,因为我标记的是request来D嘛,啊,大家看这个request来D分布有一个,嗯,一个关系啊,我我自己做的是这样的,大家看这hard mark这个对象。
19:08
它的于快出力怎么来的,就是八加上A,大家看到I是怎么来的,I就是一个啊,I就是个I吧,然后再加number number加加number,从这个100万开始的,然后呃,单个线程的话就往上加嘛,然后我们看它负值的时候,这个S等于这个这个name get的,呃,这是一个大家看一。然后大家看,就是a safef,然后get and ADD in,就是把当前的这个name是从100开始的,然后我把它取过来再加一,因为这个操作就是AUM,这个是原子这个意思啊,A ato,这个in tIgEr这个对象是呃,Get and ADD,这个方法是可以做到那个线程安全的,这是一个线程安全的类,就是我大家看,虽然说如果我去创建很多这个mark的话,它会呃,就有可能这个S,如果不用这个的话,这个奥的话,它现能可能是这这个这number是一样的啊,但是如果我用到的话啊,它就是不一样的。
20:43
呃,大家不知道大家啊,有没有理解get到啊,就是我用这个方法,就你看大家看这个这个对象是一个静态的全局的,然后是这样的,完了之后我去对它用线能安全的方法拿到拿到in特值去再再给他加一个这个操作是呃呃是那个这这个操作是那个线能安全的安全的话,然后所以说我每次创建那个mark的时候,哎,我就是完全就是C的name就是不一样的,然后我们大家看一下这个标记,嗯,你看前两个是101,呃后两个是102啊这个就可以明显的区分到,然后后面就是从呃100万开始,这是100万第一次这是1000001这。
21:44
第二次这是一百万一百万人,这样的话基本就保证了这个呃,STEM的一个,呃,不,这个request ID的一个唯一性是这么一个,这么一个原因,可以这个还得就是掉。
22:05
这就是如果是做单接口的性能测试的话啊,这就是一个呃,一个单接口性能测试的一个DEMO,测试完之后,嗯,会在左侧这个当前目录的里面啊,Data里面首先会有一个线程数加你的描述,然后加呃执行的这个时间的啊,这个时间我忘了,我记得应该是呃结束时间还是开始时间,某一个结束时间或者开始时间。的2020年4月13号下午15:37:12,这个结束时间,它是这么一个,它是这么构成的,然后它的内容呢,嗯,就是呃,无序的,大家一定要记得这是无序的去记录每一次循环所呃就相当于是每一次发送请在这里面,就是每一次从发送请求到接收到响应中间所消耗的时间啊这样然后呢,我们在这mark这个嗯那个文件夹下面发现一个有你的任务描述,再加上这个时间的2020年4月13号这一个乱七八糟的时间的数字的一个test的文件,它里面就是记录的是超时,因为你设置了save time超时的请求时间,然后连接符加你的标记这里。
23:41
在这个DEMO里面就有快速来D,然后如果出错了,就会在这个快子里面会记录,这个是之前后来新加的一个功能,就是在如果请求出错的话,会把那个请求记录在这里面,这是我之前做的一些DEMO,大家看这个这个这第一个就是对时间啊,就是日期里面的对那个DD,然后这后面是时间,然后这是域名,呃,域名这是URL,因为如果这用我用的都get嘛,Get的话就是这样的get,然后我们看里面的记录什么行啊,这有点太多了,找个简单的,这里面就是记录这个request,就是get,然后这这这这些错误的请求和响应信。
24:42
机这个详信息有点太多了,我估计是他品质报错什么,这是cookie,大家看一下这个cookie,然后想要的扣的这是cook费里面的值,然后为什么要记录呢?就是为了排查排查错误原因,如果有报错的话,他这这个request的这个对象,呃,Request的这个文件夹面就会记录一个那个呃,一个文件每错一次记录一个,但如果是嗯你的比如说你在100个县城,每个县城跑100次,就是1万个,中间5000个都出错了啊,那我就不记那么多了,最多记100个,嗯,如果是频繁出错的话,其实呃个人建议就是测试就已经失败了,就可以直接暂停记录测试原因,测试失败原因失败了就可以了,OK啊OK啊,今天的分享就到这里了,嗯,欢迎大家关注我的公众号,拜拜,下期再见。
我来说两句