小言_互联网的博客

RabbitMQ实战(一)你看你也行~

398人阅读  评论(0)

最近也是沉迷了一下MQ中间件的知识,决定整理一下并结合所学知识`整理到项目中去
不足之处欢迎留言交流

RabbitMQ介绍

RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务服务模块解耦、异步通信、高并发限流、超时业务、数据延迟处理等。

特点

RabbitMQ除了像兔子一样跑的很快以外,还有这些特点:

  • 开源、性能优秀,稳定性保障
  • 提供可靠性消息投递模式、返回模式
  • Spring AMQP完美整合,API丰富
  • 集群模式丰富,表达式配置,HA模式,镜像队列模型
  • 保证数据不丢失的前提做到高可靠性、可用性

MQ典型应用场景:

  • 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
  • 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
  • 日志处理
  • 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发 - 送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。

AMQP协议和RabbitMQ

提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。

先了解一下AMQP协议中间的几个重要概念:

  • Connection:连接,应用程序与Server的网络连接,TCP连接。

  • Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。

  • Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有PropertiesBody组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。

  • Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的ExchangeQueue

  • Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有directtopicfanoutheaders四种,后面详细介绍。

  • Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。

  • RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。

  • Queue:消息队列,用来保存消息,供消费者消费。

  • ExchangeType 交换机的种类

RabbitMQ消息模型的核心理念是

发布者(producer)不会直接发送任何消息给队列。事实上,发布者(producer)甚至不知道消息是否已经被投递到队列。
发布者(producer)只需要把消息发送给一个交换机(exchange)。交换机非常简单,它一边从发布者方接收消息,一边把消息推送到队列。交换机必须知道如何处理它接收到的消息,是应该推送到指定的队列还是是多个队列,或者是直接忽略消息。这些规则是通过交换机类型(exchange type)来定义的

1. 直接式交换器类型(Direct)

该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey完全匹配的队列中。

2. 主题式交换金类型(Topic)

Topic Exchange:主题式交换器。通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"com."只能匹配到“com.rabbitmq”。

3. 广播式交换机类型(Fanout)

Fanout Exchange:广播式路由键。该类型不处理路由键,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。

4.Headers Exchange

该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。

理论知识了解后就是实战的整合

Linux下安装RabbitMQ

官方文档 :https://www.rabbitmq.com/install-rpm.html
RabbitMQ的安装需要Erlang的基础环境,必须按照RabbitMQ Erlang版本要求进行安装。
版本要求参照官网:https://www.rabbitmq.com/which-erlang.html
Erlang的版本下载地址:https://www.erlangsolutions.com/resources/download.html


下载下来后上传到对应的linux文件内 执行安装命令 :

rpm -ivh esl-erlang_19.3-1_centos_7_amd64.rpm --nodeps --force
安装


想要验证是否安装成功可以输入 erl -version

erl -version

会展示对应的版本号

接着可以安装rabbitmq
软件库:https://dl.bintray.com/rabbitmq/all/rabbitmq-server/

下载后上传 执行命令:

 rpm -ivh rabbitmq-server-3.7.6-1.el6.noarch.rpm  --nodeps --force

没有 --nodeps --force 的话 可能会有问题 加上后执行就好了

出现这种问题:

是mq和erlang版本没对应上
想要验证是否安装成功可以输入:rabbitmq-server


到此基本上rabbitmq的安装结束~
$ chkconfig rabbitmq-server on  # 添加开机启动RabbitMQ服务
$ service rabbitmq-server start # 启动服务
$ service rabbitmq-server status  # 查看服务状态
$ service rabbitmq-server stop   # 停止服务
$ service rabbitmq-server restart   # 重启服务

注意:rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。我们想要远程连接 需要修改配置 让他支持远程访问

# vi  /etc/rabbitmq/rabbitmq.config
{loopback_users, []} 找到loopback_users进行处理

如果rabbitmq.config没找到
可以找到rpm安装的目录文件下的rabbit.app 对其做上面修改

开启web端管理访问 安装管理插件

$ rabbitmq-plugins enable rabbitmq_management


安装好后直接 访问虚拟机:http://port:15672/#/

guest/guest即可登录

我们也可以设置自己的用户:

相应的命令:

[root@VM_0_3_centos eureka]# rabbitmqctl add_user root 123456    //该命令创建一个用户
Adding user "root" ...
[root@VM_0_3_centos eureka]# rabbitmqctl set_user_tags root administrator  //将用户添加为 administrator角色
Setting tags for user "root" to [administrator] ...
[root@VM_0_3_centos eureka]#  service rabbitmq-server restart  //重启 mq
Restarting rabbitmq-server (via systemctl): [  OK  ]
[root@VM_0_3_centos eureka]# rabbitmqctl list_users  //查看用户列表  
Listing users ...
guest   [administrator]
root    [administrator]
[root@VM_0_3_centos eureka]# rabbitmqctl list_permissions -p /         //查看vhost(/)允许哪些用户访问
Listing permissions for vhost "/" ...
root    .*      .*      .*
guest   .*      .*      .*

到此一个MQ的安装部署基本完成

由衷感谢这些文章参考
https://www.cnblogs.com/sgh1023/p/11217017.html
https://blog.csdn.net/bbwangj/article/details/82954097

一起努力吧


转载:https://blog.csdn.net/weixin_38899094/article/details/106212658
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场