RabbitMQ
发布日期:2021-06-30 17:03:57 浏览次数:2 分类:技术文章

本文共 8293 字,大约阅读时间需要 27 分钟。

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述 R A B B I T M Q
在这里插入图片描述

  • RabbitMQ 官网:
  • 【消息队列MQ】各类MQ比较:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

目录标题

RabbitMQ 使用场景

# 服务解耦

假设有这样一个场景, 服务A 产生数据, 而 服务B,C,D 需要这些数据, 那么我们可以在 A服务 中直接调用 B,C,D服务 ,把数据传递到下游服务即可

但是,随着我们的应用规模不断扩大,会有更多的服务需要A的数据,如果有几十甚至几百个下游服务,而且会不断变更,再加上还要考虑下游服务出错的情况,那么A服务中调用代码的维护会极为困难

这是由于服务之间耦合度过于紧密

在这里插入图片描述
再来考虑用 RabbitMQ 解耦的情况

A服务需要向消息服务器发送消息,而不用考虑谁需要这些数据;下游服务如果需要数据,自行从消息服务器订阅消息 ,不再需要数据时则取消订阅即可

在这里插入图片描述

# 流量削峰

假设我们有一个应用,平时访问量是每秒300请求,我们用一台服务器即可轻松应对

在这里插入图片描述

而在高峰期,访问量瞬间翻了十倍,达到每秒3000次请求,那么单台服务器肯定无法应对,这时我们可以考虑增加到10台服务器,来分散访问压力

但如果这种瞬时高峰的情况每天只出现一次,每次只有半小时,那么我们10台服务器在多数时间都只分担每秒几十次请求,这样就有点浪费资源了

在这里插入图片描述

这种情况,我们就可以使用 RabbitMQ 来进行 流量削峰

高峰情况下,瞬间出现的大量请求数据,先发送到消息队列服务器,排队等待被处理,而我们的应用,可以慢慢的从消息队列接收请求数据进行处理,这样把数据处理时间拉长,以减轻瞬时压力

这是消息队列服务器非常典型的应用场景

这种情况,我们就可以使用RabbitMQ来进行流量削峰,高峰情况下,瞬间出现的大量请求数据,先发送到消息队列服务器,排队等待被处理,而我们的应用,可以慢慢的从消息队列接收请求数据进行处理,这样把数据处理时间拉长,以减轻瞬时压力

这是消息队列服务器非常典型的应用场景

# 异步调用

考虑定外卖支付成功的情况

  • 支付后要发送支付成功的通知,
  • 再寻找外卖小哥来进行配送,

而寻找外卖小哥的过程非常耗时,尤其是高峰期,可能要等待几十秒甚至更长

这样就造成整条调用链路响应非常缓慢

在这里插入图片描述

而如果我们引入 RabbitMQ 消息队列,订单数据可以发送到消息队列服务器,

那么调用链路也就可以到此结束,订单系统则可以立即得到响应,整条链路的响应时间只有200毫秒左右

寻找外卖小哥的应用可以以异步的方式从消息队列接收订单消息,再执行耗时的寻找操作

在这里插入图片描述


RabbitMQ 基本概念 (术语)

RabbitMQ 是一种消息中间件,用于处理来自客户端的异步消息

  • 服务端将要发送的消息放入到队列池中。
  • 接收端可以根据 RabbitMQ 配置的转发机制接收服务端发来的消息。
  • RabbitMQ 依据指定的转发规则进行消息的转发、缓冲和持久化操作,

主要用在 多服务器间单服务器的子系统间 进行通信,是分布式系统标准的配置。

RabbitMQ 流程图(下面一一介绍每一步)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

# Exchange (交换)

接受生产者发送的消息,并根据 Binding 规则 将消息路由给服务器中的队列

ExchangeType 决定了 Exchange 路由消息的行为。

在RabbitMQ中,ExchangeType常用的有三种。

  • direct (直接塞进去)
  • Fanout (数目划分)
  • Topic (类型划分)
    .
    在这里插入图片描述

# Message Queue (消息队列)

我们发送给 RabbitMQ 的消息最后都会到达各种 queue ,并且存储在其中(如果路由找不到相应的 queue 则数据会丢失),等待消费者来取。

# Binding Key

它表示的是 ExchangeMessage Queue 是通过 binding key 进行联系的,这个关系是固定。

# Routing Key

生产者在将消息发送给 Exchange 的时候,一般会指定一个 routing key

routing key指定这个消息的路由规则

这个 routing key 需要与 Exchange Typebinding key 联合使用才能生效,我们的生产者只需要通过指定routing key来决定消息流向哪里

RabbitMQ 安装

在centos7上安装rabbitmq

下面介绍两种:

  • wget 一个一个依赖包下载体验过程很重要
  • yum 用 rabbitmq 官网的脚本,一键安装

在这里插入图片描述

先介绍前者

# 安装erlang语言库

erlang 官网 :

安装过程参考:

erlang教程 :

RabbitMQ 使用了 Erlang 开发语言,Erlang是为电话交换机开发的语言,天生自带高并发光环,和高可用特性

## 找语言包

我们可以冲 rabbitmq 官方 找到 rabbitmq官方精简的Erlang语言包

  • 0依赖rpm安装包
  • Github -

    在这里插入图片描述

    2020年3月10日

## 安装(rpm方式)

这个链接

介绍了 yum方式安装源码安装

下载 rlang 的 rpm 包

# 下载Erlang语言包wget https://github.com/rabbitmq/erlang-rpm/releases/download/v21.2.6/erlang-21.2.6-1.el7.x86_64.rpm

这里 github 提供了三个下载的地方(下面提供最新地址 2020年3月10日)

  • github-release : https://github.com/rabbitmq/erlang-rpm/releases/download/v21.3.8.14/erlang-21.3.8.14-1.el7.x86_64.rpm
  • packagecloud:
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-21.3.8.14-1.el7.x86_64.rpm/download.rpm
  • bintray https://bintray.com/rabbitmq-erlang/rpm/download_file?file_path=erlang%2F21%2Fel%2F7%2Fx86_64%2Ferlang-21.3.8.14-1.el7.x86_64.rpm

下载好 .rpm 软件包。

接下来是安装 .rpm 软件包

# 安装Erlangrpm -ivh erlang-21.2.6-1.el7.x86_64.rpm --force --nodeps

-i:显示套件的相关信息;
-v:显示指令执行过程;
-h或–hash:套件安装时列出标记;
–force 忽略报错,强行安装
–nodeps  不验证套件档的相互关联性。

在这里插入图片描述

查看是否安装成功

erl -version

出现“Erlang (SMP,ASYNC_THREADS,HIPE) (BEAM) emulator version 10.5”证明安装成功

在这里插入图片描述

# 安装 socat 依赖

rabbitmq 依赖 socat

socat 的官方网站: 。

在这里插入图片描述
官网极度简洁。。。
刚进入都怀疑我关了 css

## socat简介

socat 是一个 多功能的网络工具,名字来由是” Socket CAT ”,可以看作是 netcat 的N

倍加强版

socat 是一个两个独立数据通道之间的双向数据传输的继电器。这些数据通道包含文件、管道、设备(终端或调制解调器等)、插座(Unix,IP4,IP6 - raw,UDP,TCP)、SSL、SOCKS4客户端或代理CONNECT。

Socat 支持广播和多播、抽象Unix sockets、Linux tun/tap、GNU readline 和 PTY。它提供了分叉、记录和进程间通信的不同模式。多个选项可用于调整socat和其渠道,Socat可以作为TCP中继(一次性或守护进程),作为一个守护进程基于socksifier,作为一个shell Unix套接字接口,作为IP6的继电器,或面向TCP的程序重定向到一个串行线。

socat 的主要特点就是在两个数据流之间建立通道;

且支持众多协议和链接方式:ip, tcp, udp, ipv6, pipe,exec,system,open,proxy,openssl,socket等

## socat依赖包

  • 下载最新的
    在这里插入图片描述
    在这里插入图片描述
# 下载 socat rpm 包wget	http://mirror.centos.org/altarch/7/os/armhfp/Packages/socat-1.7.3.2-2.el7.armv7hl.rpm# 安装 socat 依赖包rpm  -ivh socat-1.7.3.2-2.el7.x86_64.rpm

在这里插入图片描述

检查是否安装成功

socat -V

在这里插入图片描述

# 安装 RabbitMQ-server

## 找 rpm 包

要么 在 pkgs.org 上继续找:

在这里插入图片描述

wget	https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/r/rabbitmq-server-3.3.5-34.el7.noarch.rpm

要么在 到 rabbitmq 官网下载

在这里插入图片描述

wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.8.3-1.el7.noarch.rpm/download.rpm

这里官网的最新 用 官网的 (2020年3月10日)

在这里插入图片描述

然后依然是 安装

rpm -ivh rabbitmq-server-3.8.3-1.el7.noarch.rpm

在这里插入图片描述

最后检验是否安装成功

rabbitmqctl version

在这里插入图片描述

CTL是英文ConTroL(控制)的缩写

# Yum 安装

用 yum 安装,先配好 阿里云国内镜像啊 ,不然很慢

## 需要手动安装的依赖

在这里插入图片描述

  • logrotate 貌似不用

### erlang

安装必要环境 erlang

yum install erlang -y

在这里插入图片描述

检查是否安装

erl -version

在这里插入图片描述

### socat

yum install socat -y

在这里插入图片描述

socat -V

在这里插入图片描述

## rabbitmq-server

在这里插入图片描述

# import the new PackageCloud key that will be used starting December 1st, 2018 (GMT)rpm --import https://packagecloud.io/rabbitmq/rabbitmq-server/gpgkey# import the old PackageCloud key that will be discontinued on December 1st, 2018 (GMT)rpm --import https://packagecloud.io/gpg.key# After importing both keys please follow the Package Cloud repository setup instructions.curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bashyum install rabbitmq-server -y

在这里插入图片描述

在这里插入图片描述

检查

rabbitmqctl version

在这里插入图片描述

done(两种安装都介绍完了)

RabbitMQ 启动

rabbitmq常用命令 -

# rabbitmq启动和停止命令

# 设置服务,开机自动启动chkconfig rabbitmq-server on# 建议使用 systemctl enable rabbitmq-server# 启动服务service rabbitmq-server start# 建议使用 systemctl start rabbitmq-server# 停止服务service rabbitmq-server stop# 建议使用 systemctl stop rabbitmq-server

查看状态:rabbitmqctl status

# 启动 rabbitmq 管理界面

# 开启管理界面插件rabbitmq-plugins enable rabbitmq_management

在这里插入图片描述

查看插件打开情况:rabbitmq-plugins list

在这里插入图片描述
关闭监控管理器:rabbitmq-plugins disable rabbitmq_management

# 防火墙打开 15672 管理端口firewall-cmd --zone=public --add-port=15672/tcp --permanentfirewall-cmd --reload

在这里插入图片描述

查看开启的端口

firewall-cmd --zone=public --list-ports
在这里插入图片描述

## 访问

访问服务器的15672端口,例如:

在这里插入图片描述

# 添加用户

# 添加用户rabbitmqctl add_user admin admin

在这里插入图片描述

查看用户:rabbitmqctl list_users

在这里插入图片描述

# 新用户设置用户为超级管理员rabbitmqctl set_user_tags admin administrator# 如果失败了 # 开放 4369 端口– erlang发现端口# firewall-cmd --zone=public --add-port=4369/tcp --permanent# firewall-cmd --reload

在这里插入图片描述

查看用户:rabbitmqctl list_users

在这里插入图片描述

## 设置访问权限

登录:admin

密码:admin

在这里插入图片描述

在这里插入图片描述

  • 用户管理参考

# 开放客户端连接端口

# 打开客户端连接端口firewall-cmd --zone=public --add-port=5672/tcp --permanentfirewall-cmd --reload

主要端口介绍

  • 4369 – erlang发现口
  • 5672 – client端通信口
  • 15672 – 管理界面ui端口
  • 25672 – server间内部通信口

查看开放的端口

firewall-cmd --zone=public --list-ports
在这里插入图片描述

rabbitmq六种工作模式

# 简单模式

RabbitMQ是一个消息中间件,你可以想象它是一个邮局。当你把信件放到邮箱里时,能够确信邮递员会正确地递送你的信件。RabbitMq就是一个邮箱、一个邮局和一个邮递员。

  • 发送消息的程序是生产者
  • 队列就代表一个邮箱。虽然消息会流经RbbitMQ和你的应用程序,但消息只能被存储在队列里。队列存储空间只受服务器内存和磁盘限制,它本质上是一个大的消息缓冲区。多个生产者可以向同一个队列发送消息,多个消费者也可以从同一个队列接收消息.
  • 消费者等待从队列接收消息

在这里插入图片描述

## pom.xml

添加 slf4j 依赖, 和 rabbitmq amqp 依赖

4.0.0
com.tedu
rabbitmq
0.0.1-SNAPSHOT
com.rabbitmq
amqp-client
5.4.3
org.slf4j
slf4j-api
1.8.0-alpha2
org.slf4j
slf4j-log4j12
1.8.0-alpha2
org.apache.maven.plugins
maven-compiler-plugin
3.8.0
1.8
1.8

## 生产者发送信息

package rabbitmq.simple;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class Test1 {
public static void main(String[] args) throws Exception {
//创建连接工厂,并设置连接信息 ConnectionFactory f = new ConnectionFactory(); f.setHost("192.168.64.140"); f.setPort(5672);//可选,5672是默认端口 f.setUsername("admin"); f.setPassword("admin"); /* * 与rabbitmq服务器建立连接, * rabbitmq服务器端使用的是nio,会复用tcp连接, * 并开辟多个信道与客户端通信 * 以减轻服务器端建立连接的开销 */ Connection c = f.newConnection(); //建立信道 Channel ch = c.createChannel(); /* * 声明队列,会在rabbitmq中创建一个队列 * 如果已经创建过该队列,就不能再使用其他参数来创建 * * 参数含义: * -queue: 队列名称 * -durable: 队列持久化,true表示RabbitMQ重启后队列仍存在 * -exclusive: 排他,true表示限制仅当前连接可用 * -autoDelete: 当最后一个消费者断开后,是否删除队列 * -arguments: 其他参数 */ ch.queueDeclare("helloworld", false,false,false,null); /* * 发布消息 * 这里把消息向默认交换机发送. * 默认交换机隐含与所有队列绑定,routing key即为队列名称 * * 参数含义: * -exchange: 交换机名称,空串表示默认交换机"(AMQP default)",不能用 null * -routingKey: 对于默认交换机,路由键就是目标队列名称 * -props: 其他参数,例如头信息 * -body: 消息内容byte[]数组 */ ch.basicPublish("", "helloworld", null, "Hello world!".getBytes()); System.out.println("消息已发送"); c.close(); }}

文章目录

转载地址:https://lawsssscat.blog.csdn.net/article/details/104768116 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:cURL 与 wget:你应该选用哪一个?
下一篇:SpringBoot - MappingJackson2HttpMessageConverter 功能增强:添加 jsonp 请求响应(新)

发表评论

最新留言

路过按个爪印,很不错,赞一个!
[***.219.124.196]2024年04月09日 22时23分09秒