中间件之RabbitMQ基础篇

概述

RabbitMQ是一个开源的遵循AMQP协议基于Erlang语言编写的产品,它支持多种客户端(语言),在分布式系统中负责存储消息,转发消息,具有高可用,高可靠特性(RabbitMQ默认程序通讯端口为5672,web默认访问端口15672)

中间件之RabbitMQ基础篇_第1张图片 RabbitMQ核心组件

如上图所示,组件说明如下:

  • Broker:可以理解为rabbit服务器,用于接收客户端连接等
  • Connection:应用程序(生产者/消费者)与Broker的网络连接,本质为TCP/IP三次握手四次挥手
  • Channel:信道,消息传输过程中几乎所有的操作基于信道,包括消息读写等
  • Message:消息,服务之间传输的数据,由properties和body组成,properties目的是对消息进行包装,比如消息的优先级,延迟等高级特性,body就是消息实际内容
  • Virtual host:虚拟地址,用于消息的隔离与区分
  • Exchange:交换机,用于接收消息并根据路由信息发送到队列,交换机不具备存储消息能力
  • Queue:队列,用于保存消息并将消息转发给消费者
  • Bindings:用于Exchange和Queue之间的虚拟连接
中间件之RabbitMQ基础篇_第2张图片 RabbitMQ实现消息生产到消费全过程

 AMQP

Advanced Message Queuing Protocol高级消息队列协议,专门面向消息中间件设计

中间件之RabbitMQ基础篇_第3张图片 AMQP生产者流程

中间件之RabbitMQ基础篇_第4张图片 AMQP消费者流程

RabbitMQ安装

使用Docker安装更加方便,如下首次安装RabbitMQ指令包含了拉取RabbitMQ镜像、设置登录rabbitMQ的用户密码(admin:admin拥有最高权限)、docker中服务端口和本地端口的映射等

中间件之RabbitMQ基础篇_第5张图片 Docker安装RabbitMQ命令

RabbitMQ核心

1.简单模式(交换机为默认的)

中间件之RabbitMQ基础篇_第6张图片 simple模式

        如上图所示简单模式由一个消费者、队列和生产者组成;

        基本实现:创建连接->连接创建通道->通道创建交换机/声明队列/绑定/路由/发送接受消息->封装消息内容->推送消息到队列->关闭通道->关闭连接

        Java代码示例: 

        producer

中间件之RabbitMQ基础篇_第7张图片 Producer生产消息

     rabbitMQ的web页面中已将队列和交换机绑定,所以此处无相关代码,通过代码实现如下: 

中间件之RabbitMQ基础篇_第8张图片 Exchange和Queue实现Binding
​​​​​

        consumer

中间件之RabbitMQ基础篇_第9张图片 Consumer接收消息

2.工作队列模式(交换机为默认的)

中间件之RabbitMQ基础篇_第10张图片 Work Queues

        当存在多个消费者时,我们根据什么原则对消费者进行分配消息?

       A. 轮询模式:按均分配,每个消费者消费的消息个数是一样的

        java代码实现示例

        producer

中间件之RabbitMQ基础篇_第11张图片 producer-work

         consumer

中间件之RabbitMQ基础篇_第12张图片 consumer-work1-轮询 中间件之RabbitMQ基础篇_第13张图片 consumer-work2-轮询

         消费结果:

中间件之RabbitMQ基础篇_第14张图片 conumser-work1-轮询消费的消息 中间件之RabbitMQ基础篇_第15张图片 consumer-work2-轮询消费的消息

         从结果可以得出轮询模式是按均分配

        B. 公平分发模式:按劳分配,根据消费者消费能力不同进行公平分发,处理能力强的分配的消息更多

        java代码实现示例

        producer

中间件之RabbitMQ基础篇_第16张图片 producer-work

        consumer

中间件之RabbitMQ基础篇_第17张图片 consumer-work1-公平分发

中间件之RabbitMQ基础篇_第18张图片 consumer-work2-公平分发

         注意:在公平分发模式中:

  • Channel通道指定qos指标(每次从队列获取的消息个数,依据服务器内存以及硬盘大小而定)
  • Channel通道设置手动应答,即autoAck设置为false后调用basicAck应答

        消费结果: 

中间件之RabbitMQ基础篇_第19张图片 consumer-work2-公平分发消费的消息 中间件之RabbitMQ基础篇_第20张图片 consumer-work1-公平分发消费的消息

          从结果可以得出公平分发模式是按劳分配

3.发布订阅模式(fanout模式)

中间件之RabbitMQ基础篇_第21张图片 publish-subscribe

        发布订阅模式也称为fanout模式,是一种广播模式,它没有路由key 

        a. Java关键代码示例:

        producer:

中间件之RabbitMQ基础篇_第22张图片 producer-fanout

         consumer:

中间件之RabbitMQ基础篇_第23张图片 Consumer-fanout

        b. SpringBoot整合RabbitMQ关键代码示例: 

        编写生产者Producer服务      

         pom.xml导入依赖

pom导入rabbitMQ依赖

           yml配置rabbitMQ信息

中间件之RabbitMQ基础篇_第24张图片 application.yml

             编写RabbitMQConfig配置类

中间件之RabbitMQ基础篇_第25张图片 rabbitMQConfig-fanout

中间件之RabbitMQ基础篇_第26张图片

中间件之RabbitMQ基础篇_第27张图片 producer-fanout-service

         编写消费者Consumer服务

        消费者也是一个工程服务,和生产者的pom和yml(端口改为8001)基本相同,所以此处省略,consumer业务实现示例如下:

中间件之RabbitMQ基础篇_第28张图片 consumer-fanout

4.路由模式(direct模式)

中间件之RabbitMQ基础篇_第29张图片 routing

        路由模式相比发布订阅指定了routing-key,消费者可以选择路由key来消费消息

        提示:其实路由模式完全可以用来实现发布订阅模式,通过设置所有routing-key为同一个值,但这样完全没意义,因为还需要过滤路由key造成性能消耗

        a. Java关键代码示例:

        producer

中间件之RabbitMQ基础篇_第30张图片 producer-direct-routing

         consumer

中间件之RabbitMQ基础篇_第31张图片 consumer-direct-routing

        b. SpringBoot整合RabbitMQ关键代码示例: 

        编写生产者Producer服务      

中间件之RabbitMQ基础篇_第32张图片 rabbitMQConfig-direct

rabbitMQConfig-direct+routingKey 中间件之RabbitMQ基础篇_第33张图片 producer-direct-service

 

                编写消费者Consumer服务

consumer-direct

5.主题模式(topic模式)

中间件之RabbitMQ基础篇_第34张图片 topics

         主题模式相比路由模式的routing-key,它的routing-key提供了模糊匹配方式,如#com.*,其中#表示0/1/多个,而*表示1级

        a. Java关键代码示例:

        producer

中间件之RabbitMQ基础篇_第35张图片 producer-topic

topic-模糊路由示例

         consumer

中间件之RabbitMQ基础篇_第36张图片 consumer-topic

        b. SpringBoo注解t整合RabbitMQ关键代码示例: 

        编写生产者Producer服务 

中间件之RabbitMQ基础篇_第37张图片 producer-topic

 

        编写消费者Consumer服务

中间件之RabbitMQ基础篇_第38张图片 consumer-topic-注解方式

你可能感兴趣的:(#,RabbitMQ,java,中间件,rabbitmq)