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

  消息服务有两个概念需要知道:消息代理-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-消息队列服务器实体;

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

  

  二、运行机制:

  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位版本的安装

  然后配置一下环境变量:

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

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

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

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

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

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

  启动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

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

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

使用RabbitMQ的web管理界面

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

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

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

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

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

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

   将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

  

SpringBoot日记——MQ消息队列整合(一)的更多相关文章

  1. SpringBoot日记——MQ消息队列整合(二)

    基于第一篇文章搭建好环境以后,我们这篇文章继续介绍如何在springboot中使用RabbitMQ. 1).单播:添加好pom文件和自定义配置后,来看: @Autowired RabbitTempla ...

  2. 使用Rabbit MQ消息队列

    使用Rabbit MQ消息队列 综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息 ...

  3. 手把手教你用redis实现一个简单的mq消息队列(java)

    众所周知,消息队列是应用系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构.目前使用较多的消息队列有 ActiveMQ,RabbitMQ,Zero ...

  4. 阿里云ACE共创空间——MQ消息队列产品测试

    一.产品背景消息队列是阿里巴巴集团自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息订阅和发布.消息轨迹查询.定时(延时)消息.资源统计.监控报警等一系列消息云服务,是企业级互联网架构 ...

  5. IM开发基础知识补课(五):通俗易懂,正确理解并用好MQ消息队列

    1.引言 消息是互联网信息的一种表现形式,是人利用计算机进行信息传递的有效载体,比如即时通讯网坛友最熟悉的即时通讯消息就是其具体的表现形式之一. 消息从发送者到接收者的典型传递方式有两种: 1)一种我 ...

  6. Java语言快速实现简单MQ消息队列服务

    目录 MQ基础回顾 主要角色 自定义协议 流程顺序 项目构建流程 具体使用流程 代码演示 消息处理中心 Broker 消息处理中心服务 BrokerServer 客户端 MqClient 测试MQ 小 ...

  7. 多维度对比5款主流分布式MQ消息队列,妈妈再也不担心我的技术选型了

    1.引言 对于即时通讯网来说,所有的技术文章和资料都在围绕即时通讯这个技术方向进行整理和分享,这一次也不例外.对于即时通讯系统(包括IM.消息推送系统等)来说,MQ消息中件间是非常常见的基础软件,但市 ...

  8. 初识MQ消息队列

    MQ 消息队列 消息队列(Message Queue)简称MQ,是阿里巴巴集团中间件技术部自主研发的专业消息中间件. 产品基于高可用分布式集群技术,提供消息发布订阅.消息轨迹查询.定时(延时)消息.资 ...

  9. Spring Boot:使用Rabbit MQ消息队列

    综合概述 消息队列 消息队列就是一个消息的链表,可以把消息看作一个记录,具有特定的格式以及特定的优先级.对消息队列有写权限的进程可以向消息队列中按照一定的规则添加新消息,对消息队列有读权限的进程则可以 ...

随机推荐

  1. Asp.Net MVC 模型(使用Entity Framework创建模型类)

    这篇教程的目的是解释在创建ASP.NET MVC应用程序时,如何使用Microsoft Entity Framework来创建数据访问类.这篇教程假设你事先对Microsoft Entity Fram ...

  2. priority_queue的优先级变化(结构体的写法)

    priority_queue的优先级变化(结构体的写法) 在头文件中加上#include <queue> 即可使用stl中的库函数priority_queue,优先队列默认的是从大到小的优 ...

  3. sqlserver 镜像 断开连接 正在恢复+主机服务器关机用备用镜像

    如果主机坏了断开连接就用备机的镜像数据库 --主备互换,备机sql命令 USE master;   ALTER DATABASE test SET PARTNER FORCE_SERVICE_ALLO ...

  4. CGJ02、BD09、西安80、北京54、CGCS2000常用坐标系详解

    一.万能地图下载器中的常用坐标系 水经注万能地图下载器中的常用的坐标系主要包括WGS84经纬度投影.WGS84 Web 墨卡托投影.WGS84 UTM 投影.北京54高斯投影.西安80高斯投影.CGC ...

  5. Netty入门(四)ByteBuf 字节级别的操作

     Netty 中使用 ByteBuf 代替 Java NIO 提供的 ByteBuffer 作为字节的容器. 一.索引 ByteBuf 提供两个指针变量支持读和写操作,读操作使用 readerInde ...

  6. Winfrom 使用WCF 实现双工通讯

    实现双工通讯主要分三步. 通信接口的定义: 被调用接口的实现 双工通道的建立 请先引用DLL(CSDN的代码编辑器真尼玛蛋疼) 整个解决方案的结构 1.通信接口的定义: 服务端调用客户端接口IServ ...

  7. linux下apache中httpd.conf的ServerAdmin 是设置的什么?

    <VirtualHost 127.0.0.1:80> ServerAdmin ******@****.com DocumentRoot /home/aaa/sss ServerName s ...

  8. TDD&BDD

    BDD行为驱动开发的一种敏捷开发技术 TDD测试驱动开发

  9. Docker实战(二)之操作Docker容器

    容器是Docker的另外一个核心概念.简单来说,容器是镜像的一个运行实例.所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层.如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应 ...

  10. 初学者在Mysql8.0连接时的几个常见基本问题

    最近在做一些java web整合时使用的最新版Mysql8.0.3,发现Mysql连接中的几个问题,总结如下: package db; import java.sql.*; public class ...