4

前言

相信进来的同学之前或多或少都知道一点rabbitmq
本篇博客的意图就是教会大家如何去安装,以及如何在spring下使用rabbitmq

基本概念

来了解下RabbitMQ的成员组件:

broker:消息队列服务器的实体,是一个中间件应用,负责接收生产者的消息,然后将消息发送到消息接受者或者其他broker

exchange:消息交换机,是消息到达的第一个地方,消息通过它指定的路由规则,分发到不同的消息队列中

queue:消息队列,消息通过发送和路由之后最后到达的地方,到达queue的消息即进入逻辑上的等待消费状态。每个消息都会被发送到一个或者多个队列

binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来,也就是exchange和queue之间的虚拟连接

virtual host:虚拟主机,他是对broker的虚拟划分,将消费者、生产者和他们依赖的AMQP相关结构进行隔离,一般都是为了安全考虑,比如我们在一个broker中设置多个虚拟主机,对不同用户进行权限的分离

routing key:路由关键字,exchange根据这个关键字进行消息的投递

connection:连接,代表生产者、消费者、broker之间进行通信的物理网络

channel:消息通道,用于连接生产者和消费者的逻辑结构。在客户端的每个链接里,可可建立多个channel,每个channel代表一个会话任务,通过channel可以隔离连接中的不同交互内容

看下客户端使用rabbitmq的基本流程:

1.消费者连接到消息队列服务器,打开一个channel
2.消费者声明一个exchange,并设置相关属性
3.消费者声明一个queue,并设置相关属性
4.消费者使用routing key,在exchange和queue之间建立绑定
5.生产者投递消息到exchange
6.exchange接收到消息后,根据消息的key和已经设置好的binding,进行消息路由,将消息投递到一个或者多个queue里

安装

rabbitmq是基于erlang实现的,所以在安装rabbitmq之前需要安装erlang
以下都是在centos上进行
博主的erlang版本:erlang-19.0.4-1.el6.x86_64
rabbitmq版本:rabbitmq-server-3.6.10-1.el6.noarch

erlang的安装

erlang下载页面下载自己的erlang版本

下载之后 tar zxvf 解压

cd到解压文件夹

执行./configure --prefix=/erlang命令(保证在系统根目录下存在空erlang文件夹)

安装erlang:make && make install

修改系统环境变量etc/profile,记得source执行

rabbitmq的安装

rabbitmq下载页面下载自己的rabbitmq版本

编译且安装:

rpm --import http://www.rabbitmq.com/rabbitmq-signing-key-public.asc
yum install rabbitmq-server-3.6.0-1.noarch.rpm

命令行使用

查看rabbitmq的安装目录:whereis rabbitmq

cd到rabbitmq根目录下的sbin文件夹下

后台开启rabbitmq:./rabbitmq-server start -detached

关闭:./rabbitmqctl stop

查看交换机、绑定、队列:

./rabbitmqctl list_exchanges 
./rabbitmqctl list_bindings
./rabbitmqctl list_queues

用户管理:(以下操作生效需要重启rabbitmq)

新建用户:./rabbitmqctl add_user username password
删除用户:./rabbitmqctl delete_user username
改密码:./rabbimqctl change_password username newpassword
设置用户角色:./rabbitmqctl set_user_tags username tag
(Tag可以为 administrator,monitoring, management)
开启web管理界面:./rabbitmq-plugins enable rabbitmq_management
(在浏览器地址栏输入:http://127.0.0.1:15672进入)

结合Spring的项目开发

spring和rabbitmq早已整合
接下来博主带大家熟悉如何在spring下使用rabbitmq

首先加入maven依赖:

        <dependency>
            <groupId>org.springframework.amqp</groupId>
            <artifactId>spring-rabbit</artifactId>
        </dependency>

编写RabbitConfig类与rabbitmq进行连接:

@Configuration
public class RabbitConfig {

    @Bean
    public ConnectionFactory connectionFactory() {
        CachingConnectionFactory connectionFactory = new CachingConnectionFactory("106.15.205.155");
        connectionFactory.setUsername("guest");
        connectionFactory.setPassword("guest");
        connectionFactory.setPort(5672);
        return connectionFactory;
    }
}

rabbitmq有很多种模式,博主觉得最常用的还是直连交换机模式(Direct)
编写DirectExchangeConfig配置生成direct交换模式:

//direct直连模式的交换机配置
@Configuration
public class DirectExchangeConfig {

    //直连交换机
    @Bean
    public DirectExchange directExchange(){
        return new DirectExchange("direct");
    }

    //添加两个队列
    @Bean
    public Queue queue1(){
        return new Queue("queue1");
    }
    @Bean
    public Queue queue2(){
        return new Queue("queue2");
    }

    //三个binding将交换机和队列绑定起来
    @Bean
    public Binding binding1(){
        return BindingBuilder.bind(queue1()).to(directExchange()).with("key1");
    }
    @Bean
    public Binding binding2(){
        return BindingBuilder.bind(queue2()).to(directExchange()).with("key2");
    }
    @Bean
    public Binding binding3(){
        return BindingBuilder.bind(queue2()).to(directExchange()).with("key3");
    }
    
}

编写一个消息发布者(Sender):

@Service("sender")
public class Sender {

    @Autowired
    RabbitTemplate rabbitTemplate;

    //direct直连交换机模式
    public void send(String routingKey,String message){
        rabbitTemplate.convertAndSend("direct",routingKey,message);           //第一个值是交换机名 第二个值是routingkey,第三个是内容
    }

}

最后使用controller测试:

@RestController
public class RabbitmqController {

    @Autowired
    Sender sender;

    @RequestMapping("/rabbitmq")
    public String test(){
        try {
            sender.send("key1","Hello World!");
            return "success";
        }catch (Exception e){
            return "error";
        }
    }

}

我们来看下运行结果:

clipboard.png

进入rabbitmq的web管理器:

clipboard.png

可以看到,我们的消息已经成功发送到了指定队列中

以上便是RabbitMQ的安装和基本使用,谢谢阅读!


大叔一枝花
610 声望56 粉丝

Talk is cheap,show me the code


引用和评论

0 条评论