SpringBoot(八) Spring和消息队列RabbitMQ

概述

1.大多数应用中,可以通过消息服务中间件来提升系统异步能力和拓展解耦能力。

2.消息服务中的两个重要概念:消息代理(Message broker)目的地(destination)

当消息发送者发送消息后,将由消息代理接管,消息代理保证消息传递到指定目的地。

3.消息队列主要有两种形式的目的地:

    1. 队列:点对点方式通信(point-to-point)
    2. 主题:发布/订阅消息服务

点对点式:消息发送者发送消息后,消息代理将其放入一个队列中,消息接受者从队列中读取数据,接受者接收数据后,将消息移除队列。

发布订阅:消息发布者将消息发布到主题中,多个接受者可以订阅主题,当消息到达时,所有的订阅者都会接收到消息。

4.JMS(Java Message Service) Java消息服务:基于JVM消息代理的规范。

5.AMQP(Advanced Message Queuing Protocol):它是一个面向消息中间件的开放式标准应用层协议。兼容JMS,RabbitMQ是AMQP的一个实现。

  JMS AMQP
定义 Java API 网络线级协议
跨平台
跨语言
Model (1)、Peer-2-Peer
(2)、Pub/Sub
(1)、direct exchange
(2)、fanout exchange
(3)、topic change
(4)、headers exchange
(5)、system exchange
后四种都是pub/sub ,差别路由机制做了更详细的划分
支持消息类型 TextMessage
MapMessage
ByteMessage
StreamMessage
ObjectMessage
Message
byte[]通常需要序列化

RabbitMQ

Message:消息头和消息体组成,消息体是不透明的,而消息头上则是由一系列的可选属性组成,属性:路由键【routing-key】,优先级【priority】,指出消息可能需要持久性存储【delivery-mode】

Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序

Exchange:交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列

Exchange的4中类型:direct【默认】点对点,fanout,topic和headers, 发布订阅,不同类型的Exchange转发消息的策略有所区别

Queue:消息队列,用来保存消息直到发送给消费者,它是消息的容器,也是消息的终点,一个消息可投入一个或多个队列,消息一直在队列里面,等待消费者连接到这个队列将数据取走。

Binding:绑定,队列和交换机之间的关联,多对多关系

Connection:网络连接,例如TCP连接

Channel:信道,多路复用连接中的一条独立的双向数据流通道,信道是建立在真是的TCP链接之内的虚拟连接AMQP命令都是通过信道发送出去的。不管是发布消息,订阅队列还是接受消息,都是信道,减少TCP的开销,复用一条TCP连接。

Consumer:消息的消费者,表示一个从消息队列中取得消息的客户端的 应用程序

VirtualHost:小型的rabbitMQ,相互隔离

Broker:表示消息队列 服务实体

Exchange的三种方式

direct:根据路由键直接匹配,一对一

fanout:不经过路由键,直接发送到每一个队列

topic:类似模糊匹配的根据路由键,来分配绑定的队列。#匹配一个或者多个单词,*匹配一个单词

RabbitMQ安装与使用

在RabbitMQ官网的下载页面https://www.rabbitmq.com/download.html中,我们可以获取到针对各种不同操作系统的安装包和说明文档。这里,我们将对几个常用的平台一一说明。

下面我们采用的Erlang和RabbitMQ Server版本说明:

  • Erlang/OTP 19.1
  • RabbitMQ Server 3.6.5

Windows安装

  1. 安装Erland,通过官方下载页面http://www.erlang.org/downloads获取exe安装包,直接打开并完成安装。
  2. 安装RabbitMQ,通过官方下载页面https://www.rabbitmq.com/download.html获取exe安装包。
  3. 下载完成后,直接运行安装程序。
  4. RabbitMQ Server安装完成之后,会自动的注册为服务,并以默认配置启动起来。

Docker安装

1、打开虚拟机,在docker中安装RabbitMQ

#1.安装rabbitmq,使用镜像加速
docker pull registry.docker-cn.com/library/rabbitmq:3-management
[[email protected] ~]# docker images
REPOSITORY                                     TAG                 IMAGE ID            CREATED             SIZE
registry.docker-cn.com/library/rabbitmq        3-management        c51d1c73d028        11 days ago         149 MB
#2.运行rabbitmq
##### 端口:5672 客户端和rabbitmq通信 15672:管理界面的web页面

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

#3.查看运行
docker ps

2、打开网页客户端并登陆   网址:http://localhost:15672/,账号【guest】,密码【guest】,登陆。

3、添加 【direct】【faout】【topic】的绑定关系等

4、发布信息测试 。

SpringBoot整合RabbitMQ

(1)Java代码的方式使用RabbitMQ

1.在pom.xml文件中添加依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.3.7.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

2.在application.properties中配置关于RabbitMQ的连接和用户信息,用户可以回到上面的安装内容,在管理页面中创建用户。

spring:
  rabbitmq:
    host: 192.168.1.125
    port: 5672
    username: guest
    password: guest

3.创建消息生产者。通过注入RabbitTemplate接口的实例来实现消息的发送,RabbitTemplate接口定义了一套针对AMQP协议的基础操作。在Spring Boot中会根据配置来注入其具体实现。

 @Autowired
    RabbitTemplate rabbitTemplate;

    @Test
    public void contextLoads() {
        //Message需要自己构建一个;定义消息体内容和消息头
        // rabbitTemplate.send(exchange, routingKey, message);
        //Object 默认当成消息体,只需要传入要发送的对象,自动化序列发送给rabbitmq;
        Map<String,Object> map = new HashMap<>();
        map.put("msg", "这是第一个信息");
        map.put("data", Arrays.asList("helloWorld",123,true));
        //对象被默认序列以后发送出去 exchange 和 routingKey都是在浏览器端定义好的。
        rabbitTemplate.convertAndSend("exchange.direct","test.news",map);
    }

4.JSON序列化

@Configuration
public class MyAMQPConfig  {

    @Bean
    public MessageConverter messageConverter(){
        return new Jackson2JsonMessageConverter();
    }
}

5.接收消息(取出队列中的消息)

@Test
public void reciverAndConvert(){

    Object o = rabbitTemplate.receiveAndConvert("test.news");
    System.out.println(o.getClass());
    System.out.println(o);

}

(2)注解方式使用RabbitMQ

1.主程序开启RabbitMQ的注解

@EnableRabbit //开启基于注解的rabbitmq
@SpringBootApplication
public class AmqpApplication {

    public static void main(String[] args) {
        SpringApplication.run(AmqpApplication.class, args);
    }
}

2.使用注解的方式接收

@Service
public class BookService {
    @RabbitListener(queues = "test.news")
    public void receive(Book book){
        System.out.println(book);
    }

    @RabbitListener(queues = "test")
    public void receive02(Message message){
        System.out.println(message.getBody());
        System.out.println(message.getMessageProperties());
    }
}

(3)创建 Exchange(交换器)、Queue(消息队列)、Bind(绑定规则)--- AmqpAdmin。

1.创建一个Exange

@Test
public void createExchange(){
    amqpAdmin.declareExchange(new DirectExchange("amqpadmin.direct"));
    System.out.println("Create Finish");
}

2.创建Queue

@Test
public void createQueue(){

    //参数1:名字  参数2:是否持久化
    amqpAdmin.declareQueue(new Queue("amqpadmin.queue",true));
    System.out.println("Create Queue Finish");
}

3.创建Bind规则

@Test
public void createBind(){
    //参数1:目的地    参数2:类型(队列或者交换器)   参数3:exchange的名称    参数4:路由件       参数5:参数
    amqpAdmin.declareBinding(new Binding("amqpadmin.queue",Binding.DestinationType.QUEUE , "amqpadmin.direct", "amqp.haha", null));
}

4.删除

@Test
public void deleteExchange(){
    amqpAdmin.deleteExchange("amqpadmin.direct");
    System.out.println("delete Finish");
}

原文地址:https://www.cnblogs.com/JiangLai/p/10019917.html

时间: 2024-08-03 21:51:07

SpringBoot(八) Spring和消息队列RabbitMQ的相关文章

spring整合消息队列rabbitmq

spring大家太熟,就不多说了 rabbitmq一个amqp的队列服务实现,具体介绍请参考本文http://lynnkong.iteye.com/blog/1699684 本文侧重介绍如何将rabbitmq整合到项目中 ps:本文只是简单一个整合介绍,属于抛砖引玉,具体实现还需大家深入研究哈.. 1.首先是生产者配置 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

消息队列RabbitMQ

消息队列RabbitMQ 一.RabbitMQ是什么? AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然.AMQP的主要特征是面向消息.队列.路由(包括点对点和发布/订阅).可靠性.安全.RabbitMQ是一个开源的AMQP实现,服务器端用Erlang语言编写,支持多种客户端,如:Python.Ruby..NET.J

消息队列--RabbitMQ(一)

1.消息队列概述 可以理解为保存消息的一个媒介/或者是个容器,与之相关有两个概念(即生产者(Publish)与消费者(Consumer)).所谓生产者,就是生产创造消息的一方,那么,消费者便是从队列中取出消息,完成相应的某种目的.总而言之,消息队列是搭建生产者与消费者沟通的一座桥梁. 消息队列的产品也很多,作用也各有千秋.常见的消息队列有RabbitMQ.RocketMq.KafKa,本系列文章将以(RabbitMQ+C#客户端+Windonw)为例去探索消息队列的基本用途及相关使用.闲话不说,

ASP.NET Core消息队列RabbitMQ基础入门实战演练

一.课程介绍 人生苦短,我用.NET Core!消息队列RabbitMQ大家相比都不陌生,本次分享课程阿笨将给大家分享一下在一般项目中99%都会用到的消息队列MQ的一个实战业务运用场景.本次分享课程不是零基础教学,课程内容的侧重点是讲解的RabbitMQ的最实用.最简单的实战运用场景:Publish/Subscrib(发布/订阅)模式,发送端发送消息,单个接收端接收处理消息. 学完本次"是猴子都看的懂的消息队列RabbitMQ实战课程"后,阿笨带直接让你也能如此优雅简单的上手使用Rab

消息队列rabbitmq的五种工作模式(go语言版本)

前言:如果你对rabbitmq基本概念都不懂,可以移步此篇博文查阅消息队列RabbitMQ 一.单发单收 二.工作队列Work Queue 三.发布/订阅 Publish/Subscribe 四.路由Routing 五.Topic类型的exchange 六.rabbitmq部分封装代码及装备工作 一.单发单收 在下图中,“ P”是我们的生产者,“ C”是我们的消费者.中间的框是一个队列-RabbitMQ代表使用者保留的消息缓冲区. 单发单收模式下:一发一收 发送端只需要创建队列,然后向队列发送消

消息队列RabbitMQ与Spring

1.RabbitMQ简介 RabbitMQ是流行的开源消息队列系统,用erlang语言开发.RabbitMQ是AMQP(高级消息队列协议)的标准实现. 官网:http://www.rabbitmq.com/ 2.Spring集成RabbitMQ 2.1 maven配置 //pom.xml <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId>

消息队列 RabbitMq 的五种形式队列

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法. AMQP(高级消息队列协议)是一个异步消息传递所使用应用层协议规范,为面向消息中间件设计,基于此协议的客户端与消息中间件可以无视消息来源传递消息,不受客户端.消息中间件. 不同的开发语言环境等条件的限制 概念解释: Server(Broker):接收客户端连接,实现 AMQP 协议的消息队列和路由功能的进程: Virtual Host:虚拟主机的概念,类似权限控制组,一个 Virtual Host 里可

云计算openstack共享组件-消息队列rabbitmq(2)

一.MQ 全称为 Message Queue, 消息队列( MQ ) 是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.   消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术.排队指的是应用程序通过队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.   排队指的是应用程序通过 队列来通信.队列的使用除去了接收和发送应用程序同时执行的要求.

(转)(二)RabbitMQ消息队列-RabbitMQ消息队列架构与基本概念

http://blog.csdn.net/super_rd/article/details/70238869 没错我还是没有讲怎么安装和写一个HelloWord,不过快了,这一章我们先了解下RabbitMQ的基本概念. RabbitMQ架构 说是架构其实更像是应用场景下的架构(自己画的有点丑,勿嫌弃) 从图中可以看出RabbitMQ主要由Exchange和Queue两部分组成,然后通过RoutingKey关联起来,消息投递到Exchange然后通过Queue接收. RabbitMQ消息队列基本概