RabbitMQ - SpringBoot集成版
文章目录 |
---|
《RabbitMQ实战指南》—— 朱忠华 著 |
一、首次安装
普通部署
下载地址 - Release RabbitMQ 3.6.14 · rabbitmq/rabbitmq-server
# 安装erlang
yum -y update
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
yum -y install epel-release
yum -y install socat
yum -y install erlang
# 检查erl版本
erl -version
# 安装RabbitMQ - 先去官网下载RPM包 rabbitmq-server-3.6.14-1.el6.noarch.rpm
yum install -y net-tools
# rpm -Uvh rabbitmq-server-3.10.7-1.el8.noarch.rpm
rpm -Uvh rabbitmq-server-3.6.14-1.el6.noarch.rpm
# 启动MQ并关闭防火墙
systemctl start rabbitmq-server
systemctl status rabbitmq-server
iptables -F
# Rabbit的默认通讯端口是5672
# 安装Web控制台
rabbitmq-plugins enable rabbitmq_management
# 设置初始用户并设置为管理员
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin “.*” “.*” “.*”
# 访问Web控制台
http://192.168.247.184:15672
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vnyg86g3-1663406974053)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/rabbitmq-初始界面=1.png)]
Docker部署
两步完事
docker pull rabbitmq:management
docker run -dit --name myrabbitmq-demo01 -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin -p 15672:15672 -p 5672:5672 rabbitmq:management
Windows部署
下载地址 |
---|
https://www.erlang.org/patches/otp-25.0.4 |
Releases · rabbitmq/rabbitmq-server (github.com) |
RabbitMQ Erlang Version Requirements — RabbitMQ |
注意版本的对应关系,以及安装路径下不要有中文和空格。
.\sbin\rabbitmq-plugins enable rabbitmq_management
上面的命令执行成功之后,我们就可以通过http://localhost:15672来访问web端的管理界面
**输入用户名:guest,密码:guest(默认)**就可以进入管理界面
二、入门
使用之前,先了解消息队列能解决什么问题
[1]异步处理
[2]解耦服务
[3]流量削峰
上面的三点是我们使用消息中间件最主要的目的
2.1 概念点1:QPS/PV/UV/PR
什么是QPS,PV , UV , PR
- QPS:每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准
- PV:页面浏览量
- UV:访问某个站点或点击某条新闻的不同IP地址的人数
- PR:即PageRank,网页的级别技术,用来标识网页的等级/重要性。级别从1到10级,10级为满分。PR值越高说明该网页越受欢迎(越重要)
2.2 概念点2:AMQP/JMS
MQ是消息通信的模型;实现MQ的大致有两种主流方式:AMQP、JMS
- AMQP,Advanced Message Queuing Protocol
- 应用层队列协议
- 消息中间件与客户端之间的消息传递,不受产品、语言的限制
- 代表作:RabbitMQ
- JMS,Java Message Service
- Java的消息服务应用程序接口
- 受语言限制,只能是JAVA与JAVA之间的通信
- 代表作:ActiveMQ
- AMQP 与 JMS 区别
- JMS是定义了统一的接口,来对消息操作进行统一;AMQP是通过规定协议来统一数据交互的格式
- JMS限定了必须使用Java语言;AMQP只是协议,不规定实现方式,因此是跨语言的。
- JMS规定了两种消息模式;而AMQP的消息模式更加丰富
2.3 初始实例工程
部署生产者及消费者
依赖引入
<parent>
<artifactId>spring-boot-starter-parent</artifactId>
<groupId>org.springframework.boot</groupId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
<!-- 集成了boot后 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>2.3.4.RELEASE</version>
</dependency>
</dependencies>
</dependencyManagement>
由于是简单案例,生产者和消费者的配置文件都是相同的
server:
port: 19091
spring:
rabbitmq:
host: 192.168.247.184
port: 5672
username: admin
password: admin
virtual-host: /
接下来是生产者,三个动作
- 启动类
- MQ配置类,主要是做交换机和队列的创建、参数设置、交换机与队列的绑定
- 一个控制层的方法,使用RabbitTemplate,指定交换机的名称、路由键及消息,然后往MQ进行推送
启动类
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
RabbitMQConfig.java
import org.springframework.amqp.core.*;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
/**
* 配置交换机/队列的名字
*/
public static final String EXCHANGE_NAME = "Demo01_direct_exchange";
public static final String QUEUE_NAME = "Demo01_queue";
/**
* Exchange 交换机
* 路由模式
*
* @return
*/
@Bean("bootExchange")
public Exchange bootExchange() {
return ExchangeBuilder.directExchange(EXCHANGE_NAME).durable(true).build();
}
/**
* Queue 队列
* 持久化类型的队列
* 我查看源码,它就两种类型,持久化/非持久化
*
* @return
*/
@Bean("bootQueue")
public Queue bootQueue() {
return QueueBuilder.durable(QUEUE_NAME).build();
}
/**
* 交换机与队列的绑定关系
* noargs():表示不指定参数
*
* @param queue
* @param exchange
* @return
*/
@Bean
public Binding bindQueueExchange(@Qualifier("bootQueue") Queue queue,
@Qualifier("bootExchange") Exchange exchange) {
return BindingBuilder