SpringBoot之安装RabbitMQ(踩坑)及RabbitMQ原理和使用详解
安装RabbitMQ
安装环境centos7 + RabbitMQ 3.7.7 + OTP 21.0 Source File
1.安装erlang:
(1).下载: http://www.erlang.org/downloads
(2).安装依赖yum install ncurses-devel
(3).解压tar xf otp_src_21.0.tar.gz
(4).安装目录./configure –prefix=/usr/local/erlang –without-javac
(5)编译make
(6)安装make install
(7)验证安装是否成功
cd /usr/local/erlang/bin/
执行./erl
2.安装rabbitmq
rabbitmq解压即可用
(1)解压xz -d rabbitmq-server-generic-unix-3.7.7.tar.xz
tar xf rabbitmq-server-generic-unix-3.7.7.tar
(2)安装依赖:
yum install python -y
yum install xmlto -y
yum install python-simplejson -y
(3)启动:
cd rabbitmq/sbin/
./rabbitmq-server
正常到这里就完成安装了,但是我的并没有,报错了
踩坑(报错四部曲)
(1)启动报错啊
显示./rabbitmq-server:行85: erl: 未找到命令
解决办法执行
vim /etc/profile
在文件中添加:
ERL_HOME=/usr/local/erlang
export PATH=$PATH:$ERL_HOME/bin
(2)再启动还报错
显示错误如下:
Error description:
init:do_boot/3
init:start_em/1
rabbit:start_it/1 line 450
rabbit:broker_start/0 line 324
rabbit_plugins:prepare_plugins/1 line 289
rabbit_plugins:ensure_dependencies/1 line 263
throw:{error,{missing_dependencies,[crypto,ssl],
[amqp10_client,cowboy,cowlib,rabbitmq_aws,
rabbitmq_management,
rabbitmq_management_agent,rabbitmq_shovel,
rabbitmq_trust_store]}}
解决方法:
应该是缺少依赖,openssl的两个包
看一下自己的Linux下有没有
which openssl
我的里面是有的,显示
/usr/bin/openssl
看一下版本
openssl version
版本有点老,可能是这个原因。
重新安装spenssl
https://www.openssl.org/source/
安装的话就找个教程就完事了
(3)安装完再启动还报错
错误信息:
c
/usr/local/openssl/bin/openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory
其实就是找不到libssl.so.1.1
可以做一个软连接
假如你的libssl.so.1.1 文件在/usr/local/openssl/lib/下面,可以这样做
ln -s /usr/local/openssl/lib/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/openssl/lib/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1
完成后看一下当前版本
openssl version
显示OpenSSL 1.1.0g 2 Nov 2017
然后重启一般就可以了
(4)还报错,和2一样的错误
然而我的还是还是不行,怎么办,重装erlang,
然后启动rabbitmq就好使了。
会看到log
tail -f /usr/local/rabbitmq/var/log/rabbitmq/rabbit@localhost.log
看一下启动起来没有,一般是在5672端口启动的,可以看一下5672端口有没有在监听
netstat -nap | grep 5672
也可以执行
ps -ef | gerp rabbitmq
看RabbitMQ相关的服务有没有启动
关闭RabbitMQ
./rabbitmqctl stop
把rabbitmq-server 写到环境变量中
vim /etc/profile
在文件中写入
export PATH=$PATH:/usr/local/ruby/bin:/usr/local/erlang/bin:/usr/local/rabbitmq/sbin
怎么让RabbitMQ在后台运行:
./rabbitmq-server -detached
RabbitMQ基本原理
讲解基础概念的前面,我们先来整体构造一个结构图,这样会方便们更好地去理解RabbitMQ的基本原理。
通过上面这张应用相结合的结构图既能够清晰的看清楚整体的send Message到Receive Message的一个大致的流程。当然上面有很多名词都相比还没有介绍到,不要着急接下来我们就开始对其进行详细的讲解。
Queue
Queue(队列)RabbitMQ的作用是存储消息,队列的特性是先进先出。上图可以清晰地看到Client A和Client B是生产者,生产者生产消息最终被送到RabbitMQ的内部对象Queue中去,而消费者则是从Queue队列中取出数据。可以简化成表示为:
生产者Send Message “A”被传送到Queue中,消费者发现消息队列Queue中有订阅的消息,就会将这条消息A读取出来进行一些列的业务操作。这里只是一个消费正对应一个队列Queue,也可以多个消费者订阅同一个队列Queue,当然这里就会将Queue里面的消息平分给其他的消费者,但是会存在一个一个问题就是如果每个消息的处理时间不同,就会导致某些消费者一直在忙碌中,而有的消费者处理完了消息后一直处于空闲状态,因为前面已经提及到了Queue会平分这些消息给相应的消费者。这里我们就可以使用prefetchCount来限制每次发送给消费者消息的个数。详情见下图所示:
这里的prefetchCount=1是指每次从Queue中发送一条消息来。等消费者处理完这条消息后Queue会再发送一条消息给消费者。
Exchange
我们在开篇的时候就留了一个坑,就是那个应用结构图里面,消费者Client A和消费者Client B是如何知道我发送的消息是给Queue1还是给Queue2,有没有过这个问题,那么我们就来解开这个面纱,看看到底是个什么构造。首先明确一点就是生产者产生的消息并不是直接发送给消息队列Queue的,而是要经过Exchange(交换器),由Exchange再将消息路由到一个或多个Queue,当然这里还会对不符合路由规则的消息进行丢弃掉,这里指的是后续要谈到的Exchange Type。那么Exchange是怎样将消息准确的推送到对应的Queue的呢?那么这里的功劳最大的当属Binding,RabbitMQ是通过Binding将Exchange和Queue链接在一起,这样Exchange就知道如何将消息准