美文网首页
消息中间件——RabbitMQ 学习

消息中间件——RabbitMQ 学习

作者: 浪漫宇宙与人间日常 | 来源:发表于2018-11-11 17:46 被阅读0次

    许多互联网大厂都是使用rabbitmq作为消息中间件

    1. 优点

    • 开源,性能优秀、稳定

    • 使用底层Erlang语言(常用于开发交换机)开发

    • 与spring AMQP 完美结合,api丰富

    • 丰富的集群模式 镜像队列模式 ha模式

    • 高可用、高可靠

    2. 核心概念

    - Server

    又叫做broker,接受客户端连接,实现AMQP实体服务

    - Connection

    连接,应用程序与Broker的网络连接

    - Channel

    网络信道 消息读写的通道 客户端可建立多个信道,每个信道代表一个会话

    - Message

    服务器和应用程序之间的传送的数据,由properties(对消息进行修饰,比如消息的优先级、延迟等)和body(消息体内容)组成,

    - virtual host

    虚拟地址,进行逻辑隔离一个虚拟地址上面会有多个exchange和queue,但不能有相同的名称的exchange 和queue

    - Exchange

    交换机,接收消息,根据路由键转发消息到绑定队列

    - binding

    exchange和queue的虚拟连接,其中包含routing key(路由规则)

    -routing key

    路由规则

    - queue

    消息队列,保存消息,转发给消费者

    消息流转过程

    消息生产者通过传入消息并且带着交换机1(e1)和路由规则1(rk1),消息进入交换机e1,它下面有三个消息队列1、2、3,它们分别对应路由键123,456,789,然后根据传入的路由匹配它下面路由规则为123的消息队列,把消息传入,最终别消息消费者使用。

    3. rabbitmq安装(快速使用docker)

    docker 命令如下

    docker run -d --hostname my-rabbit --name sven-rabbit -p 15672:15672 -p 5672:5672 rabbitmq:3-management
    

    其中5672端口是rabbitmq生产和消费端口,而15672是后台管理端口

    4. rabbitmq简单使用

    结合springboot简单使用rabbitmq

    4.1. 加入rabbitmq的依赖

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

    4.2. 配置文件的编写

    spring:
      rabbitmq:
        addresses: 127.0.0.1:5672
        username: guest
        password: guest
        virtual-host: /
    

    4.3. 编写消息生产者类

    package com.sven.springwx.rabbitmq;
    
    import com.sven.springwx.domain.Order;
    import org.springframework.amqp.rabbit.connection.CorrelationData;
    import org.springframework.amqp.rabbit.core.RabbitTemplate;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    /**
     * [一句话功能简述]
     * [功能详细描述]
     *
     * @author Vagrant
     * @version [版本号, 2018/11/11 16:58]
     * @email Vagrant/3197544360@qq.com
     * @see [相关类/方法]
     * @since [springwx]
     */
    @Component
    public class OrderSender {
    
        @Autowired
        private RabbitTemplate rabbitTemplate;
    
        public void send(Order order) throws Exception{
            CorrelationData correlationData = new CorrelationData();
            correlationData.setId(order.getMessageId());
            rabbitTemplate.convertAndSend("order-exchange","order.adc",order,correlationData);
        }
    }
    
    

    4.4.里面需要使用到Order实体类

    package com.sven.springwx.domain;
    
    import java.io.Serializable;
    
    /**
     * 订单实体类
     *
     * @author Vagrant
     * @version [版本号, 2018/11/11 16:46]
     * @email Vagrant/3197544360@qq.com
     * @see [相关类/方法]
     * @since [springwx]
     */
    public class Order implements Serializable {
    
        private static final long serialVersionUID = -8933062185819007753L;
        private String id;
    
        private String name;
    
        private String messageId;
    
        public Order() {
        }
    
        public Order(String id, String name, String messageId) {
            this.id = id;
            this.name = name;
            this.messageId = messageId;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getMessageId() {
            return messageId;
        }
    
        public void setMessageId(String messageId) {
            this.messageId = messageId;
        }
    }
    
    

    需要对其实现序列化接口

    4.5.然后通过测试类,测试

    package com.sven.springwx.rabbitmq;
    
    import com.sven.springwx.domain.Order;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.test.context.SpringBootTest;
    import org.springframework.test.context.junit4.SpringRunner;
    
    import java.util.UUID;
    
    import static org.junit.Assert.*;
    
    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class OrderSenderTest {
    
        @Autowired
        private OrderSender orderSender;
    
        @Test
        public void send() {
            Order order = new Order();
            order.setId("20180909898989");
            order.setName("测试订单");
            order.setMessageId(System.currentTimeMillis() +"$"+ UUID.randomUUID().toString());
            try {
                orderSender.send(order);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    最后可以通过rabbit后台看到如下:


    rabbitmq后台队列

    下篇会简单介绍消息消费者如何消费,关于docker相关可以搜索我的简书博客地址 https://www.jianshu.com/u/10ac2b004fcc 的docker相关文章。

    相关文章

      网友评论

          本文标题:消息中间件——RabbitMQ 学习

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