消息中间件有四个:activiteMq、Kafka、RocketMQ、RabbitMQ
四大消息中间件对比:
activiMq老牌消息中间件,api全面,但是吞吐量不大
Kafaka吞吐量大,但是数据无法保证不丢失,主要面向大数据
rokectMQ:吞吐量大,保证数据不丢失,并且支持分布式事物,但是商业版需要收费
rabbitMQ:吞吐量大,数据不易丢失
RabbitMQ简介
RabbitMQ高性能的原因?
Erlang语言最初在于交换机领域的架构模式,这样使得 RabbitMQ在Broker之间进行数据交互的性能是非常优秀的
Erlang的优点:Erlang有着和原生Socket—样的延迟
RabbitMQ作用(演变过程)
什么是AMQP高级消息队列协议
AMQP定义:
是具有现代特征的二进制协议;
是一个提供统一消息服务的应用层标准高级消息队列协议;
是应用层协议的一个开放标准,为面向消息的中间件设计;
AMQP核心概念(重点)
Server:又称Broker,接受客户端的连接,实现AMQP实体服务
Connection:连接:应用程序与Broker的网络连接
Channel:网络通道,几乎所有的操作都在Channel中进行,Channel是进行消息读写的通道;客户端可建立多个Channel,每个Channel代表一个会话任务;
Message:消息,服务器与应用程序之间传递的数据,由Properties和Body组成。Properties可以对消息进行装饰,比如消息的优先级、延迟等高级特性;Body则就是消息体内容;
Virtual host:虚拟地址,用于进行逻辑隔离,最上层的消息路由;一个Virtual Host里面可以有若干个Exchange和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue;
Exchange:交换机,交换消息,根据路由键转发消息到绑定的队列;
Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key;
Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息
Queue:也称为Message Queue,消息队列,保存消息并将它们转发给消费者
安装和使用
docker pull rabbitmq:management
docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management
访问路径140.143.242.67:15672 5672:应用访问端口;15672:控制台Web端口号
小插曲: 启动过后二次进入启动报错:解决方案
快速入门
重新选择一个新的工作区间和创建一个springboot项目(博客以rabbitmqapi为例)
换了新的工作区间要重新指定maven仓库
导入pom依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
创建生产端和消费端
生产端…(既支付宝微服务)
package com.onlyk.api.rabbitmqapi.quickstart;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* @author only老K 我为自己代言
* @create 2020-03-03 9:32
* @blogaddress https://blog.csdn.net/weixin_44255950
* 相当于支付宝微服务
* 发送消息的。
*/
public class Procuder {
public static void main(String[] args) throws Exception {
//1 创建一个ConnectionFactory, 并进行配置
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("140.143.242.67");
connectionFactory.setPort(5672);
connectionFactory.setVirtualHost("/");
//2 通过连接工厂创建连接
Connection connection = connectionFactory.newConnection();
//3 通过connection创建一个Channel
Channel channel = connection.createChannel();
//4 通过Channel发送数据
for(int i=0; i < 5; i++){
String msg = "Hello RabbitMQ!";
//1 exchange 2 routingKey
channel.basicPublish("", "test001", null, msg.getBytes());
}
channel.close();
connection.close();
}
}
消费端…(既订单微服务)
package com.onlyk.api.rabbitmqapi.quickstart;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @author only老K 我为自己代言
* @create 2020-03-03 9:32
* @blogaddress https://blog.csdn.net/weixin_44255950
*
* 相当于微服务架构中的订单微服务,短信微服务
* 接收消息的。
*/
public class Consumer {
public static void main(String[] args) throws Exception {
//连接MQ服务器
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("140.143.242.67");//设置ip
factory.setPort(5672);//设置端口号 5672是MQ服务的服务端口,而15672是web控制台的端口
factory.setVi