springboot消息机制

一、Springboot与消息

前言

  1. 大部分应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力

  2. 消息服务两个重要概念:

    消息代理(message broker)和目的地(destination)

    当消息发送者发送消息后,将由消息代理接管,消息代理保证消息传递到指定目的地

  3. 消息队列主要由两个形式的目的地

    1. 队列(queue):点对点消息通信(point to point)
    2. 主题(topic):发布(publish)/订阅(subscribe)消息通信

在这里插入图片描述
在这里插入图片描述

1.1 JMS&AMQP

java消息服务:(JAVA MESSAGE SERVICE)

-基于JVM消息代理的规范,ActiveMQ、HornetMQ是JMS实现

高级消息队列协议(Advanced Message Queing Protocol)

  • 高级消息队列协议,是一种消息代理的规范,兼容JMS
  • RabbitMQ是AMQP的实现

两者的区别

JMSAMQP
定义java API网络线级协议
跨语言
跨平台
Model提供两种消息模型 1.Peer-2-Peer 2. Pub/sub提供了五种消息模型 1.direct exchange 2.fanout exchange 3.topic change 4.headers exchange 5. system exchange 本质来讲,后四种和JMS的pub/sub模型没有区别
支持消息类型TextMessage、MapMessage、BytesMessage、StreamMessage、ObjectMessage、Message(只有消息头和属性)bytes[] 当实际应用,有复杂的消息,可以将消息序列化后发送
综合评价在java体系中,client均可JMS进行交互定义了wire-level层的协议标准

spring的支持

  • spring-jms提供了对JMS的支持
  • spring-rabbit提供了对AMQP的支持
  • 需要ConnectionFactory的实现来连接消息代理
  • 提供了JmsTemplate、RabbitTemplate来发送消息
  • @ JmsListener(JMS)、@RabbitListener(AMQP)注解方法上监听消息代理发布消息
  • EnableJms、@EnableRabbit开启支持

springboot自动配置

  • JmsAutoConfiguration
  • RabbitAutoConfiguration

二、RabbitMQ的基本介绍

2.1 RabbitMQ简介

是一个由erlang开发的AMQP(Advanved Message Queue Protocol)的开源实现

2.2 核心概念

Message

消息由消息头和消息体组成的。消息体是不透明的,而消息头则由一系列的可选属性组成,

这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

Publisher

消息生产者,也是一个向交换器发布消息的客户端应用程序

Exchange

交换器,用来接受生产者发送的消息并将这些消息路由给服务器中的队列

Exchange有4种类型:

  • direct(默认)
  • fanout
  • topic
  • headers

不同类型的Exchange转发消息的策略有所区别

Queue

消息队列,用来保存消息知道发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走

Binding

绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解为一个由绑定结构的路由表

Exchange和Queue的绑定可以是多对多的关系

Connection

网络连接,比如一个TPC连接

Channel

信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内的虚拟连接,AMQP命令都是通过信道发送出去的,不管是发布消息、订阅队列还是接受消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销,所以引入了信道的概念,以复用一条TCP连接。

Consumer

消息的消费者,表示一个从消息队列中获取消息的客户端应用程序

Virtual Host

虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个vhost本质就是一个mini版的RabbitMQ服务器,拥有自己的队列、交换器、绑定和权限机制。vhost是AMQP概念的基础,必须在连接时指定,RabbitMQ默认的vhost是/。

Broker

表示消息队列服务器实体

在这里插入图片描述

三、RabbitMQ运行机制

AMQP中的消息路由

  • AMQP中消息的路由过程和JAVA开发者熟悉的JMS存在一些差别,AMQP中增加了

    ExchangeBinding的角色。生产者把消息发布到Exchange上,消息最终到达队列并被消费者接受,而Binding决定交换器的消息应该发送到哪个队列

在这里插入图片描述

3.1 Exchange类型

Direct Exchange:点对点操作

在这里插入图片描述

Fanout Exchange:广播发布

在这里插入图片描述

Topic Exchange:模糊匹配机制

在这里插入图片描述

四、SpringBoot整合RabbitMQ

  1. 引入spring-boot-starter-amqp
  2. Application.yml配置
  3. 测试RabbitMQ
    1. AmqpAdmin:管理组件
    2. RabbitTemplate:消息发送处理组件

RabbitMQ自动配置

  1. RabbitAutoConfiguration
  2. 自动配置了连接工厂:ConnectionFactory
  3. RabbitProperties 封装了 RabbitMQ的配置
  4. RabbitTemplate:给Rabbit发送和接受消息的
  5. AmqpAdmin:RabbitMQ系统管理功能组件
spring:
	rabbit:
		host:
		username:
        password:
        port: 5672(默认就是)
		virtual-host: 

如何使用?

public class RabbitMQTest{
    
    @Autowire
    RabbitTemplate rabbit;
    
    //单播(点对点)
    public void contextLoad(){
        //message需要自己构造
        rabbit.send(exchange,routeKey,message);
        
        //需要传入要发送的对象,自动序列化发送给rabbitmq
        //object当做消息体
        rabbit.covertAndSend(exchange,routeKey,object);	
    }
    
    
    //获取发送的消息
    public void getMessage(){
        rabbit.receiveAndConvert(routeKey);
    }
    
    
}

@RabbitListener&@EnableRabbit

用来监听消息队列中的数据发布

@Servie
public class BookService{
    
    @RabbitListener(queues= keyRouter)
    public void receive(Book book){
    	
    }
}


@EnableRabbit //开启基于注解的RabbitMQ模式

AmqpAdmin管理组件的使用

RabbitMQ系统管理功能组件

AmqpAdmin:创建和删除 Queue,Exchange,Binding

@Autowire
AmqpAdmin admin;

public void createExchange(){
    //创建交换机
    ExChange e = new DirectExchange("admin.exchange");
    admin.declareExchange(e);

	//创建队列
    admin.declareQueue(new Queue("ampqAdmin",true));
    
    new Binding("ampqAdmin",Binding.DestinationType.QUEUE,
               "admin.exchange","ampq.haha","你好");
    
    //创建绑定规则
    admin.declareBinding();
}

dmin.declareExchange(e);

//创建队列
admin.declareQueue(new Queue("ampqAdmin",true));

new Binding("ampqAdmin",Binding.DestinationType.QUEUE,
           "admin.exchange","ampq.haha","你好");

//创建绑定规则
admin.declareBinding();

}




















































  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值