SpringBoot日记——MQ消息队列整合(一)

Stella981
• 阅读 725

  除了之前讲到的缓存,我们还会用到消息队列来存储一些消息,为了提升系统的异步性能等等;

  消息服务有两个概念需要知道:消息代理-message broker,目的地-destination。消息发送由代理接管并传递到指定目的地:

    —— 消息只有唯一的发送和接受者,消息从队列中取出就不在了。

  目的地有两种形式:queue-点对点的消息队列、topic-发布(publish)和订阅(subscribe)的消息通信主题;

    —— 发送一个消息主题,多个订阅者通过监听得知消息的发布并取得;0

  我要介绍的以AMQP协议的RabbitMQ为例:

RabbitMQ

一、基本概念及结构关系:

  Message-消息,它是由几个属性组成的,具备消息头和消息体;

  Publish-消息生产者,向交换器发布消息的一个应用程序;

  Exchange-交换器,接收消息,并把消息路由给服务器中的队列,属于分配的角色; Exchange有四种类型:direct、fanout、topic和headers。这四种转发消息的策略有区别:

  Queue-消息队列,保存消息的容器,一个Broker中可以有多个消息队列;

  Binding-绑定,将Exchange和Queue绑定;

  Connection-网络连接,比如Tcp连接;

  Channel-信道,建立在TCP连接中的虚拟的,双向数据流通道;AMQP命令就是通过信道将消息发送、发布、订阅和接收的;

  Consumer-消息接收者,也叫消息的消费者,用来接收和获取消息的一端应用;

  Virtual Host-虚拟主机,每个虚拟主机相对独立,相当于一个独立的mini的RabbitMQ服务器,默认是“/”;

  Broker-消息队列服务器实体;

  这些基本概念的关系如图:(不细说)

  SpringBoot日记——MQ消息队列整合(一)

  二、运行机制:

  Exchange我们上边介绍了,有4种策略类型,其中header是对消息中的header进行匹配的,使用相对少。下边主要介绍另外三种都是匹配路由键(routing key)的:

    direct:以单播的模式,如果发送的路由键和我们绑定的key一致,那么就发送到该队列中。比如我们发送aaa,那么就只有介绍aaa的Queue的key才会接收和取走这条消息,即完全匹配、1v1收发;

    fanout:广播模式发送消息到每一个消息队列中,无论路由键是什么。比如我们发送aaa,那么无论有多少个消息队列,我们都发;

    topic:将我们发出的消息,按照匹配规则模糊的来收发。比如,我们发送aaa.bb,那么我们就发送到aaa.#和*.bb中,而不会发送到其他比如ccc.#的消息队列中;

        (*匹配一个单词,#匹配0或多个单词-比如aa.bb.cc)

RabbitMQ的安装测试

  这里介绍两种安装和启用的方法:(windows和docker)

1.windows环境下的安装和使用:

  1)、在windows环境下,我们需要先依赖一个ErLang的语言开发包,下载地址:http://www.erlang.org/downloads,根据你的系统选择32或64位版本的安装

SpringBoot日记——MQ消息队列整合(一)

  然后配置一下环境变量:

  ERLANG_HOME = C:\Program Files\er21.0  (你的安装目录)
  Path 中加入 %ERLANG_HOME%\bin;

  测一下是否安装成功,如下图,OK(输入:erl)

SpringBoot日记——MQ消息队列整合(一)

  2)、下载和安装RabbitMQ,下载地址:http://www.rabbitmq.com/download.html ,选择windows版本

SpringBoot日记——MQ消息队列整合(一)

  同样安装和配置环境变量:

  RABBITMQ_SERVER = C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.1  (安装目录)
  在path中加入:%RABBITMQ_SERVER%\sbin;

  然后安装插件-用来实现界面管理的,在命令行中输入: rabbitmq-plugins.bat enable rabbitmq_management (图片是网上扒的,不要在意细节~)

SpringBoot日记——MQ消息队列整合(一)

启动MQ服务,为了防止异常情况,我们这里要求使用管理员模式的命令行窗口输入:

net stop RabbitMQ && net start RabbitMQ

如果想停止服务:rabbitmq-service stop

  2.docker下的安装和使用:

  1)、首先链接服务器,然后检查镜像,如果没有MQ的,我们去官方hub网站查看一下,我们选择标签中带有management的进行下载,这个是带有web管理界面的;

  在服务器中键入该命令进行下载:

docker pull registry.docker-cn.com/library/rabbitmq:3-management

SpringBoot日记——MQ消息队列整合(一)

  这样,镜像就安装好了。那么我们来启动这个mq服务:(mq默认端口就是这两个)

docker run -d -p 5672:5672 -p 15672:15672 --name myrabbitmq df0ee1f2343b

SpringBoot日记——MQ消息队列整合(一)

使用RabbitMQ的web管理界面

  使用上边的方法,我们成功的安装和启动了MQ服务,那么我们来使用web管理界面来检查下,是否可以使用吧。

  在浏览器的地址栏输入(默认账户密码是guest/guest,有需要自己再添加设置)

  ip:15672  如果是windows本地搭建:localhost:15672  如果是docker搭建的:xx.xx.xx.xx:15672  ip是服务器地址,可以通过ip addr查看你服务器的ip地址

SpringBoot日记——MQ消息队列整合(一)

  登录以后,可以看到我们之前讲的那些字段,然后添加我们需要的东西就可以了,下边不具体介绍,几个图自己领会一下吧~

  步骤:添加Exchange、添加Queue、进入Exchange绑定Queue、在Exchange内发送消息、到Queue中获取该消息

SpringBoot日记——MQ消息队列整合(一)

SpringBoot日记——MQ消息队列整合(一)

SpringBoot日记——MQ消息队列整合(一)

SpringBoot日记——MQ消息队列整合(一)

SpringBoot日记——MQ消息队列整合(一)

SpringBoot日记——MQ消息队列整合(一)

   这里单独说一下关于topic键的输入,按照之前说过的规则来写:

SpringBoot日记——MQ消息队列整合(一)

    将RabbitMQ整合到SpringBoot中

  web客户端我们应该有一些了解了,那如何在代码中应用呢?先来看如何做关联,很简单,在pom.xml中加入这一段:

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

  1)、关于使用,这里其实跟redis缓存一样,我们使用注解:

@EnableRabbit    //使用rabbitMQ的注解@RabbitListener  //监听rabbitMQ消息

  同样,为了得到的数据是json格式的,我们直接自己自定义一个类:

import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableRabbit  //启动rabbit注解
public class MyAMQPConfig {
  // 将消息以json格式传递
    @Bean
    public MessageConverter messageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

  来测试一下,我们添加的MQ是否可用吧:……有点长,换下一篇文章=。=b

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
3年前
SpringBoot日记——MQ消息队列整合(一)
  除了之前讲到的缓存,我们还会用到消息队列来存储一些消息,为了提升系统的异步性能等等;  消息服务有两个概念需要知道:消息代理messagebroker,目的地destination。消息发送由代理接管并传递到指定目的地:    ——消息只有唯一的发送和接受者,消息从队列中取出就不在了。  目的地有两种形式:queue\点对点的消息队
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这