前言

Rabbitmq是一个开源的消息代理软件,是AMQP协议的实现。核心作用就是创建消息队列,异步发送和接收消息。通常用来在高并发中处理削峰填谷、延迟处理、解耦系统之间的强耦合、处理秒杀订单。  入门rabbitmq之前主要是想了解下秒杀排队订单入库后,异步通知客户端秒杀结果。

基础知识

1、基本概念(角色)

了解rabbitmq之前先要了解3个基本概念:生产者、消费者、代理(队列)。 rabbitmq在生产者和代理中间做了一层抽象。这样消息生产者和队列就没有直接联系,在中间加入了一层交换器(Exchange)。这样消息生产者把消息交给交换器,交换器根据路由策略再把消息转发给对应队列。

2、消息发送原理

首先要发送消息必须先连接到rabbitmq-server。那怎么连接和发送消息呢?首先你的应用程序和rabbitmq会创建一个TCP链接。一旦TCP链接并通过认证。认证就是你试图连接rabbitmq时服务器的用户名和密码。认证通过,你的应用程序和rabbitmq之间就创建了一条AMQP信道(Channel),后续所有的消息都是基于这个信道完成。

3、为什么不直接通过TCP直接发送消息

对于操作系统来说创建和销毁TCP连接是非常昂贵的开销,而在并发高峰期时再去处理TCP创建与销毁显然是不合适的。这就造成了TCP的巨大浪费,而且操作系统每秒创建TCP的能力也是有限的,因此直接通过TCP发送消息会很快遇到瓶颈。

交换器(Exchange)

前面提到rabbitmq在你的应用程序和队列中间增加了一层代理,代理根据路由策略把消息路由到指定队列。 交换器分为4类:

  • direct(默认)
  • headers
  • fanout
  • topic

1、direct。是交换器的默认实现,根据路由规则匹配上就会把消息投递到对应队列。

2、headers。 是一个自定义匹配规则类型,在队列和交换器绑定时,会设置一组键值对,消息中也包含一组键值对,当这些键值对匹配上,则会投递消息到对应队列。

3、fanout。是一种发布订阅模式,当你发送一条消息时,交换器会把消息广播到所有附加到这个交换器的队列上。 对于fanout来说routingkey是无效的。

4、topic。可以更灵活的匹配自己想订阅的消息。也是routingkey用处最大的一种。类似我们配置request mapping中的通配符。

安装rabbitmq

我是本机ubuntu16中安装,没有配置软件源,安装速度倒还能接收。rabbitmq是erlang开发,所以先安装erlang,再安装rabbitmq-server

sudo apt-get install erlang

sudo apt-get install rabbitmq-server

安装完成后查看运行状态 systemctl status rabbitmq-server

启动 service rabbitmq-server start

停止  serivce rabbitmq-server stop

重启  service rabbitmq-server restart

安装好rabbitmq后,启用web客户端 rabbitmq-plugines enable rabbitmq_management。

启动后默认使用guest/guest访问,仅支持localhost访问: http://localhost:15672。 web站点默认端口15672。 rabbitmq默认端口5672

在SpringBoot中集成rabbitmq

1、配置信息

spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

2、默认交换器(direct)实现

import org.springframework.amqp.core.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class DirectConfig { @Bean
public Queue directQueue(){
return new Queue("direct",false); //队列名字,是否持久化
} @Bean
public DirectExchange directExchange(){
return new DirectExchange("direct",false,false);//交换器名称、是否持久化、是否自动删除
} @Bean
Binding binding(Queue queue, DirectExchange exchange){
return BindingBuilder.bind(queue).to(exchange).with("direct");
} }

 消息生产者(发送者)

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; /**
* 消息发送--生产消息
*/
@Component
public class Sender { @Autowired
AmqpTemplate rabbitmqTemplate; public void send(String message){
System.out.println("发送消息:"+message);
rabbitmqTemplate.convertAndSend("direct",message);
}
}

 消息消费者(接收者)

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component; @Component
@RabbitListener(queues = "direct")
public class Receiver { @RabbitHandler
public void handler(String message){
System.out.println("接收消息:"+message);
} }

 OK,来测试下,默认情况下,只能本机访问,我本地是在ubuntu虚拟机中,我在虚拟机中运行demo

import com.zhangfei.mq.Sender;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody; @Controller
@RequestMapping("/rabbitmq")
public class MyRabbitmqController { @Autowired
Sender sender; @RequestMapping("/sender")
@ResponseBody
public String sender(){
System.out.println("send string:hello world");
sender.send("hello world");
return "sending...";
}
}

 运行结果

参考资料

https://www.cnblogs.com/vipstone/p/9950434.html 【推荐。作者:王磊】这里基础概念里有示意图,可以对rabbit涉及到的基础概念和流程有一个直观的认识

https://blog.csdn.net/ztx114/article/details/78410727

SpringBoot集成rabbitmq(一)的更多相关文章

  1. SpringBoot集成rabbitmq(二)

    前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失.除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特 ...

  2. SpringBoot集成RabbitMQ消息队列搭建与ACK消息确认入门

    1.RabbitMQ介绍 RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性.扩展性.高可用性等方面表现不俗.Rabbi ...

  3. springboot集成rabbitmq(实战)

    RabbitMQ简介RabbitMQ使用Erlang语言开发的开源消息队列系统,基于AMQP协议来实现(AMQP的主要特征是面向消息.队列.路由.可靠性.安全).支持多种客户端,如:Python.Ru ...

  4. SpringBoot集成RabbitMQ

    官方说明:http://www.rabbitmq.com/getstarted.html 什么是MQ? MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.MQ ...

  5. Java SpringBoot集成RabbitMq实战和总结

    目录 交换器.队列.绑定的声明 关于消息序列化 同一个队列多消费类型 注解将消息和消息头注入消费者方法 关于消费者确认 关于发送者确认模式 消费消息.死信队列和RetryTemplate RPC模式的 ...

  6. SpringBoot集成RabbitMQ并实现消息确认机制

    原文:https://blog.csdn.net/ctwy291314/article/details/80534604 RabbitMQ安装请参照RabbitMQ应用 不啰嗦直接上代码 目录结构如下 ...

  7. springboot集成rabbitmq并手动注册容器实现单个queue的ack模式

    原文:https://blog.csdn.net/qq_38439885/article/details/88982373 进入正题,本文会介绍两种实现rabbitmq的ack模式的方法,分别为: 一 ...

  8. Springboot集成RabbitMQ之MessageConvert源码解析

    问题 最近在使用RabbitMq时遇到了一个问题,明明是转换成json发送到mq中的数据,消费者接收到的却是一串数字也就是byte数组,但是使用mq可视化页面查看数据却是正常的,之前在使用过程中从未遇 ...

  9. SpringBoot集成RabbitMQ 从零到一,学会MQ异步和解耦--

    RabbitMQ 概念 RabbitMQ 即一个消息队列,_主要是用来实现应用程序的异步和解耦,同时也能起到消息缓冲,消息分发的作用._RabbitMQ使用的是AMQP协议,它是一种二进制协议.默认启 ...

随机推荐

  1. Dapper 封装oracle底层访问数据库

    如下代码,修改成只支持oracle: using System; using System.Collections.Generic; using System.Data; using System.L ...

  2. NPOI 修改指定单元格字体颜色

    //创建一个字体颜色 IFont font = hssfworkbook.CreateFont(); //红色 font.Color = HSSFColor.Red.Index; //样式 ICell ...

  3. react-quill 富文本编辑器 ---- 图片处理

    import React,{Component} from 'react'; import ReactQuill,{ Quill } from 'react-quill'; import 'react ...

  4. CSS文字的跑马灯特效

    上学时同学有个来电带跑马灯的手机,可把我羡慕坏了,可等我买的起手机时,跑马灯不流行了,甚伤萝卜心! 今天就用CSS做个文字的跑马灯特效,缅怀一下本萝卜逝去的青春! 道具:会敲代码的巧手.七窍玲珑心.会 ...

  5. 查询结果集转换成HTML存储过程

    工作中经常需要用SQLServer发送报警或者业务报表邮件,每次现拼串也不是办法,故写了一个TableResult to HTML的存储过程 USE master; GO -- Description ...

  6. 如何在Linux下查看版本信息

    Linux下如何查看版本信息, 包括位数.版本信息以及CPU内核信息.CPU具体型号等等,整个CPU信息一目了然.   1.# uname -a   (Linux查看版本当前操作系统内核信息)   L ...

  7. 七种经典排序算法及Java实现

    排序算法稳定性表示两个值相同的元素在排序前后是否有位置变化.如果前后位置变化,则排序算法是不稳定的,否则是稳定的.稳定性的定义符合常理,两个值相同的元素无需再次交换位置,交换位置是做了一次无用功. 下 ...

  8. phpcms2008远程代码执行漏洞

    phpcms2008远程代码执行漏洞 描述: 近日,互联网爆出PHPCMS2008代码注入漏洞(CVE-2018-19127).攻击者利用该漏洞,可在未授权的情况下实现对网站文件的写入.该漏洞危害程度 ...

  9. 数组Array和列表集合ArrayList、LinkedList和Vector的区别

    一.ArrayList和Vector的区别 ArrayList与Vector主要从以下方面来说. 1.同步性: Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同 ...

  10. 一个老程序员是如何手写Spring MVC的

    人见人爱的Spring已然不仅仅只是一个框架了.如今,Spring已然成为了一个生态.但深入了解Spring的却寥寥无几.这里,我带大家一起来看看,我是如何手写Spring的.我将结合对Spring十 ...