摘要:
今年的这个疫情导致了大家很多工作;相反;作为程序员的我们工作就更多了;之前公司产品一般是走线下的;疫情导致大家不能出门;很多东西那就得改成线上的;使得大家可以在家里也能做事情;我呢;从大学出来已经一年多了;开发的项目还不算很多;目前也还在自学一些东西;大家都知道IT行业那是学无止境的;很多知识点发展的也比较快;最主要还是平时的积累和总结;能有一颗坚持的心态。像我这种;一看就没有,不说到题外话了啊;上一篇呢;咋们讲述了缓存这个话题;今天咋们就接着往下讲个springboot整合的重要框架(消息队列)。

一、RabbitMQ(消息队列)的作用

首先我在前提这里稍微解释下消息队列的作用;集成这个框架后是用来解决什么问题的;接下来这个前提理论我就不做详细报告了;因为网上已经有很多做了很多详细报告;我在这里多此一举; 这里有篇关于消息队列作用的详细报告;点击链接即可进入。

二、RabbitMQ(消息队列)

(1)、先了解一下消息队列中间的几个重要概念:

  • Message
    消息,消息是不具名的,它是由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。
  • Publisher
    消息的生产者,也是一个向交换器发布消息的客户端应用程序
  • Exchange
    交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。Exchange有4中类型:direct(默认)、fanouttopicheaders,不同类型的Exchange转发的消息策略有所区别
  • Queue
    消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或者多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。
  • Binding
    绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将将交换器理解成一个由绑定构成的路由表。Exchange和Queue的绑定可以是多对多的关系。
  • Connection
    网络连接,比如一个TCP连接。
  • Channel
    信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。
  • Consumer
    消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
  • Virtual Host
    虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质上就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是 **/**开头
  • Broker
    表示消息队列服务器实体

我个人感觉读完这些概念是不可能理解的;看图更有实际效果些;接下来我就用图来将这些概念连接起来;方便你们理解:

spring boot jedis队列操作 springboot 任务队列_消息队列

从以上图解释的是RabbitMQ的运行机制;实际上就是:
Publisher ->转发到 Excahnge ->然后根据路由键规则再转发到指定的Queue <-Consumer再连接Queue上去拿消息 这句话应该算是总结了以上的知识点。还没懂得同学可以结合以上的每个的概念看;我相信是看的懂得;不懂得同学可以随时留下评论。下面就来说说Exchange交换器类型。

(2)、Excahnge类型

  • Excahnge分发消息时根据类型的不同分发策略有区别的,目前共有四种类型:direct(默认)、fanouttopicheadersheaders匹配AMQP消息的header而不是路由键,headers交换器和direct交换器完全一致,但性能差很多,目前几乎用不到了;所以接下来直接将前三种:
  • direct交换器 又称为点对点交换器;所谓的点对点就是;我的消息只能发给我的消息头的routing-key(路由键)对应上Queue上的key的Queue队列中;比如说:
  • spring boot jedis队列操作 springboot 任务队列_队列_02

  • fanout 交换器 又称为广播交换器;所谓的广播就是;不管你消息是什么类型;它都会将每个消息分发到所有绑定的Queue队列上去。它不处理路由键;所以它发送的消息是最快的。如图:
  • spring boot jedis队列操作 springboot 任务队列_消息队列_03

  • Topic 交换器 又称复杂式交换器;怎么个复杂法呢;就是topic通过模式匹配消息的路由键属性;从而去分配消息;这里的模式匹配都是通过通配符来进行划分的;所谓的通配符;我相信在学struts的时候应该是有接触的这里所要接触的就两个通配符:# 和 * 。如何所示:
  • spring boot jedis队列操作 springboot 任务队列_spring_04

  • (3)、Docker安装及测试
    在Linux上安装很简单;大家可以直接百度下;方式如下:
docker pull rabbitmq:3-management     ---安装

docker run -d --hostname localhost --name myrabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management               ---运行

注意:有些服务器启动有点缓慢‘可能启动完后任然访问不了’;别着急;这可能是服务器慢的问题;只需要静等片刻。

spring boot jedis队列操作 springboot 任务队列_消息队列_05


实际这里是消息队列的操作后台;当然也是可以直接操作消息的;你也可以在这后台进行发送消息来测试交换器(routing-key)之间的规则。我这里就不再演示了;我们这里新建个项目来演示;代码如何操作来实现这些功能吧。

新建一个项目;加入相关包:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

然后咋们查看下;springboot自动配置RabbitAutoConfiguration这个类;看看启动默认的相关配置;RabbitTemplate操作类;看到这个类估计大家也不陌生了吧;都类似RedisTemplateJDBCTemplate等等;就是调用执行操作的类。代码操作的都很简单实现:

@Autowired
    private RabbitTemplate rabbitTemplate;
    
    //最简单的编译并转发
 	@Test
    void contextLoads() {
        rabbitTemplate.convertAndSend('exchange','routing-key','Object'); //exchange-交换器、routing-key-路由键、Object-消息
    }

	//接收消息
	 @Test
    void contextLoads() {
        rabbitTemplate.receiveAndConvert('queue'); //queue-队列名字
    }

我就举出最常用的两个;其他的;由大家去测试和学习。因为消息队列也相对比较简单;没什么好敲的代码;基本就是发送和接收;就是如何使用;我也教给大家了;接下来的事情就交给你们自己了。