Spring Boot 20天入门(day9)

Springboot与消息

AMQP

Advanced Message Queuing Protocol 高级消息队列协议,是面向消息中间件提供的应用层协议。 基于此协议的消息提供者和接受者可实现消息的交互传递,且不受平台语言限制。

消息队列

消息Message是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂,可能包含嵌入对象。

消息队列Message Queue是一种应用间的通信方式,消息发送后可以立即返回,由消息系统来确保消息的可靠传递。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。

消息队列的应用场景

1)、系统解耦:

系统间通过MQ传递消息,而无需关系其他业务的处理

2)、流量削峰:

MQ可以缓解服务器压力,比如MySQL一次只能处理2000条sql,但是在流量高峰期同时有5000个请求进来,也就是5000条sql,通过MQ接收5000条请求,但是实际发送给sql执行的请求只有2000个。

3)、日志处理:

复杂的系统架构必然需要处理大量日志,MQ可以传输日志

4)、广播:

在分布式系统中,可以通过MQ将消息广播给各个节点。

MQ概念模型

消费者(订阅者)订阅某个消息队列,发布者(生产者)发布消息给对应消息队列,最后由消费者消费。

img

RabbitMQ

什么是RabbitMQ

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

RabbitMQ基本概念

先来看下RabbitMQ的内部结构图:

img

RabbitMQ主要设计以下概念:

  • Message消息:消息即需要发送的数据,由消息体和消息头组成。消息体是消息的内容,消息头则是对消息体的描述。由许多的Property属性组成,如路由键,优先级,持久化等等。
  • Producer(Publisher)生产者: 生产者即发布者,它是发布消息的一方,可以是一个RabbitMQ的客户端应用程序。
  • Consumer(Subscriber)消费者:消费者即订阅者,它是接收消息的一方,可以是一个RabbitMQ的客户端应用程序。
  • Exchange交换机:交换机用户接收消息,并将消息按照路由规则转发给指定的消息队列
  • Binding绑定:绑定一种规则,它将Exchange交换机与Queue消息队列按照路由规则绑定起来。
  • Routing-Key路由键:路由键即路由规则,Exchange交换机根据Producer发送过来的Routing Key将消息转发到指定的消息队列
  • Queue消息队列:消息队列是一个消息容器,本质是一个先进先出的队列,用户存储消息和发送消息,一个消息可以投递到多个消息队列,一个消息队列也可以被多个消费者读取。
  • Connection网络连接:无论是发布消息还是消费消息,都需要通过TCP连接来完成
  • Channel管道:每一次的TCP连接都要消耗一部分网络资源,对于计算机服务器来说,网络是非常宝贵的资源,如果每次发布/订阅消息都需要建立一次链接的话,就太耗费网络资源了,于是引入的Channel管道的概念。每次发布/订阅消息,都由管道来完成而多个管道又可以共享一条TCP连接,这样就节省了很多的网络资源。
  • Virtual Host 虚拟主机: 虚拟主机是一个虚拟概念。 在Redis中,一个Redis服务器实例可以被分为16个库,但不是说这16个库的大小就是相等的, 比如1个库也可以占9g内存,其他15个库可以共占1g内存。 虚拟主机也是如此,它可以看做是一个独立的rabbitmq服务器实例, 它包含了属于他的一系列的Exchange,Queue等内容。
  • Broker: Broker即RabbitMQ服务实例。

Rabbit的工作模型

建议大家去RabbitMQ的官网进行学习,官网多个语言的例子。

RabbitMQ主要有5种工作模型:

在这里插入图片描述

简单模式

它是最简单的消息收发模型,生产者和消费者直接通过Queue进行消息的收发。

(P) -> [|||] -> (C)

工作模式

工作模式与简单模式相似,但是工作模式支持多个消费者竞争同一个消息队列。

img

发布/订阅模式

发布订阅模式是真正意义上的RabbitMQ工作模型,发布者不会直接将消息发送到队列上,而是发送给交换机,由交换机把消息广播到绑定的每个队列上,订阅者也只需要监听它自己的队列就行了。

img

Routing(direct)路由模式

RabbitMQ路由模式

发布者在发布消息的时候可以指定一个路由键(Routing key) 接收者也会与消息队列绑定一个路由键。当消息被发送到 交换机(Exchange)时,交换机会根据路由键,将消息发送到拥有相同路由键的消息队列中。

主题模式(topic)

主题模式是一种特殊的路由模式, 与路由模式不同的是: 主题模式的路由键支持通配符,可以做到更加多样化的路由键匹配。

RabbitMQ主题模式

RabbitMQ Exchange的类型

RabbitMQ共有3种Exchange类型:

  1. fanout: fanout即发布者 / 订阅者模式,发布者将消息发送到fanout类型的Exchange,Exchange再将消息广播给与此交换机绑定的Queue。
  2. direct: direct即路由模式,Exchange根据Routing Key,将消息发送到匹配的队列中。
  3. topic: topic也属于路由模式,不过它支持"*","#"等通配符进行路由。

Springboot整合rabbitmq

引入依赖

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

配置RabbitMQ

spring.rabbitmq.host=47.93.116.82
spring.rabbitmq.port=5672
spring.rabbitmq.username=weleness
spring.rabbitmq.password=a8761797
spring.rabbitmq.connection-timeout=15000ms

发布消息

 @Autowired
    RabbitTemplate rabbitTemplate;

    @Autowired
    AmqpAdmin amqpAdmin;

  
    @Test
    void contextLoads() {
        Map<String, Object> map = new HashMap<>();
        map.put("msg", "这是第一个消息");
        map.put("data", Arrays.asList("helloword", 123, true));
                                     //交换器,消息队列,消息
        rabbitTemplate.convertAndSend("exchange.direct", "weleness.news", map));
    }

接收消息

    @Test
    public void receive() {
        Object o = rabbitTemplate.receiveAndConvert("weleness.news");
        System.out.println(o.getClass());
        System.out.println(o);
    }

使用监听器异步监听消息队列

@Service
public class BookService {

    @RabbitListener(bindings = @QueueBinding(
            exchange = @Exchange("exchange-redirect"),
            key = "weleness",
            value = @Queue("weleness.news")
    ))
    @RabbitListener(queues = "weleness.news")
    public void receive(Book book) {
        System.out.println(book);
    }
}

猜你喜欢

转载自blog.csdn.net/WXZCYQ/article/details/106416291