图形化压力测试工具Jmeter

Jmeter是一款强大的图形界面压力测试工具,完全用Java写成,关于Jmeter的介绍,网上其实有不少的文章,我原本是不想再重复写类似文章的,但我发现有些很关键性的,在我们测试中一定会用到的一些设置或操作很少见到有文章写清楚的,比如有这样的一个常见问题:如何对一个网站的多个链接进行压力测试?因为通常情况下,我们要测试的不是一个链接,假如我们测试的是某一网站的话,而这些链接我们通常都是写入到一个文本文件中,测试的过程中,会随机读取文件中的链接进行压力测试,我们所熟知的一些压力测试工具,例如Siege就可以这样干。
在我使用Jmeter的过程中,我发现我周围有之前使用过Jmeter的同事,但即使如此,他们对如何将多个链接写入到文本文件中并随机读取进行压力测试也不清楚,故我打算还是在有空的时候写一篇这样的文章,以方便使用者。
一、 官方网址
https://jakarta.apache.org/jmeter/
二、 运行
下载解压后,在目录jakarta-jmeter-2.4\bin下可以见到一个jmeter.bat文件,双击此文件,打开初始界面如下图:
Jmeter:图形界面压力测试工具
注意的是上面显示的是中文,如果你想使用其他语言,比如英文,那么通过菜单选项->选择语言->英文即可,当然转为中文也是同样操作。
三、 运行预准备
我们现在要对子猴博客来进行一番压力测试,压力测试对象为随机的几个网页链接,这几个链接是写在一个文本文件中的,在压力测试的时候会随机读取。
1、  建立一个线程组,如下图
Jmeter:图形界面压力测试工具
为什么要建立线程组?原因很简单,因为我们要模拟多个线程(用户)来访问网站。
线程组创建界面如下图:

名称可以随意填写,默认选中“继续”即可。
线程属性部分中,线程数是启动多少个线程,我这里填写的是60,Ramp-Up Period (in seconds)表示线程之间间隔多少时间允许,单位是秒,比如如果填写120,那么120/60=2表示60个线程间每隔2秒钟请求网站。
循环次数:60个线程运行完毕算是一次,循环次数就是这样的一个请求过程运行多少次,我这里填写的是1000.
每次修改一个设置后,别忘记了保存一下。
2、  设置请求服务器、压力链接等信息
接下来很自然的是,我们要测试的网站地址是什么?链接是什么?所以现在我们就来设置这些信息。
右键点击我们刚创建的线程组,在弹出的菜单中,选择添加->Sampler->Http请求,弹出如下图界面:
Jmeter:图形界面压力测试工具
名称:随意填写
注释:可有可无
服务器名称或IP:我这里填写 zihou.me
端口号:我这里填写80
Timesout部分可以不填
HTTP请求部分的协议:http,方法我选择的是GET,Content encoding我填的是UTF-8.
路径:
这里值得一提的就是这个路径,假如你只是对一个链接进行压力测试,那么这里就非常简单了,你就直接填写一个链接就够了,比如https://www.zihou.me,但很多情况下都不是这样的,我们这里需要多个链接,就如同刚开始讲到的那样,我们要将多个链接保存到一个文本文件中,然后随机读取进行压力测试。我们可以这么干,如图:
Jmeter:图形界面压力测试工具
Jmeter:图形界面压力测试工具
在选择一个功能下拉列表中选择_StringFromFile,然后在本机新建一个测试文件text.txt,在第一行(你也可以不在第一行)的值中填写测试文件的路径,如下图:
Jmeter:图形界面压力测试工具
然后点击“生成”按钮,在生成按钮的左边文本框中将生成一个字符串如:
${__StringFromFile(E:\test\test.txt,,,)}
在测试文件中,我们每行写一个URL链接,如下格式:
2011/03/26/3054
2011/03/26/3052
2011/03/26/3042
2011/03/25/3040
2011/03/25/3034
2011/03/24/3027
注意,每行前面并没有https://www.zihou.me这样的信息,因为我们在前面已经填写了服务器地址为zihou.me,这里就没必要再为每个url填写这个相同前缀了;另外,上面的url格式也只是个例子,表示域名后的部分,但很多时候url后面跟的都是各参数,比如https://www.zihou.me/p?a=1&b=3,如果是这种情况,则上面的链接可以写为:
a=1&b=3这样的形式。
现在我们可以来填写前面所说的路径了,如下:
/ ${__StringFromFile(E:\test\test.txt,,,)}
这样一来,当我们并非请求的时候,就会从test.txt中随机选择url来进行压力测试。
另外值得注意的一个地方是,如果参数中有中文的情况,运行的时候可能会出现乱码,这个时候就需要注意你在Jmeter中的编码设置与你要请求的网页编码是一致的。
路径文本框下面的选项,可以按默认的就成,Use multipart/form-data for HTTP POST是当请求中有附件的情况,一般情况下都不用选中的。
同请求一起发送参数部分:
如果你仅仅是对某一个固定的页面进行压力测试,那你就可以不用进行上面所说的在文本文件中设置URL的过程了,直接在这里设置就行了,这里的名称就是参数名,值就是参数值,在这里添加就OK了,但你如果是压力多个链接,那这里你可以不用填。
3、查看运行结果
上面设置好后,接下来很自然的想到如何查看运行结果呢?Jmeter在这方面提供了好些个查看方式,有表格形式,有曲线形式等等,我个人认为查看表格形式就足够了!
鼠标右键点击线程组,在弹出的菜单中选择添加->监听器->用表格查询结果,如下图:
Jmeter:图形界面压力测试工具
Jmeter:图形界面压力测试工具
当然,你也可以选择其他查看方式,你也可以看到在监听器菜单中,有好多种方式。
四、 运行
好了,现在我们终于可以运行了!
选择菜单项运行->启动,如下图:
Jmeter:图形界面压力测试工具
当然,在运行前,你得把所有修改都保存了。
运行后的结果表格如下:
Jmeter:图形界面压力测试工具
各属性如下:
Sample:每个请求的序号
Start Time:每个请求开始时间
Thread Name:每个线程的名称
Label:Http请求名称
Sample Time:每个请求所花时间,单位毫秒
Status:请求状态,如果为勾则表示成功,如果为叉表示失败。
Bytes:请求的字节数
如果Status为叉,那很显然请求是失败了,但如果是勾,也并不能认为请求就一定完全成功了,因为还得看Bytes的字节数是否是所请求网页的正常大小值,如果不是则说明发生了丢包现象,也不是完全成功。
在下面还有几个参数
样本数目:也就是上面所说的请求个数,成功的情况下等于你设定的并发数目乘以循环次数。
平均:每个线程请求的平均时间
最新样本:表示服务器响应最后一个请求的时间
偏离:服务器响应时间变化、离散程度测量值的大小,或者,换句话说,就是数据的分布(这个我不是很理解)。
在上面的参数中,我个人认为只要看Status和Bytes这两个就够了。
好了,主要的就介绍这么多了,其实Jmeter做压力测试的范围远远不止于对Web,它还可以用于Java小服务程序、CGI 脚本、Java 对象、数据库, FTP 服务器等等,更多的使用可以根据自己的需要去研究掌握。
最后还提到的一点是:你一定注意到了,HTTP请求和结果查看都是在线程组这一节点下创建的,其实,你也可以不用一定要在线程组下创建,你在测试计划下建立也可以,但创建在线程组下面可以使得我们的测试意图一目了然,也就是我们的HTTP请求和结果查看都是基于我们设定的线程组的。
转自链接《https://blog.sina.com.cn/s/blog_62192aed0101jdgi.html》
参考链接 Jmeter配置:《https://blog.sina.com.cn/s/blog_62192aed0101jdhb.html》

后端开发书架

<!– 以下部分转载 –>
自从技术书的书架设定为”床底下“之后,又多了很多买书的空间。中国什么都贵,就是书便宜。
不定期更新,在碎片化的阅读下难免错评。
书架主要针对Java后端开发,书单更偏爱那些能用简短流畅的话,把少壮不努力的程序员所需的基础补回来的薄书,而有些教课书可能很著名,但干涩枯燥,喋喋不休的把你带回到大学课堂上昏昏欲睡。
 

1. 操作系统与网络的书

《Linux内核设计与实现 – Linux Kernel Development》
Robert Love用最薄的篇幅,顺畅的文字将Linux内核主要的算法讲清楚了,比《深入理解Linux内核》《深入Linux内核架构》之类厚厚的全是代码的书强到不知哪里去,不是专门的内核程序员看这本足够了。
《Linux系统编程 – Linux System Programming》
继续是Robert Love,也是以薄见长,专门针对最重要的系统调用讲解,却甚至比APUE更详细。
《TCP/IP详解 卷1:协议 – TCP/IP Illustrated, Volume 1: The Protocols》
这么多年过去了,TCP的书好像还是只有这一本,有点旧了,看了也还是半懂不懂。后人在2011年写了第二版,看起来也清晰明了与时俱进了很多,机械工业正在翻译,英文好的建议直接看第二版。
《现代操作系统 – Modern Operating Systems》
如果看LKD未尽兴,可以回头看看这本基础概念,感觉比那本枯燥的《操作系统概念》(恐龙书)读起来舒服。
《深入理解计算机系统 – Computer Systems A Programmer’s perspective》
CSAPP,从巧妙的把程序设计及优化、数字电路基础、指令集体系、汇编语言、存储器体系结构等等这一摊来自各不同的学科的核心知识点搅和在一起,并以程序员的视角呈现,正确的直译书名是《程序员所需要了解的计算机知识》。
PS. 《UNIX环境高级编程》,APUE更多作为一本超厚工具书存在。《Unix 编程艺术》,扯的都是闲篇,厚厚的一本其实略读一下或看些精华笔记就行。
 

2. 算法的书

《数据结构与算法分析-Java语言描述》
够薄,数据结构与算法分析的点基本都涵盖了,而且示例代码还是Java写的。
《算法》
可与上一本对比着读,厚一些,也多些图,但知识点没上面的全,也是Java的。
《算法设计与分析基础》
数学系偏爱无比枯燥很多公式的《算法导论》,计算机系喜欢这本实用主义的典型。翻开就看到一段很文艺很贴心的话:“效率能用数学的严密性进行精确定义,而简单性就像“美”一样,很大程度取决于审视者的眼光。简单的算法更容易理解和实现,因而相应的程序也往往更少的Bug。当然对于简单性的美学诉求也是让人无法抗拒的。”
PS. 《数学之美》《编程珠玑》,都是专栏文章,讲得并不系统,可以当兴趣读物来看。

3. Java的书

《写给大忙人看的Java SE 8》
事实上,为了保持兼容性,很多项目都保持在JDK5/6上,这本书一次过将JDK7/JDK8的更新讲了,是本快捷的升级指南。
《Java并发编程实战》
人手一本不用多说了。
《深入理解 Java 虚拟机 第2版》
深入理解虚拟机并不是那么难,Java程序员都该看看,很多知识其实是必须的。
PS. 《Effective Java》外界一致推崇,但有点太过誉了。另外《Thinking in Java》有点旧了,新程序员得同时看两卷《Core Java》
 

4. 架构设计的书

《程序员必读之软件架构 – Software Architecture for Developers》
codingthearchitecture.com Simon Brown的书,不过叫“必读”有点过。这本书大概分两部分:
1. 编码的架构师:一直是我的职业模板,我记的笔记
2. 架构表达的文档模板: 当年我觉得RUP的基于4+1视图的机械架构文档模板不足以表达系统时,Simon Brown的模板给了很好的过渡范例。
《恰如其分的软件架构 – Just Enough Software Architecture: A Risk-Driven Approach》
由于人类与生俱来的惰性,计算机原本科学的、精准的设计方式,有了敏捷的借口之后就很难再维持了。本书就是在这种背景下,提出由风险来决定设计流程的度,当然,这个风险是广义的。
《发布!软件的设计与部署 – Release It!: Design and Deploy Production-Ready Software 》
关于高可靠性的软件,学校里不会教,出来社会却要面对的那部分,英文的原标题更清晰。
《大型网站技术架构:核心原理与案例分析》
淘宝出品,大型互联网站的科普入门书。
《大规模分布式存储系统》
继续淘宝出品,分布式文件系统与数据库的科普入门书。
《大数据日知录》
前几年参加各种技术会议,CAP,最终一致性,RWN,向量时钟,Paxos,一致性哈希,Gossip什么的能灌你一耳朵。而现在,你只要在家安安静静的看书就够了。不过这个领域发展太快,期望它可以持续出新版。
PS. 关于设计模式,我以前曾经有过很多很多本,GOF23啦,企业应用架构模式啦,EIP啦, POSA 5卷本啦,反模式啦,JavaEE/SOA/Restful的模式啦,但现在觉得对新人来说,一本Java写的《Head First 设计模式》,知道什么叫设计模式就够了。
 

5. 具体技术的书

《Redis设计与实现分析》
用Redis的工程师桌面必备吧,不用再多说了。
《从Paxos到Zookeeper》
Zookeeper的书,淘宝出品。
《Mastering Apache Cassandra 2nd》
2015年新出,当然来不及翻译,感觉Cassandra的书里相对最好的。
《Storm源码分析》
作为工具书在手边备一本,快速看一遍在文档之外多了解一些实现,毕竟那Clojure语言就不是给普通人看的。
《Storm分布式实时计算模式》
大概讲了下Storm如何结合其他开源项目实现一些场景,可以开拓眼界,但不直接指导我的项目的开发。
–在所有Storm书里,上面两本暂时是最推荐买的。
《Spark大数据处理技术》
在Spark的书里左挑右挑选了这本,不过是典型的多人合著的书。
 

6. 程序员的自我修养

PS. 最近没买什么新书,随便说点旧书:
《程序员修炼之道-从小工到专家》,Pragmatic Programmer-注重实效的程序员开山之作,翻译的马达维文笔也和熊节一样好。
《代码整洁之道》《程序员的职业素养》,英文名是很相近的《Clean Code》和 《Clean Coder》,应该接替《代码大全2-Code Complete2》成为必看的系列,因为后者太厚了,而且也有不少过时的东西,要自己去过滤。
《重构》很厚,但最有价值就是前面几章的洗脑篇,具体实作不如薄薄的《重构手册》
关于敏捷的书,最开始的那本《解析极限编程–拥抱变化》就很好,再随便找本Scrum的流程看看就够了,《敏捷开发的艺术》也不错。
《布道之道 – Driving Technical Change:Why People on Your Team Don’t Act on Good Ideas,and How to Convince Them They Should》,经常在组织里推行新技术的同学可以看下,七种怀疑论者模式,脑海中一幅幅熟悉的面孔。
《软件架构师的12项修炼》,架构师的软技能。
欢迎大家在评论里补充。
文章持续修订,转载请保留原链接: https://calvin1978.blogcn.com/articles/bookshelf.html
<!–  转载结束 –>
不能用evernote,这里继续记录自己要写的东西。
首先,自己明确一下,当前使用的后端是Java,那么必须在Java上有比较深入的研究后面才比较好发展。
感觉要提升的还是有很多。首先就是先搞定Java基础吧。根据上面说的和自己的当前状况,以及所有的资源,总结自己接下来要学习的东西:
Java相关:
《写给大忙人看的Java SE 8》《Java并发编程实战》《深入理解 Java 虚拟机 第2版》《Thinking in Java》,两卷《Core Java》
《程序员修炼之道-从小工到专家》,Pragmatic Programmer-注重实效的程序员开山之作,翻译的马达维文笔也和熊节一样好。看这个介绍,感觉是我现在比较需要的。从二手市场上估计不太好找,这个准备买新的了。
目前就这些。

转载:读取.properties配置文件

一、前言                              
Java工程中想log4j、数据库连接等配置信息一般都写在.properties文件中,那么如何读取这些配置信息呢?下面把相关方法记录下来供以后查阅。
 
二、.properties文件                        
配置文件的一种,内容以键值对的形式存在,且每个键值对独占一行。#号作为行注释的起始标志,中文注释会自动进行unicode编码。示例:

# ip and port of server socket
ip=127.0.0.1
port=9999
# error message
msg=I'm sorry, bye bye!

假设上述内容存储在config.properties文件下,且bin目录结果如下:

  bin
|– main
|– Demo.class
|– config.properties

后续章节的示例将以上述内容作为目标对象来操作。
 
三、通过 Properties对象 操作                    
读取属性,示例:

复制代码
public class Demo{
  public static void main(String[] args){
    Properties props = new Properties();
    InputStream in = Demo.class.getResourceAsStream("../config.properties");
    // 或使用文件输入流(不推荐),假设当前工作目录为bin
    //InputStream in = new FileInputStream("./config.properties");
    props.load(in);
    in.close();
    // 读取特定属性
    String key = "ip";
    String ip = props.getProperty(key);
    // 遍历所有属性,方式一
    Set keys = props.keySet();
    for (Interator it = keys.iterator(); it.hasNext();){
        String k = it.next();
        System.out.println(k + ":" + props.getProperty(k));
    }
     // 遍历所有属性,方式二
    Enumeration en = props.propertyNames();
    while (en.hasMoreElements()){
        String k = en.nextElement();
        System.out.println(k + ":" + props.getProperty(k));
    }
  }
}
复制代码

1. 通过 Demo.class.getResourceAsStream(“../config.properties”); 读取配置文件,配置文件的相对路径以类文件所在目录作为当前目录。
2. 通过 new FileInputStream(“./config.properties”); 读取配置文件,配置文件的相对路径以工作目录(可以通过 System.getProperty(“user.dir”) 获取工作目录)作为当前目录。
注意:上述两种方式获取的配置文件均没有被缓存。每次都要重新加载配置文件。
写属性,示例:

复制代码
Properties props = new Properties();
InputStream in = getClass().getResouceAsStream("properties文件相对于当前类加载路径的文件目录");
props.load(in);
OutputStream output = new FileOutputStream("properties文件路径");
props.setProperty("ip", "10.248.112.123"); // 修改或新增属性键值对
props.store(output, "modify ip value"); // store(OutputStream output, String comment)将修改结果写入输出流
output.close()
复制代码

 
四、通过 ResourceBundle对象 操作                    
通过该方式仅能读取配置文件而已,不能进行写操作。示例:

// ResourceBundle rb = ResourceBundle.getBundle("配置文件相对工程根目录的相对路径(不含扩展名)");
ResourceBundle rb = ResourceBundle.getBundle("config");
try{
    String name = rb.getString("name");
}
catch(MissingResourceException ex){

注意:上述方式会缓存配置文件信息,后续读取时均是读取缓存中的内容,若在此期间修改了配置内容是无法实时同步的
ResourceBundle有两个子类ListResourceBundle和PropertyResourceBundle,在读取properties文件时实际上是使用PropertyResourceBundle来处理。
题外话:
ResourceBundle主要用于解决国际化和本地化问题。通过资源命名定义各语言和方言的信息,然乎程序在运行时获取当前本地化信息,并根据本地化信息加载相应的资源完成本地化。
资源命名规范:

复制代码
// 仅含家族名
MyResource
// 含家族名和语言
MyResource_en
// 含家族名、语言和国家
MyResource_en_US
复制代码

对应的Java代码:

// ResourceBundle首先会根据语言和国家的本地化信息去查找资源(假设现在要查找MyResource_zh_CN),当找不到时就会找MyResource_zh,再找不到就用MyResource。
ResourceBundle rb = ResourceBundle.getBundle("MyResource", Locale.getDefault())

 
五、总结                              
当然方式不止这些啦,日后继续补充!
尊重原创,转载请注明来自:https://www.cnblogs.com/fsjohnhuang/p/3995386.html  ^_^肥仔John
 
六、参考                              
https://www.cnblogs.com/panjun-Donet/archive/2009/07/17/1525597.html