专栏名称: whybask
今天的记录,有助于改变明天的我。
今天看啥  ›  专栏  ›  whybask

从http、浏览器调试到压力测试(一)

whybask  · 简书  ·  · 2020-02-01 14:27

文章预览

近期工作中发现一个应用程序存在性能瓶颈,该应用程序提供的业务功能具有周期性高并发的特点,即每月的某个时间段用户的访问量会比平时大很多。随着随着时间地推移、业务地不断扩展,近期该程序在高峰期响应不过来了,让用户感觉该应用程序没有反应了、死掉了。于是大家就立即组织起来解决性能瓶颈问题。经过群策群力以及大家的努力,最终成功解决了问题。

很多事情不是你学会了才去做,而是你做了就学会了 。在解决问题的过程中,大家收获了新知识、巩固了老知识,在专长上更迈进了一步。我觉得有必要把一些关键知识总结出来,并推广给其他同事们,本文就是在这样的背景下写出来的。

本文共分3个章节,即:

一、http协议

1.为什么要了解http协议?
2.http协议是什么?
3.http工作原理
4.重要的http参数

二、浏览器调试

1.什么是浏览器调试?
2.为什么要掌握浏览器调试?
3.如何使用浏览器调试?
4.浏览器调试小结

三、压力测试

1.性能测试 vs 压力测试
2.压力测试的流程
3.压力测试关键指标
4.压力测试工具JMeter
5.压力测试实战

您可能注意到了,上述内容偏重于“发现性能问题”,而缺少“解决性能问题”的内容,为什么呢?

我在学生时代,曾经听到一次父亲与他的医生同行们的交流,内容大概是:改革开放后,发现医疗技术与国外相差了很多,尤其在“医学检测”方面的差距更大。在后续引进“彩色超声波、CT、核磁共振”等设备前,大家都只能做做低精度的X光照片,医生们也是凭经验诊断。检测技术的落后,导致了治疗效果的不佳。

在解决应用系统的性能问题时,我们就好比面对一个“病人”, 如果不能检测出病因,就动手治疗,其结果很可能是“治不好”、浪费精力和资源 。另外,找到原因后的“对症下药”,即:数据库调优、部署分布式负载、上缓存等等技术,每一个都不是那么简单的,如果全部陈述出来篇幅就太大了。基于以上原因,所以本文只关注“如何发现性能问题”,同时还可以“验证性能问题是否解决了”,具有非常重要的意义。


一、http协议

1. 为什么要了解http协议?

在一次内训中,一位同事为大家普及了http的知识。当时的我觉得该知识点没有什么价值,因为我们在互联网中冲浪,从来都是用的浏览器、手机app,没有http的知识一样可以玩得不亦乐乎。大多数人认为只要有浏览器等程序帮我们实现http协议,展现给我看就可以了。

直到出现了2个情景,才让我认识到理解http协议的重要性:

  1. 就是上面提到的对应用程序进行压力测试,你不可能组织成千上万个人用浏览器来手工进行压力测试,而是要使用压力测试工具来完成。这就需要你理解http协议,并构建好压力测试环境;
  2. 就是“大数据分析”的间接要求,有很多数据分析场景需要从互联网上爬取各种各样数据,进行综合分析。而编写“网络爬虫”程序也需要理解http协议,才能成功爬取特定数据。

第一章的知识是后面两个章节的基础,是必须了解的。我尽量写得言简意赅、避免枯燥。

2. http协议是什么?

官方的解释 是:http(HyperText Transfer Protocol,超文本传输协议)是一个简单的“请求-响应”协议,它通常运行在TCP之上,用来指定客户端可能发送给服务器的消息格式、以及得到响应的消息格式。

如果上面的定义比较难以理解,那可以看下面的类比:
在抗击“新型冠状病毒”期间,公司要求下级部门每天对员工健康状况进行检查,并约定“每天15点,按照' XX部门今日无外出及发病员工 '的格式,在工作群中反馈”。大家一定能够理解,这样“约定”的意义是避免混乱、有效开展工作。该“约定”就是一种工作之间的“协议”。

简单的说, http协议,其实就是客户端浏览器与web服务器之间通讯的“约定” 。各式各样的浏览器、以及跨各种平台的web服务器只要遵守http协议,它们之间就可以实现无障碍的通讯。

3. http工作原理

BS架构

典型的“浏览器-服务器”架构(简称BS架构)如上图所示。一般来说:

  • 首先“ 发送http请求 ”,用户通过浏览器向服务器发送请求,如:输入网址后访问网页、填写表单后点击提交按钮;
  • 然后“ 获取http响应 ”,服务器根据用户的请求,运行程序访问数据库、返回结果给浏览器、呈现给用户。

这个过程中,浏览器和Web服务器之间的交互遵循http协议。

3.1 发送http请求

请求消息共包含4个部分,即:请求行、请求头部、空行、请求数据。下图是请求报文的一般格式。

http_request.png

一个典型get请求的实例如下:

GET /hello.jsp HTTP/1.1
user-agent: Mozilla/5.0 ......
host: www.example.com
accept-language: zh-CN,zh

除了GET请求,还有POST请求(登录等大多数表单提交,都用POST请求方法)、PUT请求等,它们的区别可以参考下方“ 4.1 请求方法 ”。

3.2 获取http响应

响应消息也包含4个部分,即:状态行、消息报头、空行、响应正文。下图是响应报文的一般格式。

http_response.png

一个典型get响应报文的实例如下:

HTTP/1.1 200 OK
date:Thu, 30 Jan 2020 17:50:12 GMT
content-type:text/html; charset=UTF-8

<html>
 <head>
  <meta charset="UTF-8">
  <title>hello</title>
 </head>
 <body>
  <!-- body goes here -->
 </body>
</html>

上面的示例,返回的是一个标准网页的html源码,但实际上“响应正文”中可以包含多种数据类型,如:xml、文件、图片、音视频等,可参考下方“ 4.6 content-type ”。

4. 重要的http参数

本小结的内容可以不必细看,列出以下内容的主要目的是备查,为你后续学习需要时提供必要的参考帮助。

所谓“重要的”,在本文中也指“常用的”。也就是说下面列出的是http参数中最常用的参数,掌握它们足以应付大多数的开发、测试场景。想学习更全面、细致的http协议,请参考权威的资源,比如: w3.org

4.1 请求方法

最常用的请求方法是get和post。

  1. GET :请求指定的页面信息;
  2. HEAD :类似于GET请求,只不过只返回状态行和报头,不返回响应正文;
  3. POST :向指定资源提交数据进行处理;
  4. PUT :从客户端向服务器传送的数据取代指定的文档的内容。
  5. DELETE :请求服务器删除指定的内容。
  6. CONNECT :HTTP/1.1 协议中预留,给能够将连接改为管道方式的代理服务器。
  7. OPTIONS :允许客户端查看服务器的性能。
  8. TRACE :回显服务器收到的请求,主要用于测试或诊断。
  9. PATCH :是对 PUT 方法的补充,用来对已知资源进行局部更新。
4.2 host

host用于指定请求服务器的域名/IP地址和端口号。

4.3 user-agent

user-agent用于把客户端应用及环境信息等发送给web服务器,使用chrome浏览器上网,可能就把如下的参数发送给了web服务器:

user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36

可别小看这个user-agent参数。该参数最初存在的意义,是告诉web服务器客户端浏览器、操作系统的类型、版本,好让web服务器满足客户端兼容性要求。但后来,大多数web服务器为了屏蔽“低端爬虫程序”,会根据该参数来禁止响应。

4.4 cookie

http协议本身是无状态的,也就是说不采用cookie技术,服务器端是不知道两次请求来自于同一个用户的。因此,cookie参数用于在用户客户端上存储简短的文本数据(通常经过加密),该数据可用于辨别用户身份、进行会话跟踪。

我们在访问一个需要登录的网站时,登录成功后,web服务器就在我们的浏览器上存储了cookie。当我们访问其它网页时,把得到的cookie一起发送给web服务器,就不用再登录了。

4.5 http状态码

HTTP状态码由3个十进制数字组成,第1个十进制数字定义了状态码的类型,目前有5种类型:

  • 1xx:信息,告知客户端服务器已收到请求;
  • 2xx:成功,操作被成功接收并处理;
  • 3xx:重定向,需要进一步的操作以完成请求;
  • 4xx:客户端错误,请求包含语法错误或无法完成请求;
  • 5xx:服务器错误,服务器在处理请求的过程中发生了错误。

状态码的后2个数字表示具体的代码,我们常见的状态码有:

  • 200 - 请求成功;
  • 301 - 资源(网页等)被永久转移到其它URL;
  • 404 - 请求的资源(网页等)不存在;
  • 500 - 内部服务器错误。
4.6 content-type

conent-type告诉客户端返回的响应正文中,实际包含的数据类型。常见的取值如下:

  • text/html:HTML格式;
  • text/xml:XML格式;
  • image/jpeg:jpg图片格式;
  • application/json: JSON数据格式;
  • application/pdf:pdf格式;
  • application/msword:Word文档格式;
  • application/octet-stream:二进制流数据(常用于文件下载);
  • multipart/form-data:表单中进行文件上传时使用该格式。
4.7 set-cookie

set-cookie设置在客户端保留的Cookie。

………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览