消息中间件——RabbitMQ是什么?

目录

  • 一、MQ简介
  • 二、RabbitMQ 简介
  • 三、RabbitMQ 的安装和配置
    • 1、安装
    • 2、配置
  • 四、spring项目中使用RabbitMQ
    • 1、生产者producer项目 :
    • 2、消费者consumer项目:
  • 五、补充

一、MQ简介

MQ:全称是MessageQueue,消息队列。
在两个系统中间传递消息,从而满足一些业务需求,
消息中间件——RabbitMQ是什么?_第1张图片

它对我们总体架构的作用有:
解耦:提高系统容错性和可维护性
异步:提升用户体验和系统吞吐量
削峰:提高系统稳定性

常用的MQ产品包括Kafka、RabbitMQ和RocketMQ。我们对这三个产品做下简单的比较。

MQ 优点 缺点
Kafka 吞吐量大,性能好,集群高可用 会丢数据,功能单一
RabbitMQ 消息可靠性高,功能全面 吞吐量比较低,消息积累会影响性能
RocketMQ 高吞吐,高性能,高可用,功能全面 客户端只支持JAVA

RabbitMQ有着很高的消息可靠性,所以被广泛应用在金融、银行相关的系统中。

二、RabbitMQ 简介

RabbitMQ 采用 Erlang 语言开发。
RabbitMQ的相关概念:

Broker :接收和分发消息的应用
Virtual host :虚拟主机
Connection : 连接
Channel : 每个线程创建单独的 channel 进行通讯连接,减少建立连接的开销
Exchange : 交换机,message 到达 broker 的第一站
Queue : 队列,消息最终被送到这里等待 consumer 取走
Binding : 设置不同的 routing key ,用于 message 的指定分发

从图中更容易去理解它的概念,
下面是它的结构图:
消息中间件——RabbitMQ是什么?_第2张图片
RabbitMQ 提供了 6 种工作模式:

  • Hello World 简单模式、
  • Work queues、
  • Publish/Subscribe 发布与订阅模式、
  • Routing 路由模式、
  • Topics 主题模式、
  • RPC 远程调用模式(远程调用,不太算 MQ;暂不作介绍)
    消息中间件——RabbitMQ是什么?_第3张图片

三、RabbitMQ 的安装和配置

1、安装

本次安装以CentOS­7的系统为例

1、去官网下载软件包: 有三个文件

erlang­18.3­1.el7.centos.x86_64.rpm 
socat­1.7.3.2­5.el7.lux.x86_64.rpm 
rabbitmq­server­3.6.5­1.noarch.rpm

2、安装Erlang

#安装命令
rpm -ivh erlang-18.3-1.el7.centos.x86_64.rpm

3、安装RabbitMQ包

#安装命令
rpm -ivh socat-1.7.3.2-1.1.el7.x86_64.rpm
#安装命令
rpm -ivh rabbitmq-server-3.6.5-1.noarch.rpm

4、开启管理界面及配置

# 开启管理界面 
rabbitmq-plugins enable rabbitmq_management

# 修改默认配置信息
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app

# 比如修改密码、配置等等,例如:loopback_users 中的 <<"guest">>,修改用户名guest

5、启动命令

# 启动
service rabbitmq-server start 
# 停止
service rabbitmq-server stop 
# 重启
service rabbitmq-server restart 

2、配置

RabbitMQ在安装好后,可以访问链接:http://ip地址:15672,
注意:端口号是15672,
如果使用腾讯云或者阿里云的服务器,一定记得开放 15672端口 否则无法访问。
如果你使用的本地虚拟机,执行关闭防火墙命令

#关闭防火墙
systemctl stop firewalld

访问成功后的界面: (它自带了guest/guest的 用户名和密码)
消息中间件——RabbitMQ是什么?_第4张图片
登录成功后,你可以看到它有6个导航入口。可以在 Admin栏 创建管理自定义用户。
消息中间件——RabbitMQ是什么?_第5张图片
在这里可以创建用户信息:

设置完用户名密码后,在Tags设置用户身份:

1、 超级管理员(administrator) 可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进操作 。
2、 监控者(monitoring) 可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用 情况,磁盘使用情况等)
3、 策略制定者(policymaker) 可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息(上 图红框标识的部分)。
4、 普通管理者(management) 仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
5、 其他(None) 无法登陆管理控制台,通常就是普通的生产者和消费者。

消息中间件——RabbitMQ是什么?_第6张图片
Virtual Hosts配置:

在RabbitMQ中可以虚拟消息服务器Virtual Host,每个Virtual Hosts相当于一个相对独立的RabbitMQ服务器,每个 VirtualHost之间是相互隔离的。
相当于mysql中可以有多个db数据库,每个数据库是独立的,方便业务之间的隔离。

创建Virtual Host:
消息中间件——RabbitMQ是什么?_第7张图片
点击创建好的名字,然后进入Virtual Host管理页面,设置指定的用户去管理这个Virtual Host
消息中间件——RabbitMQ是什么?_第8张图片

四、spring项目中使用RabbitMQ

我在这里只介绍一下跟spring项目的集成,
RabbitMQ可以使用原生Java,也可以集成在SpringBoot中使用。

首先提前准备好两个项目,一个是生产者producer、另一个消费者consumer。

1、生产者producer项目 :

1.在pom文件中 添加RabbitMQ的依赖


        
            com.rabbitmq
            amqp-client
            5.3.0
        
        
            org.springframework.amqp
            spring-rabbit
            2.0.5.RELEASE
        
  

2.配置文件

创建 spring-rabbitmq-producer.xml 文件



    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"/>
    
    <rabbit:admin connection-factory="connectionFactory"/>

    
 
	   
    
    <rabbit:queue id="spring_fanout_queue_1" name="spring_fanout_queue_1" auto-declare="true"/>

    
    <rabbit:queue id="spring_fanout_queue_2" name="spring_fanout_queue_2" auto-declare="true"/>

    
    <rabbit:fanout-exchange id="spring_fanout_exchange" name="spring_fanout_exchange"  auto-declare="true">
        <rabbit:bindings>
            <rabbit:binding  queue="spring_fanout_queue_1"  />
            <rabbit:binding queue="spring_fanout_queue_2"/>
        rabbit:bindings>
    rabbit:fanout-exchange>

    
    <rabbit:template id="rabbitTemplate" connection-factory="connectionFactory"/>

创建:rabbitmq.properties 文件

这个文件中设置连接RabbitMQ的相关信息

	rabbitmq.host=192.168.1.167
	rabbitmq.port=5672
	rabbitmq.username=songpangyu
	rabbitmq.password=123456
	rabbitmq.virtual-host=/pangyu

3.编写Java代码

public class ProducerTest {
    @Autowired
    private RabbitTemplate rabbitTemplate;
 


    @Test
    public void testFanout() {
        this.rabbitTemplate.convertAndSend("spring_fanout_exchange", "", "spring fanout....");
    }

}

2、消费者consumer项目:

创建spring-rabbitmq-consumer.xml

  
    <context:property-placeholder location="classpath:rabbitmq.properties"/>

    
    <rabbit:connection-factory id="connectionFactory" host="${rabbitmq.host}"
                               port="${rabbitmq.port}"
                               username="${rabbitmq.username}"
                               password="${rabbitmq.password}"
                               virtual-host="${rabbitmq.virtual-host}"/>

   
      <bean id="fanoutListener1" class="com.demo.rabbitmq.listener.FanoutListener"/>
 
    <rabbit:listener-container connection-factory="connectionFactory" auto-declare="true">
    
           <rabbit:listener ref="fanoutListener1" queue-names="spring_fanout_queue_1"/>
   rabbit:listener-container>
   

也需要创建:rabbitmq.properties 文件

这个文件中设置连接RabbitMQ的相关信息

	rabbitmq.host=192.168.1.167
	rabbitmq.port=5672
	rabbitmq.username=songpangyu
	rabbitmq.password=123456
	rabbitmq.virtual-host=/pangyu

创建监听类,去消费消息

public class FanoutListener implements MessageListener {
    @Override
    public void onMessage(Message message) {
        //打印消息
        System.out.println(new String(message.getBody()));
    }
}

五、补充

rabbitMQ提供多种工作模式 , 常见的有:

  • Work queues : 多个消费者去轮询消费消息。
  • Publish/Subscribe 发布与订阅模式 : 多个消费者获得相同的消息
  • Routing 路由模式 : 根据routing Key 去全匹配的获取自己的消费
  • Topics 主题模式: routing Key的升级版,它支持通配符。(是工作中最常用的模式)

可以在Exchanges交换机的类型中,选择模式:
消息中间件——RabbitMQ是什么?_第9张图片

RabbitMQ在搭建集群的时候,可以配合HAProxy来完成负载均衡。
HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、 快速并且可靠的一种解决方案。

你可能感兴趣的:(Java,rabbitmq,java,kafka)