springboot整合rabbitmq

springboot整合rabbitmq

1、为什么要开始写博客 ?

​ 最近在都一本名为《暗时间》的书,书的作者是一位程序员,而且对心理学还有研究,刚好闲来无事的所以阅读了一番,没想到却被深深吸引。书中有一章为“打造自己的核心竞争力”,提到了为什么要写博客,书写博客是为了缓存自己学习知识的思维,而且还用了一个例子来说明,“如果数学家没有了纸和笔,只在自己的脑子中做运算,那么人人类的文明不会有今天”。这番话深深触动了我。最为重要的是,写博客所带来的收益,不止帮我解决了如何使用一门技术的问题,还帮我拓宽了技术面,激励我去学习更深层的原理。
​ 好书如同贵人,读一本书就犹如和一个高情商的人聊天,而和“高情商”的人连天是乐此不疲的。

2、rabbitmq与amqp协议

言归正传,下面就让我来展开说说mq

1.什么是mq

MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们。

消息传递指的是程序之间通过在消息中发送数据进行通信,而不是通过直接调用彼此来通信,直接调用通常是用于诸如远程过程调用的技术。排队指的是应用程序通过队列来通信。队列的使用除去了接收和发送应用程序同时执行的要求。

2.什么是rabbitmq

rabbitmq是我们初学者常常使用的中间件,使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP, SMTP,STOMP,也正是如此,使的它变的非常重量级,更适合于企业级的开发。

3.amqp

作为初学者来说,我只知道它是一个“高级消息队列协议”,至于往深层次的说,我对于这一协议还有点模糊。

如果大家想要详细了解,可以看看这位博主写的AMQP协议学习 - 知乎 (zhihu.com)

4.rabbit工作的原理

请参考这幅图

springboot整合rabbitmq_第1张图片

以下是里边涉及到的概念

  • broker:接收和分发消息的应用
  • Virtual host: Virtual host是一个虚拟主机的概念,一个Broker中可以有多个Virtual host,每个Virtual host都有一套自己的Exchange 和 Queue,同一个给Virtual host中的Exchange 个Queue不能重名,不同的Virtual host中的 Exchange和Queue可以重名。 如果rabbitmq理解成数据库,那么virtual host就是一个一个的数据库。
  • connection: prodeucer/consumer和broker之间的的TCP连接
  • channel:发送消息的管道
  • Exchange:message到达broker的第一站,复制把消息分发到Queue中
  • Queue:用来存放消息的队列 ,生产者发送的消息会被放到Queue中,消费者消费消息也是从Queue中取出消息
  • Bingding:exchange和queue之间的虚拟连接

3、整合步骤

1. 准备环境

1.1下载镜像

在Centos7服务器上使用Docker来安装

docker pull rabbitmq:3.9-management

1.2运行容器

docker run \
 -e RABBITMQ_DEFAULT_USER=user \
 -e RABBITMQ_DEFAULT_PASS=password \
 --name mq \
 --hostname mq1 \
 -p 15672:15672 \
 -p 5672:5672 \
 -d \
 rabbitmq:3.9-management

15672端口为访问端口

2.springboot整合rabbitmq

1.引入依赖

<dependency>
    <groupId>org.springframework.bootgroupId>
    <artifactId>spring-boot-starter-amqpartifactId>
dependency>

2.配置文件

1)要使用rabbitmq参考rabbit工作原理的图,分为如下步骤:

  1. 建立连接
    1. 1.1.设置连接参数,分别是:主机名、端口号、vhost、用户名、密码
    2. 建立连接
  2. 创建通道Channel
  3. 创建队列
  4. 发送消息
  5. 关闭通道和连接

2)springboot整合之后简写

spring:
  rabbitmq:
    host: 192.168.150.101 # 主机名
    port: 5672 # 端口
    virtual-host: / # 虚拟主机
    username: username # 用户名
    password: password # 密码
   

交换机和队列需自己创建和绑定关系

3.代码演示(以Fanout交换机为例子)

1)声明交换机和队列,并绑定关系

//交换机
public static final String EXCHANGE_FANOUT = "fanout";
//队列名称
public static final String NOTIFY_QUEUE = "notify_queue";
public static final String REPLY_QUEUE = "reply_queue";
//声明交换机
@Bean(EXCHANGE_FANOUT)
public FanoutExchange exchange_direct(){
 // 三个参数:交换机名称、是否持久化、当没有queue与其绑定时是否自动删除
 return new FanoutExchange(EXCHANGE_FANOUT, true, false);
}

//声明队列
@Bean(NOTIFY_QUEUE)
public Queue publish_queue(){
  return QueueBuilder.durable(NOTIFY_QUEUE).build();
}
//回复队列
@Bean(PREPLY_QUEUE)
public Queue result_queue(){
  return QueueBuilder.durable(PAYNOTIFY_REPLY_QUEUE).build();
}
//交换机和队列绑定
@Bean
public Binding binding_publish_queue(@Qualifier(NOTIFY_QUEUE) Queue queue, @Qualifier(EXCHANGE_FANOUT) FanoutExchange exchange){
  return BindingBuilder.bind(queue).to(exchange);
}

@Bean
public Binding binding_result_queue(@Qualifier(REPLY_QUEUE) Queue queue, @Qualifier(EXCHANGE_FANOUT) FanoutExchange exchange){
  return BindingBuilder.bind(queue).to(exchange);
}

2)发送消息

String message = "hello rabbitmq"
rabbitTemplate.convertAndSend(PayNotifyConfig.PAYNOTIFY_EXCHANGE_FANOUT,"",message);

3)接收消息

@Component
public class ConsumerListener {

    @RabbitListener(queues = NotifyConfig.NOTIFY_QUEUE)
    public void receive(String message) {
        System.out.println("spring  notify 消费者接收到消息:【" + message + "】");

    }
}

注意:测试时者两个模块分别在不同的服务里

建议大家调试的时候打上断点,以便观察

4、使用rabbitmq的好处,以及使用rabbitmq产生的问题

优点:

  • 系统解耦:以往都是A系统发送给B、C、D系统,现在系统A只用发送给MQ中间件,由MQ发送消费数据给其它系统
  • 故障隔离:服务没有直接调用,不存在级联失败问题
  • 异步调用:假设你有一个系统调用链路,是系统A调用系统B,一般耗时20ms;系统B调用系统C,一般耗时200ms;系统C调用系统D,一般耗时2s,一个请求将会耗费很长时间,而将D系统做成异步调用,则不用管理D耗费多长时间,性能提升10呗
  • 流量销峰:在处理秒杀系统时,一下子压垮你的系统,因为绝对无法抗住每秒几千的请求高峰。而使用MQ,所有的请求会先进入队列,而系统服务可以按照自己的速度处理请求。

使用MQ会产生的问题:

  • 消息丢失问题
  • 消息重复问题
  • 垃圾消息问题
  • 延时消费问题

这些问题我会在下次写博客的时候解决,因为还在整理思绪

5.总结及下一周的计划

总结:

​ 在写这篇博客的时候,中间想过很多次想要停下来的冲动,因为这种博客在网上应有尽有。但是看到《暗时间》作者刘未鹏对书写博客重要的阐述时。我恍然大悟,书写博客是对自己思维的总结,而在这期间我获得的收益远远大于文章内容所阐述的东西,而且还培养了自己解决问题的能力。

下一步计划:

  • 消息队列的交换机几种模式

  • 声明队列和交换机时,对其参数的详细说明

  • 使用MQ所产生的背景问题的解决。

    在写这篇博客的时候,中间想过很多次想要停下来的冲动,因为这种博客在网上应有尽有。但是看到《暗时间》作者刘未鹏对书写博客重要的阐述时。我恍然大悟,书写博客是对自己思维的总结,而在这期间我获得的收益远远大于文章内容所阐述的东西,而且还培养了自己解决问题的能力。

下一步计划:

  • 消息队列的交换机几种模式
  • 声明队列和交换机时,对其参数的详细说明
  • 使用MQ所产生的背景问题的解决。

你可能感兴趣的:(java-rabbitmq,rabbitmq,spring,boot)