一、为什么要抓包?
- 当你app无法正常访问?当你坚信你的程序木有问题?当你开始怀疑人生?当你开始相信神学? 这时候就需要掌握如何定位一个bug。
二、什么是AMQP
- AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议,而RabbitMQ就是基于这种协议实现的一套框架
三、如何利用抓包工具抓包
这里我们使用用强大的抓包工具wireshark ,如果同学们需要抓http或者https协议的包的话推荐使用 fiddler ,不啰嗦,下面开始进入主题。
- 运行消息生产者
- 打开抓包软件开始抓包
- 运行消费者 消费者多开配置
spring:
application:
name: springboot-rabbitmq-consumer
rabbitmq:
host: xx.xx.xx.xx
port: 5672
username: admin
password: 123456
virtual-host: /
publisher-confirm-type: correlated #必须配置这个才会确认回调
publisher-returns: true
listener:
type: simple
simple:
acknowledge-mode: manual #手动确认
prefetch: 1 #限制每次发送一条数据。
concurrency: 16 #同一个队列启动几个消费者
max-concurrency: 16 #启动消费者最大数量
#重试策略相关配置
retry:
enabled: true #是否支持重试
max-attempts: 5
stateless: false
#时间策略乘数因子
multiplier: 1.0
initial-interval: 1000ms
max-interval: 10000ms
default-requeue-rejected: true
复制代码
-
下面是抓到的包
-
1-3帧 : TCP的建立连接的三次握手建立AMQP通信,这个跟建立http通信相似
-
4帧:RabbitMQ的客户端告诉RabbitMQ自己使用的协议及版本
-
5帧:TCP应答信令:表示服务端告诉发送端已经收到这之前的包
-
6 - 14帧:RabbitMQ服务端和客户端建立连接,并约定参数
-
6帧: Connection.Start:RabbitMQ告诉客户端通信的协议和版本、SASL认证机制(详细见)、语言环境以及RabbitMQ的版本信息和支持能力
-
7帧: Connection.Start-Ok :客户端带上连接使用的帐号和密码、认证机制、语言环境、客户的信息以及能力
-
8帧: Connection.Tune:RabbitMQ服务端和客户端开始进行参数协商
-
9帧: Connection.Tune-Ok: 客户端要么接受服务端过来的参数,要么将这些值变低,在发送给服务端
-
10帧: Connection.Open vhost=/ :RabbbitMQ客户端打开一个连接,并请求设置vhost值
-
11帧 TCP应答
-
12帧 Connection.Open-Ok:RabbitMQ服务端对vhost进行验证,如果成功,则返回如下此信息
-
13 - 14帧:创建通道
-
13帧: Channel.Open:客户端打开一个新通道
-
14帧:Channel.Open-Ok:RabbitMQ服务端回复新通道准备完毕
-
15-16帧: rabbitmq消息确认机制-confirm模式...百度另行补脑
-
17 - 18帧: 创建Exchange
-
17帧: Exchange.Declare 客户端向RabbitMQ声明一个Exchange
-
18帧: Exchange.Declare-Ok:RabbitMQ收到请求后,如果发现同名的exchange存在且属性相同,则返回如下包,否则抛出异常
-
19-22帧: 消费端做开始接收消息之前的确认准备,这里由于queue.helle队列没有数据,所以之后没有消息数据传输
-
23-28帧:创建一条新的通道跟13-22帧一样
-
29-31帧:跟19-22帧一样
-
32-····帧:消息数据的传输······
看下我们可以数据帧里面的数据
消费者在消费的完数据的时候会发一个ack确认包给到RabbitMQ,RabbitMQ收到确认包后会删掉发给上一次消费者的消息,如果RabbitMQ一直收不到这个ack确认包,会重新把这条消息放到队列里面,让消费端消费。