许多互联网大厂都是使用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后台看到如下:
下篇会简单介绍消息消费者如何消费,关于docker相关可以搜索我的简书博客地址 https://www.jianshu.com/u/10ac2b004fcc 的docker相关文章。