rabbitmq 的简单使用

1. RabbitMQ安装

(1) 什么是RabbitMQ?

(2) 什么是Erlang?

Erlang是一种通用的面向并发的编程语言,它由瑞典电信设备制造商爱立信所辖的CS-Lab 开发,目的是创造一种可以应对大规模并发活动的编程语言和运行环境

(3) 如何在Linux环境中安装RabbitMQ?

1、首先自己创建一个目录,我在usr/local下创建了一个erlang目录,cd到该目录下

2、在这个目录下下载最新版本的erlang,当前版本是20.0

3、下载完后查看目录,

4、解压下载好的文件

5、编译安装Erlang对环境有要求,为防止在编译的时候提示某些软件包未安装之类的错误,所以我将Erlang需要的软件提前安装,直接使用yum进行安装即可。

yum install ncurses ncurses-base ncurses-devel ncurses-libs ncurses-static ncurses-term ocaml-curses ocaml-curses-devel -y

yum install openssl-devel zlib-devel –y

yum -y install make ncurses-devel gcc gcc-c++ unixODBC unixODBC-devel openssl openssl-devel

三条yum命令都执行完之后,开始编译安装erlang

回到我们刚创建的erlang目录下,进到解压完的文件夹内

6、然后再configure 。prefix后面指定的是安装目录,此时我把Erlang安装到了/opt/erlang目录下

./configure --prefix=/opt/erlang --with-ssl -enable-threads -enable-smmp-support -enable-kernel-poll --enable-hipe --without-javac

出现以下内容说明已经配置完毕

7、接下来使用编译命令

make&&make install

到make这一步需要大约10分钟左右。。。

安装完成后做个软连接

ln -s /opt/erlang/bin/erl /usr/local/bin/erl

测试Erlang的安装是否成功:

cd /usr/local/bin

erl

会出现如下的提示信息

Erlang/OTP 20 [erts-9.0] [source] [64-bit] [smp:1:1] [ds:1:1:10] [async-threads:10] [hipe] [kernel-poll:false]

Eshell V9.0 (abort with ^G)

1>

在1>后面输入EvenN = lists:filter (fun (N) -> N rem 2 == 0 end, lists:seq (1,100)).

会出现下面提示信息

[2,4,6,8,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40,42,

44,46,48,50,52,54,56,58|...]

2>

然后输入halt().

到此时说明Erlang已经安装成功,下面我们要修改环境变量。

vim /etc/profile

我们移到最后一行,在这里我们输入以下信息

ERLANG_HOME=opt/erlang

PATH=$ERLANG_HOME/bin:$PATH

export ERLANG_HOME

export PATH

具体效果如下图

然后保存并退出。保存后重新激活使环境变量生效

source /etc/profile

验证是否已经追加成功

echo $ERLANG_HOME

上面命令会显示以下信息

opt/erlang

echo $PATH

上面命令会显示以下信息

opt/erlang/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/lmy/bin

OK,到现在为止我们的Erlang安装完成啦!!

下载最新版的rabbitmq,当前最新版本为3.6.10

还是回到之前在local创建的erlang目录下

使用命令

wget 

在这里使用wget命令的时候,会出现报错信息,显示当前openssl的版本太低,需要进行更新,我们使用命令yum update -y wget,yum完成之后再执行上面的wget命令

查看下载的文件

下载下来的文件名为rabbitmq-server-generic-unix-3.6.10.tar.xz。这里需要注意,下载下来的文件是.xz后缀,我们需要下载安装xz解压软件

使用命令

yum -y install xz

然后解压rabbitmq

xz -d rabbitmq-server-generic-unix-3.6.10.tar.xz

tar -xvf rabbitmq-server-generic-unix-3.6.10.tar

将解压好的文件移动到我的安装目录下去:

mv rabbitmq_server-3.6.10 /opt/

然后进到rabbitmq的sbin目录下

这时候我们有两种启动方式,一种是前台启动,还有一种是后台启动

命令分别是

直接启动 ./rabbitmq-server 
后台启动 ./rabbitmq-server -detached 
开启插件管理页面 ./rabbitmq-plugins enable rabbitmq_management
关闭服务 ./rabbitmqctl stop

在这里我们还需要设置登录的账号和密码

./rabbitmqctl add_user admin 123456

然后设置该用户的类型

./rabbitmqctl set_user_tags admin administrator

再给这个用户设置权限

./rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"

由于我们要使用页面管理,所以需要在启动后开启页面插件,然后关闭防火墙在window中使用ip地址登录

输入刚才设置好的账号和密码进行登录

看到右上角的账号和版本信息,就表示rabbitmq已经成功运行

2. 为什么要用RabbitMQ

(1) 什么要使用RabbitMQ?

异步削峰和解耦

(2) RabbitMQ解决了什么问题?

异步削峰和解耦

3. 消息队列基础讲解

(1) 什么是Provider?

消息的生成者 ,就是投递消息的程序

(2) 什么是Consumer?

消息的消费者,接受消息的程序

(3) 什么是队列?

存放消息的队列,是生产商品和给购买商品的用户之间的中转站

(4) 队列里存储了什么?

在 rabbitMQ 中,信息流从你的应用程序出发,来到 Rabbitmq 的队列,所有信息可以只

存储在一个队列中。队列可以存储很多信息,因为它基本上是一个无限制的缓冲区,前提是

你的机器有足够的存储空间。

(5) 队列和应用程序的关系是什么?

多个生产者可以将消息发送到同一个队列中,多个消息者也可以只从同一个队列接收数

据。

4. 消息队列入门案例-环境搭建

(1) 如果现在项目中使用RabbitMQ需要添加Spring Boot的什么启动器?

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-amqp</artifactId>

</dependency>

(2) 在项目的全局配置文件中需要配置哪些内容?

spring.application.name=springcloud-mq

spring.rabbitmq.host=192.168.70.131spring.rabbitmq.port=5672

spring.rabbitmq.username=oldlu

spring.rabbitmq.password=123456

5. 消息队列入门案例-编码

(1) 创建队列对象的名称是什么?

#error 队列名称

mq.config.queue.error=log.error

(2) 能够发送消息的方法名称是什么?

(3) 监听队列的注解名称是什么?

@RabbitListener

分享/讲解/扩展思考

点名提问从第一节课到最后一节课分别学到了什么,直到同学们把所有的知识点都说出来并且保证无误。

第226次(RabbitMQ)

学习主题:RabbitMQ

学习目标:

对应视频:

对应文档:

对应作业

6. RabbitMQ原理讲解

(1) 什么是交换器?

指定消息队列处理存放消息的

用来接受生产者发送的消息并将这些消息路由给服务器中的队列

(2) 常见的交换器类型有哪些?

1. direct(发布与订阅,完全匹配)

2. Fanout(广播)

3. Topic(主题,规则匹配)

(3) 什么是Routing-key?

路由键.RabbutMQ决定消息该投递到那个队列的规则

队列通过路由键绑定到交换器

消息发送到MQ服务器时,消息将用于一个路由键,即便是空的,RabbitMQ也会将其和绑定使用的路由键进行匹配

 

如果相匹配,消息将会投递到该队列

如果不匹配.消息将会进入黑洞

(4) 什么是Channel?

信道

1. Channel中文叫做信到 是TCP里面的虚拟连接.例如.电缆相当于TCP.信道是一个独立光纤束,一条TCP连接上创建多条信道是没有问题的

2. TCP一旦打开,就会创建AMQP信道

3. 无论是发布消息,接受消息,订阅队列,这些动作都是通过信道完成的

(5) 交换器与队列的关系是什么?

交换器是通过路由键和队列绑定在一起的,如果消息拥有的路由键跟队列和交换器的路由键相匹配,那么雄安锡就会路由器绑定到该队列中

也就是说,消息到队列的过程中,消息首先会经过交换器,接下来交换器在通过路由键匹配分发消息到具体的队列中

(6) RabbitMQ为什么需要信道?为什么不使用TCP协议直接通信

1. TCP的创建和销毁开销特别大,创建需要3次握手,销毁需要4次分手

2. 如果不用信道,那应用程序就会以TCP连接Rabbit,高峰时每秒成千上万连接会造成资源巨大的浪费,而且操作系统每秒处理TCP连接数也是有限制的,必定造成性能瓶颈

3. 信道的原理是一条线程一条通道,多条线程多条通道同用一条TCP链接.,一条TCP链接可以容纳无限的信道,即使每秒成千上万的请求也不会成为性能的瓶颈

7. Direct交换器-搭建环境

(1) 什么是Direct交换器?

(2) 如何在全局配置文件中配置交换器名称?

#设置交换器的名称
mq.config.exchange=log.direct

#info队列名称
mq.config.queue.info=

#info路由键
mq.config.queue.info.routing.key=log.info.routing.key

#error队列名称
mq.config.queue.error=log.error

#error路由键
mq.config.queue.error.routing.key=log.error.routing.key

(3) 如何在全局配置文件中配置队列名称?


#error队列名称
mq.config.queue.error=log.error

(4) 如何在全局配置文件中配置路由键?

#error路由键
mq.config.queue.error.routing.key=log.error.routing.key

8. Direct交换器-编写消费者

(1) @RabbitHandler的作用是什么?

将消息进入队列时会触发注解下的方法 消息队列监听机制

(2) @RabbitListener注解中的bindings属性的作用是什么?

绑定队列

(3) @QueueBinding注解中的value属性的作用是什么?

绑定队列的名称

(4) @QueueBinding注解中的exchange属性的作用是什么?

配置交换器

(5) @QueueBinding注解中的key属性的作用是什么?

设置路由键

(6) @Exchange注解中的value属性的作用是什么?

为交换器起个名称

(7) @Exchange注解中的type属性的作用是什么?

指定具体的交换器类型

9. Direct交换器-编写生产者

(1) AmqpTemplate中的converteAndSend(arg0,arg1,arg2)中的三个参数分别表示什么含义?

Arg0: 交换器名称

Arg1: 路由键

Arg2: 消息

10. Topic交换器-搭建环境

(1) 什么是Topic交换器?

类似模糊匹配机制的交换器

11. Topic交换器-编写消费者

(1) 如何在消息消费者的注解中指定交换器与路由规则?

/**
* 消息接受者
* @author Administrator
* @RabbitListener Bingings:绑定队列
* @QueueBinging value:绑定队列的名称
* exchange:配置交换器
* @Queue value:配置队列名称
* autoDelete:是否是一个可删除的临时队列
* @Exchange value:为交换器起个名称
* type:指定具体的交换器类型
*
*
*/

@Component
@RabbitListener(
bindings = @QueueBinding(
value = @Queue(value = "${}",autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.TOPIC),
key = "*."

)
)
public class InfoReceiver {

/*
* 采用消息队列监听模式
* */
@RabbitHandler
public void receive(Object msg){
//向消息队列发送消息
//参数一:交换器名称。
//参数二:路由键
//参数三:消息
System.out.println("接受 info 信息"+msg);
}
}

12. Fanout交换器-搭建环境

(1) 什么是Fanout交换器?

类似于订阅广播机制的交换器

13. 什么是服务注册中心

(1) 什么是服务的注册中心?

服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者url串,路由信息等,服务注解中心是SOA架构中最基础的设施之一

(2) 服务的注册中心的作用是什么?

1. 服务的注册

2. 服务的发现

(3) 常见的注册中心有哪些?

1. Dubbo的注册中心Zookeeper

2. Springcloud的注册中心Eureka

14. 注册中心解决了什么问题

(1) 注册中心主要解决了什么问题?

1. 服务管理

2. 服务的依赖关系管理

15. 什么是Eureka注册中心

(1) 什么是Eureka注册中心?

Eureka是Netflix开发的服务发现组件,本身是一个基于Rest的服务,Spring Cloud将它集成在其项目 sprin-cloud-netflix中,以实现Spring Cloud的服务注册于发现,同时还提供了负载均衡,故障转移等能力

(2) Eureka注册中心有几种角色?每种角色的代表什么?

1. Eureka Server

通过Register,Get,Renew等接口提供服务的注册和发现

2. Application Service(Service Provider)

服务提供方

把自身的服务实例注册到Eureka Server中

3. Application Client(Service Consumer)

服务调用方

通过Eureka Server获取服务列表 ,消费服务

posted @ 2020-05-21 23:38  koala_dz  阅读(201)  评论(0编辑  收藏  举报