当前位置: 首页 > article >正文

034 RabbitMQ简介 安装 SpringBoot整合RabbitMQ框架搭建

文章目录

    • MQ概述
    • MQ的基本概念
      • 优势和劣势
      • 使用MQ需要满足的条件
      • 常见的MQ产品
    • RabbitMQ简介
      • RabbitMQ提供了6种工作模式
    • 安装
    • SpringBoot整合RabbitMQ框架搭建
      • rabbitmq-consumer
        • RabbitMQConsumerApplication.java
        • application.properties
        • pom.xml
      • rabbit-provider
        • RabbitMQProviderApplication.java
        • application.properties
        • pom.xml

https://www.rabbitmq.com

MQ概述

MQ全称Message Queue(消息队列),是在消息的传输过程中保存消息的容器。多用于分布式系统之间进行通信。

MQ的基本概念

优势和劣势

优势:
应用解耦:提高系统容错性和可维护性
异步提速:提升用户体验和系统吞吐量
削峰填谷:提高系统稳定性
劣势:
系统可用性降低:系统引入的外部依赖越多,系统稳定性越差。一旦MQ宕机,就会对业务造成影响。如何保证MQ的高可用?
系统复杂度提高:MQ的加入大大增加了系统的复杂度,以前系统间是同步的远程调用,现在是通过MQ进行异步调用。如何保证消息没有被重复消费?怎么处理消息丢失情况?怎么保证消息传递的顺序性?
一致性问题
A系统处理完业务,通过MQ给B、C、D三个系统发消息数据,如果B系统、C系统处理成功,D系统处理失败。如何保证消息的一致性

使用MQ需要满足的条件

1 生产者不需要从消费者处获得反馈。引入消息队列之前的直接调用,其接口的返回值应该为空,这才让明明下层的动作还没做,上层却当成动作做完了继续往后走,即所谓异步成为了可能。
2 回报大于投入:用了确实有效果。即解耦、提速、削峰这些方面的收益,超过加入MQ(管理)的成本。
3 允许短暂的不一致性;MQ能够保证数据的最终一致性

常见的MQ产品

RabbitMQ、RocketMQ、ActiveMQ、Kafka、ZeroMQ、MetaMq等
也有直接使用Redis充当消息队列的案例,而这些消息队列产品,各有侧重,在实际选型时,需要结合自身需求及MQ产品特征,综合考虑

RabbitMQActiveMQRocketMQKafka
公司/社区RabbitApache阿里Apache
开发语言ErlangJavaJavaScala&Java
协议支持AMQP,XMPP,SMTP,STOMPOpenWire,STOMP,REST,XMPP,AMQP自定义自定义协议,社区封装了http协议支持
客户端支持语言官方支持Erlang,Java,Ruby等,社区产出多种API,几乎支持所有语言Java,C,C++,Python,PHP,Perl,.net等Java,C++(不成熟)官方支持Java,社区产出多种API,如PHP,Python等
单机吞吐量万级(其次)万级(最差)十万级(最好)十万级(次之)
消息延迟微秒级毫秒级毫秒级毫秒以内
功能特性并发能力强,性能极其好,延时低,社区活跃,管理界面丰富老牌产品,成熟度高,文档较多MQ功能比较完备,扩展性佳只支持主要的MQ功能,毕竟是为大数据领域准备的

RabbitMQ简介

AMQP,即Advanced Message Queuing Protocol(高级消息队列协议),是一个网络协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。2006年,AMQP规范发布。类别HTTP。
AMQP
2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ1.0发布。RabbitMQ采用Erlang语言开发。Erlang语言由Ericson设计,专门为开发高并发和分布式系统的一种语言,在电信领域使用广泛。
在这里插入图片描述
VHost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
Connection:publisher/consumer和broker直接的TCP连接
Channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列
Queue:消息队列载体,每个消息都会被投入到一个或多个队列

RabbitMQ提供了6种工作模式

简单模式
work queues
Publish/Subscribe发布与订阅模式
Routing路由模式
Topics主题模式
RPC远程调用模式

安装

下载镜像

docker pull rabbitmq:management 

创建容器

docker run -d --restart=always --name=rabbitmq -p 5671:5671 -p 5672:5672 -p 4369:4369 -p 15671:15671 -p 15672:15672 -p 25672:25672 rabbitmq:management

解释如下:
15672 (if management plugin is enabled.管理界面 )
15671 management监听端口
5672, 5671 (AMQP 0-9-1 without and with TLS 消息队列协议是一个消息协议)
4369 (epmd) epmd 代表 Erlang 端口映射守护进程
25672 (Erlang distribution)
对于 RabbitMQ,默认情况下,端口 5671 是用于 AMQP over TLS 的默认端口,而端口 5672 是用于非加密的 AMQP 连接的默认端口。
如果5671映射失败,会出现TLS 连接失败:如果有任何客户端或服务尝试通过 TLS 连接到您的 RabbitMQ 服务器(即使用 5671 端口),连接将会失败

浏览器输入http://localhost:15672访问管理界面,账号和密码是guest

设置容器开机自启动

docker update --restart=always 容器ID

SpringBoot整合RabbitMQ框架搭建

rabbitmq-consumer

RabbitMQConsumerApplication.java
package com.cubemall;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

application.properties
# RabbitMQ 服务host地址
spring.rabbitmq.host=localhost
# 端口
spring.rabbitmq.port=5672
# 虚拟主机地址
spring.rabbitmq.virtual-host=/
# rabbit服务的用户名
spring.rabbitmq.username=guest
# rabbit服务的密码
spring.rabbitmq.password=guest
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <artifactId>rabbit-consumer</artifactId>
    <packaging>jar</packaging>

    <name>rabbit-consumer</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>



    <dependencies>
        <!--amqp的起步依赖坐标-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>


        <!--rabbit测试依赖坐标-->
        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit-test</artifactId>
            <scope>test</scope>
        </dependency>
        <!--SpringBoot测试依赖坐标-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>


    </dependencies>


</project>

rabbit-provider

RabbitMQProviderApplication.java
package com.cubemall;


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

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

application.properties
# RabbitMQ 服务host地址
spring.rabbitmq.host=localhost
# 端口
spring.rabbitmq.port=5672
# 虚拟主机地址
spring.rabbitmq.virtual-host=/
# rabbit服务的用户名
spring.rabbitmq.username=guest
# rabbit服务的密码
spring.rabbitmq.password=guest

pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.9.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <artifactId>rabbit-provider</artifactId>
    <packaging>jar</packaging>

    <name>rabbit-provider</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>




    <dependencies>
    <!--amqp协议的起步依赖坐标-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
    <!--rabbit测试依赖坐标-->
    <dependency>
        <groupId>org.springframework.amqp</groupId>
        <artifactId>spring-rabbit-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!--SpringBoot测试依赖坐标-->
    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>






</project>


http://www.kler.cn/news/365667.html

相关文章:

  • 【Jenkins】解决在Jenkins Agent节点容器内无法访问物理机的docker和docker compose的问题
  • 【揭秘】图像算法工程师岗位如何进入?
  • Python与MySQL
  • 【机器学习】简单易懂的聚类算法K-Means
  • Lua 语言中的注释详解
  • 开拓鸿蒙测试新境界,龙测科技引领自动化测试未来
  • STMicroelectronics意法半导体车规芯片系列--亿配芯城(ICgoodFind)
  • 非接触式竖向位移、水平位移视频实时在线监测的设备分类及选型
  • 作业5-laravel 操作数据库
  • docker集成Nginx和Mysql (教程)
  • 安达发|氢能源产业与APS生产排程软件的结合
  • 笔记本电脑充不进去电怎么回事 笔记本电脑充不上电解决
  • Elastic Stack - FileBeat 入门浅体验
  • ChartCheck: Explainable Fact-Checking over Real-World Chart Images
  • MongoDB简单学习
  • 【软件工程】软件工程入门
  • 论文速读:YOLO-G,用于跨域目标检测的改进YOLO(Plos One 2023)
  • 人脸应用实例:性别年龄预测
  • AMD锐龙8845HS+780M核显 虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)
  • 中国自动驾驶时代记:技术、理想和“真经路”
  • 数据结构——查找
  • 青少年编程与数学 02-002 Sql Server 数据库应用 12课题、存储过程编写
  • SpringBoot实战:房屋租赁管理系统开发全解析
  • 计算机网络原理总结C-网络层
  • 101链表指定区间反转
  • 手机开户需要提供哪些材料?要注意什么?