美文网首页
RabbitMQ 消息队列

RabbitMQ 消息队列

作者: 潜心之力 | 来源:发表于2020-05-12 22:33 被阅读0次

一、Windows 安装

  • 下载erlang,官方地址:http://www.erlang.org/downloads,找到win-64-bit的安装包进行下载安装,安装过程直接选next步骤,自定义安装位置。
  • 配置erlang环境,进入系统高级设置,新建环境变量,变量名:ERLANG_HOME,变量值:D:\Program Files\erl10.7,新建完成后修改环境变量Path,将%ERLANG_HOME%\bin;值追加至原来的Path变量值中。修改完成后打开命令行窗口,输入erl回车,出现版本信息证明安装成功,Eshell V10.7 (abort with ^G)。
  • 下载rabbitmq,官方地址:http://www.rabbitmq.com/download.html,找到标题Downloads on Bintray下的Windows installer,点击进行下载安装,过程同样直接选next步骤和自定义安装位置。
  • 下载RabbitMQ-Plugins,打开命令行窗口,D:,cd D:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.3\sbin,rabbitmq-plugins enable rabbitmq_management,先定位到sbin目录下再执行安装语句。 image.png
  • 测试:进入安装目录sbin,双击rabbitmq-server.bat,访问http://localhost:15672/,账号和密码都是guest,登录成功则所有安装步骤已完成。

二、整合SpringBoot

<dependency> -> pom.xml
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

spring: -> application.yml
  rabbitmq:
    host: 127.0.0.1
    port: 5672
    username: guest
    password: guest

三、交换机模式

1、Direct模式是RabbitMQ默认的交换机模式,创建消息队列的时候绑定一个BindingKey,可以理解为消息队列的名称,生产者发送消息的时候绑定BindingKey,可以理解为将消息发送到指定的队列中,消费者监听队列的时候绑定BindingKey,可以理解为读取指定队列中的消息。直连模式是典型的一对一,当生产者发送一个消息到队列中,只要有任意一个消费者将消息从队列中取出,消息立即被消耗,其他的消费者不会获取到该消息。

@Component
public class RabbitSender { -> 消息生产者,用于发送消息到队列
    @Autowired
    private AmqpTemplate mAmqpTemplate;

    public void message(String msg){
        mAmqpTemplate.convertAndSend("DirectQueue",msg);
    }
}

@Component
@RabbitListener(queues = "DirectQueue")
public class RabbitReceiver { -> 消息消费者,用于接收处理队列中的消息
    @RabbitHandler
    public void message(String msg){
        System.out.println("收到消息:"+msg);
    }
}

@Configuration
public class RabbitConfig { -> 创建消息队列
    @Bean
    public Queue DirectQueue(){
        return new Queue("DirectQueue");
    }
}

2、Topic模式支持按指定规则匹配转发,路由键是一段带有“.”分隔的字符串。#代表匹配一个或多个任意字符,*代表匹配一个任意字符。主题模式是典型的一对多,生产者可以通过指定的规则模糊匹配相关的队列进行消息投递,灵活性高。

@Component
public class RabbitSender {

    @Autowired
    private AmqpTemplate mAmqpTemplate;

    public void message1(String msg){
        mAmqpTemplate.convertAndSend("exchange","topic.queue1",msg);
    }

    public void message2(String msg){
        mAmqpTemplate.convertAndSend("exchange","topic.queue2",msg);
    }
}

@Component
public class RabbitReceiver {

    @RabbitHandler
    @RabbitListener(queues = "topic.queue1")
    public void message1(String msg) {
        System.out.println("message1:" + msg);
    }

    @RabbitHandler
    @RabbitListener(queues = "topic.queue2")
    public void message2(String msg) {
        System.out.println("messages2:" + msg);
    }
}

@Configuration
public class RabbitConfig {

    @Bean
    public Queue topicQueue1() {
        return new Queue("topic.queue1");
    }

    @Bean
    public Queue topicQueue2() {
        return new Queue("topic.queue2");
    }

    @Bean
    TopicExchange exchange() { -> 创建消息交换机
        return new TopicExchange("exchange");
    }

    @Bean
    Binding bindingTopicQueue1(Queue topicQueue1, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessage).to(exchange).with("topic.queue*");
    }

    @Bean
    Binding bindingTopicQueue2(Queue topicQueue2, TopicExchange exchange) {
        return BindingBuilder.bind(queueMessages).to(exchange).with("topic.#");
    }
}

3、Fanout模式是广播,所有绑定到该交换机下的队列都能接收到消息,也就意味着在该模式下BindingKey是会被忽略的。

@Component
public class RabbitSender {

    @Autowired
    private AmqpTemplate mAmqpTemplate;

    public void message3(String msg){
        mAmqpTemplate.convertAndSend("fanoutExchange","",msg); -> 参数2被忽略
    }
}

@Component
public class RabbitReceiver {

    @RabbitHandler
    @RabbitListener(queues = "fanout.queue1")
    public void message1(String msg) {
        System.out.println("message1:" + msg);
    }

    @RabbitHandler
    @RabbitListener(queues = "fanout.queue2")
    public void message2(String msg) {
        System.out.println("messages2:" + msg);
    }

    @RabbitHandler
    @RabbitListener(queues = "fanout.queue3")
    public void message3(String msg) {
        System.out.println("messages3:" + msg);
    }
}

@Configuration
public class RabbitConfig {

    @Bean(name="FanoutQueue1")
    public Queue AMessage() {
        return new Queue("fanout.queue1");
    }

    @Bean(name="FanoutQueue2")
    public Queue BMessage() {
        return new Queue("fanout.queue2");
    }

    @Bean(name="FanoutQueue3")
    public Queue CMessage() {
        return new Queue("fanout.queue3");
    }

    @Bean
    FanoutExchange fanoutExchange() {
        return new FanoutExchange("fanoutExchange");
    }

    @Bean
    Binding bindingFanoutQueue1(@Qualifier("FanoutQueue1") Queue queue,FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }

    @Bean
    Binding bindingFanoutQueue2(@Qualifier("FanoutQueue2") Queue queue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }

    @Bean
    Binding bindingFanoutQueue3(@Qualifier("FanoutQueue3") Queue queue, FanoutExchange fanoutExchange) {
        return BindingBuilder.bind(queue).to(fanoutExchange);
    }
}

四、Windows 集群

简介:集群(cluster)就是一组计算机,它们作为一个整体向用户提供一组网络资源,这些单个的计算机系统就是集群的节点(node)。集群的特点如下:1、可扩展性,集群的性能不仅限于单一的服务实体,新的服务实体也可以动态地加入到集群。2、高可用性,当一台节点服务器发生故障的时候,这台服务器上所运行的应用程序将被另一节点的服务器自动接管。3、负载均衡,把任务均匀地分布到集群环境下的网络资源,以便提高数据吞吐量。

  • 准备好多台计算机或虚拟机,统一安装RabbitMQ和配置以下步骤。
  • 查看节点名称,打开命令行窗口,D:,cd D:\Program Files\RabbitMQ Server\rabbitmq_server-3.8.3\sbin,rabbitmqctl status。回车确定后的第一行信息就能看到节点名称,Status of node rabbit@WINDOWS-OCL0DO8 ...
  • 创建集群配置文件,进入目录C:\Users\Administrator\AppData\Roaming\RabbitMQ,其中AppData是隐藏目录需要手动将其显示,创建文件rabbitmq.config并往里面输入[{rabbit,[{cluster_nodes, ['rabbit@WINDOWS-OCL0DO7', 'rabbit@WINDOWS-OCL0DO8']}]}].(这里的点不要忽略)。
  • 修改hosts配置文件,进入目录C:\Windows\System32\drivers\etc找到hosts并输入192.168.0.87 rabbit@WINDOWS-OCL0DO7、192.168.0.87 rabbit@WINDOWS-OCL0DO8(这里分多行,首行IP必须是当前计算机)。
  • 创建环境变量文件,进入目录C:\Users\Administrator\AppData\Roaming\RabbitMQ,创建文件rabbitmq-env.conf并往里面输入NODENAME=rabbit@WINDOWS-OCL0DO7、NODE_IP_ADDRESS=192.168.0.87、NODE_PORT=5672、RABBITMQ_MNESIA_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\db、RABBITMQ_LOG_BASE=C:\Users\Administrator\AppData\Roaming\RabbitMQ\log(这里分多行,节点名称、IP地址、端口都配置为当前计算机的)
  • 统一.erlang.cookie文件,该文件作为集群的通信密钥。这里要把集群中的计算机分为一主多干,把主计算机中的C:\Users\Administrator\.erlang.cookie文件复制并替换到干计算机中的C:\Users\Administrator\.erlang.cookie文件和C:\Windows\System32\config\systemprofile\.erlang.cookie
  • 重启集群中的干分支
    rabbitmqctl stop_app、rabbitmqctl reset、rabbitmqctl start_app
  • 重启集群中的主分支并纳入干分支
    rabbitmqctl stop_app、rabbitmqctl reset、rabbitmqctljoin_cluster rabbit@WINDOWS-OCL0DO8、rabbitmqctl start_app
  • 注意事项:搭建集群建议最少设置一个磁盘节点以防止机器发生意外丢失数据。rabbitmq有两种类型的节点分别为磁盘和内存,顾名思义就是磁盘节点数据存放在磁盘,安全性高读取效率低,内存节点数据存放在内存,安全性低读取效率高,节点默认的开启方式是磁盘。
  • 集群和分布式的区别:分布式是指通过网络连接的多个组件,集群是指同一种组件的多个实例。
  • 镜像配置,目的是同步消息 mirrow

相关文章

网友评论

      本文标题:RabbitMQ 消息队列

      本文链接:https://www.haomeiwen.com/subject/ifxwnhtx.html