0%

简介

Apache Bench简称ab工具, 是一款简单方便的测试工具.
安装方式

script
1
2
yum -y install httpd-tools
apt -y install apache2-utils

使用

使用方式: ab [options] [http[s]://]hostname[:port]/path
常用选项

选项 说明
-n 总请求次数, 最小默认为1
-c 并发次数, 最小默认为1, 且不能大于总请求次数. 例如, 10个请求, 10个并发,实际就是1人请求1
-p post 参数文档路径(-p 和 -T 参数要配合使用)
-T header头内容类型

分析结果

我们简单的对百度做个压测, 20个用户同时发起请求, 总共请求1000次.

script
1
ab -n 1000 -c 20 "https://www.baidu.com/s?wd=test"

结果马上就出来了, 我们主要看以下几个参数

script
1
2
3
4
5
6
7
8
# 完成所有请求花费的时间
Time taken for tests: 5.058 seconds
# 吞吐率,指某个并发用户数下单位时间内处理的请求数
Requests per second: 197.72 [#/sec] (mean)
# 用户平均请求等待时间 = 完成所有请求花费的时间 / (总请求数 / 并发用户数)
Time per request: 101.155 [ms] (mean)
# 服务器平均请求处理时间 = 完成所有请求花费的时间 / 总请求数
Time per request: 5.058 [ms] (mean, across all concurrent requests)

常用例子

script
1
2
3
4
5
# 1. get请求, 20个用户同时发起请求, 总共请求1000次
ab -n 1000 -c 20 -H "header1:value1" -H "header1:value1" "https://www.baidu.com/s?wd=test"
# 2. post请求, 将 post.txt 的内容作为请求参数发送出去
ab -n 1000 -c 10 -p post.txt -T "application/x-www-form-urlencoded" "https://www.baidu.com/s?wd=test"
ab -n 1000 -c 10 -p post.txt -T "application/json" "https://www.baidu.com/s?wd=test"

前言

Swarm是一个Docker官方提供的容器编排工具. 是Docker推出的一个kubernetes的竞品(当然现在已经是kubernetes的天下了
Swarm用来解决多机下Docker容器的部署问题, 这是传统DockerDocker compose解决不了的.
并且Swarm已经集成到Docker原生工具里了, 可以直接使用.

阅读全文 »

前言

Docker多阶段构建是17.05以后引入的新特性,旨在解决编译和构建复杂的问题。
减小镜像大小。因此要使用多阶段构建特性必须使用高于或等于17.05的Docker。

Docker多阶段构建出现之前, 要将java程序打包运行, 需要编写两个Dockerfile文件, 一个用来打包, 一个用来部署.

阅读全文 »

前言

消息中间件MQ主要的工作流程如下

  1. 生产端Producer发送消息给消息中间件MQ
  2. 消息中间件MQ接收到消息, 告诉生产者Producer消息已经收到
  3. 消息中间件MQ将消息路由Routing后, 投递给消费者Consumer
  4. 消费者告诉MQ消息是否消费成功
阅读全文 »

前言

我们使用Docker镜像, 一般都是从远程Registry仓库pull下来的.

1
docker pull hello-world

但是实际开发过程中, 经常会需要把自己的应用程序打包成一个images镜像. 这个镜像是需要自己打包的.
打包的方式一般有两种, Docker FileDocker Compose.

阅读全文 »

前言

RabbitMQ是一个Erlang实现的开源消息中间件, 实现了Advanced Message Queuing Protocol(AMQP)协议.
AMQP协议是一个抽象协议, 定义了一系列的接口, 而RabbitMQ等消息中间件实现了这些接口.

本文使用原生RabbitMQAPI来进行调用, 不使用Spring AMQP.

阅读全文 »

前言

如果我想要在多线程下, 同一个变量在不同线程下使用不同的值, 如何去做?
我可以声明一个Map, 线程作为Key(实际上并不是这样设计的), Map作为value, 存储当前线程下的键值对.
下面是一个简单的例子(生产不要这样用)

阅读全文 »