SpringBoot28 RabbitMQ知识点、Docker下载RabbitMQ、SpringBoot整合RabbtiMQ
1 RabbitMQ知识点
1.1 整体架构图
消息生产者将消息投递到exchange中,exchange会以某种路由机制将生产者投递的消息路由到queue中,消息消费者再从queue中获取消息进行消费。
1.2 核心概念
1.2.1 server
又称Broker,接收客户端的连接,实现AMQP实体服务
1.2.2 Connection
连接,应用服务与Broker的网络连接(PS:和JDBC中的connection作用相似)
1.2.3 Channel
网络信道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道。客户端可建立多个Channel,每个Channel代表一个会话。【PS:相当于JDBC的Statement】
1.2.4 Message
消息,服务器和应用程序之间传递的数据,由Properties和Body组成;Properties可以对消息进行修饰,比如消息的优先级、迟延等高级特性;Body则就是消息的内容。
1.2.5 Virtual Host
虚拟地址,用于进行逻辑隔离的最上层的消息路由。一个Virtual Host 里面可以有若干个Exchange 和 Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue;默认是 / , Virtual Host 通常用来进行项目划分,即:一个项目相关的exchange 和 queue 都在一个Virtual Host中。
1.2.6 Exchange
交换机,用于接收消息;根据路由键转发消息到绑定的队列
1.2.7 Binding
Exchange 和 Queue 之间的虚拟连接,Binding 可以包含routing key。
1.2.8 Routing Key
一个路由规则,虚拟机可以用它来确定如何路由一个特定消息;就是exchange和queue的路由规则
1.2.9 Queue
也称Message Queue,消息队列,保存消息并将他们转发给消费者
1.3 RabbitMQ消息的流转
消息发布者会发送一个消息、exchange、routeing Key 到rabbtiMQ,他们先经过 Virtual Host , 再经过 Exchange, 再到Queue;消息消费者再到Queue中获取消息
2 Docker下载RabbiMQ
2.1 Docker环境搭建
docker版本为:
2.2 安装RabbitMQ
2.2.1 拉取RabbitMQ镜像
docker pull rabbitmq:3.7.7-management
技巧01:rabbitMQ的版本可以去官网进行查看
2.2.2 查看拉取的镜像列表
2.2.3 创建并启动rabbitMQ容器
docker run -d --hostname my-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.7.7-management
技巧01:-p 是将虚拟机的端口和docker中的端口做一个映射,这样访问虚拟机的端口就相当于访问了docker中的端口
技巧02:5672是连接rabbtiMQ的端口,15672是连接rabbitMQ管理页面的端口
2.2.4 查看启动的rabbitMQ容器
2.3 连接rabbitMQ管理页面
技巧01:直接在浏览器访问 虚拟机IP + rabbtiMQ管理页面端口 即可,例如:
http://192.168.233.135:15672/
技巧02:第一次访问的时候需要输入用户名和用户密码,默认的用户名和用户密码是guest
技巧03:访问成功后的界面如下
3 SpringBoot整合RabbitMQ之消费发布者
3.1 创建一个SpringBoot项目
引入相关依赖:web、amqp,其他的都是辅助依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.xunyji</groupId>
<artifactId>rabbitmq01</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>rabbitmq01</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
pom.xml
3.2 配置文件
# rabbitMQ基本配置
spring.rabbitmq.addresses=192.168.233.135:5672
spring.rabbitmq.username=guest
spring.activemq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000 server.servlet.path=/
server.port=8001 spring.http.encoding.charset=UTF-8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.default-property-inclusion=non_null
application.properties
3.3 发布消息
依赖注入RabbitTemplate的实例并调用实例方法convertAndSend发布消息
技巧01:在进行发布之前需要在rabbitMQ中设置响应的exchange和queue
3.3.1 在RabbitMQ中添加exchange
技巧01:添加完成后exchange列表中就会出现新增的exchange信息
3.3.2 在RabbitMQ中添加Queue
技巧01:添加完queue后就会在queue列表中看到新添加的queue
3.3.3 设置exchange和queue的路由规则
技巧01:exchange和queue都可以进行设置,只有一方设置了就可以啦
3.4 测试
向rabbitMQ发布一则消息
package com.xunyji.rabbitmq01.producer; import com.xunyji.rabbitmq01.Rabbitmq01ApplicationTests;
import com.xunyji.rabbitmq01.entity.Order;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; import java.util.UUID; import static org.junit.Assert.*; @Component
@Slf4j
public class OrderSenderTest extends Rabbitmq01ApplicationTests { @Autowired
private OrderSender orderSender; @Test
public void test01() throws Exception { Order order = Order.builder()
.id("20180830")
.name("测试订单01")
.messageId(System.currentTimeMillis() + "$" + UUID.randomUUID().toString())
.build(); orderSender.sendOrder(order); } }
技巧01:发送成功后,queue中就会有有一条为被消费的消息;当消息消费者消费了过后才会从队列中剔除
4 SpringBoot整合RabbitMQ之消费订阅者
4.1 创建一个SpringBoot项目
引入必要依赖:web、ampq,其余都是辅助依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.xunyji</groupId>
<artifactId>rabbitmq02-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging> <name>rabbitmq02-consumer</name>
<description>Demo project for Spring Boot</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-amqp -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency> <!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<scope>provided</scope>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
pom.xml
4.2 配置文件
#springboot整合mq的基本配置
spring.rabbitmq.addresses=192.168.233.135:5672
spring.rabbitmq.username=guest
spring.activemq.password=guest
spring.rabbitmq.virtual-host=/
spring.rabbitmq.connection-timeout=15000 #springboot整合mq的消费配置
spring.rabbitmq.listener.simple.concurrency=5
spring.rabbitmq.listener.simple.max-concurrency=10
spring.rabbitmq.listener.simple.acknowledge-mode=manual
spring.rabbitmq.listener.simple.prefetch=1 server.servlet.path=/
server.port=8002 spring.http.encoding.charset=UTF-8
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
spring.jackson.time-zone=GMT+8
spring.jackson.default-property-inclusion=non_null
4.3 消费方法编写
在消费方法上利用注解开启监听和指定监听那个队列即可
技巧01:@RabbitHandler 和 @RabbitListener 注解可以自动到rabbitMQ中生成exchange和queue的绑定关系
4.4 获取消息
由于rabbitMQ中已经有一条消息待处理了,所以直接启动项目就可以完成消息的消费,消费后rabbitMQ中待消费的消息数量就为0啦
5 本博文源代码
SpringBoot28 RabbitMQ知识点、Docker下载RabbitMQ、SpringBoot整合RabbtiMQ的更多相关文章
- 【RabbitMQ】六种模式与SpringBoot整合
添加rabbitmq的依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifac ...
- springboot学习笔记-6 springboot整合RabbitMQ
一 RabbitMQ的介绍 RabbitMQ是消息中间件的一种,消息中间件即分布式系统中完成消息的发送和接收的基础软件.这些软件有很多,包括ActiveMQ(apache公司的),RocketMQ(阿 ...
- (1)RabbitMQ在Docker上安装
1.简介 在来学习RabbitMQ时候,我觉得很有必要先把它的环境先搭建起来,这样后面的示例才能进行.因为之前自己手动在Linux服务器上搭建过Elasticsearch,当时踩过太多坑了,浪费太多时 ...
- springboot整合vue实现上传下载文件
https://blog.csdn.net/yhhyhhyhhyhh/article/details/89888953 文章目录 springboot整合vue实现上传下载文件 1上传下载文件api文 ...
- Ubuntu 16.04下使用docker部署rabbitmq
(以下docker相关的命令,需要在root用户环境下或通过sudo提升权限来进行操作.) 1.拉取rabbimq镜像到本地 docker pull rabbitmq 2. Docker运行rabbi ...
- Docker安装rabbitMQ主从
环境准备 Centos 7.5虚拟机三台: 192.168.102.128 192.168.102.130 192.168.102.131 以上虚拟机统一安装docker环境 三台机器分别配置如下所示 ...
- 用Docker搭建RabbitMq的普通集群和镜像集群
普通集群:多个节点组成的普通集群,消息随机发送到其中一个节点的队列上,其他节点仅保留元数据,各个节点仅有相同的元数据,即队列结构.消费者消费消息时,会从各个节点拉取消息,如果保存消息的节点故障,则无法 ...
- springboot整合elasticsearch(基于es7.2和官方high level client)
前言 最近写的一个个人项目(传送门:全终端云书签)中需要用到全文检索功能,目前 mysql,es 都可以做全文检索,mysql 胜在配置方便很快就能搞定上线(参考这里),不考虑上手难度,es 在全文检 ...
- Docker下载镜像出现failed to register layer: symlink....问题
在用Docker下载RabbitMQ的时候出现如下问题 个人解决方案:重启Docker. 若重启还是无法解决问题,可以先关闭Docker systemctl stop docker 然后把已下载的相关 ...
随机推荐
- 【转】VC中MessageBox与AfxMessageBox用法与区别
原文网址:http://blog.csdn.net/holybin/article/details/28403109 一.MessageBox()用法 1.函数原型 Messagebox函数在Win3 ...
- bzoj1087互不侵犯King(状压)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1087 简单的状压dp.但是wa了好几发.注意long long. 注意0和0的连边.而且不能 ...
- java少包汇总
1.在下载使用javax.mail的jar包时候,注意: 有的jar没有包含sun的实现,只包含了api,这类jar名称通常为javax.mail-api-x.x.x.jar,在使用smtp协议发邮件 ...
- hive加载json数据解决方案
hive官方并不支持json格式的数据加载,默认支持csv格式文件加载,如何在不依赖外部jar包的情况下实现json数据格式解析,本编博客着重介绍此问题解决方案 首先创建元数据表: create EX ...
- MEF学习总结(3)---Attribute Model Programing
上一片介绍了Primitive层,Attribute Model可以认为是对Primitive的上层实现.主要包括如下内容: 1. 一系列的Attribute来定义Import和Export 常用的有 ...
- AT 指令和常见错误码
一. 一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900).当模块有多频带时,回 ...
- 在debian上安装最新版erlang
参考这里https://www.erlang-solutions.com/downloads/download-erlang-otp 源码安装的无视 sudo gvim /etc/apt/source ...
- nginx和php-fpm通信的两种方式 unix socket和TCP
nginx和fastcgi的通信方式有两种,一种是TCP 一种是unix socket TCP使用的是 127.0.0.1:9000端口,将fastcgi_pass参数修改为127.0.0.1:900 ...
- python 网络编程--socket模块/struct模块
socket模块: 客户端:CS架构, client -> server 浏览器:BS架构, browser -> server 网络通信本质:传输字节 doc命令查看ip地址:ipc ...
- var与Javascript变量隐式声明
在JavaScript中,var用来声明变量,但是这个语法并不严格要求,很多时修改,我们可以直接使用一个变量而不用var声明它.var x = "XX"; y ="xxx ...