SpringBoot(18)之安装RabbitMQ(踩坑)及RabbitMQ原理和使用详解

RabbitMQ安装与集成

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就知道如何将消息准

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值