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 http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.10/rabbitmq-server-generic-unix-3.6.10.tar.xz
在这里使用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
学习目标:
对应视频:
http://www.itbaizhan.cn/course/id/85.html
对应文档:
无
对应作业
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=http://log.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 = "${http://mq.config.queue.info}",autoDelete = "true"),
exchange = @Exchange(value = "${mq.config.exchange}",type = ExchangeTypes.TOPIC),
key = "*.http://login.info"
)
)
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获取服务列表 ,消费服务