RabbitMQ轻量级、易于在本机和云服务器中部署的开源消息代理和队列服务器 。它支持多种消息传递协议。可以部署在分布式和集群配置中,以满足高规模,高可用性要求。
1、安装rabbitmq容器
docker search rabbitmq
说明:
rabbitmq:3-management 带有web控制台管理界面
rabbitmq:latest 则是不带web控制台的,黑皮人在开始时采用该镜像折腾了很久
安装指令:
docker run -d –name myrabbitmq -p 5672:5672 -p 15672:15672 docker.io/rabbitmq:3-management
curl localhost:15672 如有正常html页面返回则表示安装成功。
登入后台管理
PS:请记得开通云服务器后台端口或者使用ssh隧道连接服务器
默认账户名:guest密码:guest
2、rabbitmq Exchange模式fanout,direct,topic介绍
简介:
PS:以下exchange详解原文https://blog.csdn.net/chendaoqiu/article/details/48440633
说明:
RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较。
一.Direct Exchange
RabbitMQ中,所有生产者提交的消息都由Exchange来接受,然后Exchange按照特定的策略转发到Queue进行存储 RabbitMQ提供了四种Exchange:fanout,direct,topic,header header模式在实际使用中较少,本文只对前三种模式进行比较。 一.Direct Exchange
任何发送到Direct Exchange的消息都会被转发到RouteKey中指定的Queue。
1.一般情况可以使用rabbitMQ自带的Exchange:””(该Exchange的名字为空字符串,下文称其为default Exchange)。
2.这种模式下不需要将Exchange进行任何绑定(binding)操作
3.消息传递时需要一个“RouteKey”,可以简单的理解为要发送到的队列名字。
4.如果vhost中不存在RouteKey中指定的队列名,则该消息会被抛弃。
二.Fanout Exchange
任何发送到Fanout Exchange的消息都会被转发到与该Exchange绑定(Binding)的所有Queue上。
1.可以理解为路由表的模式
2.这种模式不需要RouteKey
3.这种模式需要提前将Exchange与Queue进行绑定,一个Exchange可以绑定多个Queue,一个Queue可以同多个Exchange进行绑定。
4.如果接受到消息的Exchange没有与任何Queue绑定,则消息会被抛弃。
三.Topic Exchange
任何发送到Topic Exchange的消息都会被转发到所有关心RouteKey中指定话题的Queue上
1.这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(RouteKey),Exchange会将消息转发到所有关注主题能与RouteKey模糊匹配的队列。
2.这种模式需要RouteKey,也许要提前绑定Exchange与Queue。
3.在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个RouteKey为”MQ.log.error”的消息会被转发到该队列)。
4.“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
5.同样,如果Exchange没有发现能够与RouteKey匹配的Queue,则会抛弃此消息。
3、spring boot demo开发
通过https://start.spring.io/ 创建项目,只需选择rabbitmq即可,为调试方便添加了个web模块。
项目启动后,因个人习惯配置文件修改为yml格式,同时添加配置参数:
spring:
rabbitmq:
host: 149.129.123.134
port: 5672
virtual-host: /
username: guest
password: guest
publisher-confirms: true
publisher-returns: true
template:
mandatory: true
消息发送组件:
@Component
public class MessageSender {
@Autowired
private RabbitTemplate rabbitTemplate;
public boolean send(String exchange, String routeKey, Object message) {
boolean result = rabbitTemplate.invoke(operations -> {
rabbitTemplate.convertAndSend(
exchange,
routeKey,
message
);
return rabbitTemplate.waitForConfirms(10 * 1000);
});
return result;
}
}
消息接收组件:
@Component
public class MessageListener {
/**
* fanout exchange 模式消息接收
* @param message
* @param channel
* @param tag
*/
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue(value = MessageExchangeKey.QUEUE_FANOUT_TEST, durable = "true"),
exchange = @Exchange(value = MessageExchangeKey.EXCHANGE_FANOUT_TEST, durable = "true", type = ExchangeTypes.FANOUT)
)
})
public void testMessageFANOUTListener(Object message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
System.out.println(String.valueOf(message));
}
/**
* direct exchange 模式消息接收
* @param message
* @param channel
* @param tag
*/
@RabbitListener(bindings = {
@QueueBinding(
value = @Queue(value = MessageExchangeKey.QUEUE_DIRECT_TEST, durable = "true"),
exchange = @Exchange(value = MessageExchangeKey.EXCHANGE_DIRECT_TEST, durable = "true", type = ExchangeTypes.DIRECT),
key = MessageExchangeKey.KEY_DIRECT_TEST
)
})
public void testMessageDierctListener(Object message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
System.out.println(String.valueOf(message));
}
}
在控制器中发送消息:
@Controller
public class MessageController {
@Autowired
MessageSender messageSender;
@RequestMapping(value = "/messageTest", method = RequestMethod.GET)
@ResponseBody
public String messageFanoutTest() {
//fanout exchange 消息发送
messageSender.send(MessageExchangeKey.EXCHANGE_FANOUT_TEST, "", "hello happiren, fanout test and there can be a Object"); //该消息需要绑定exchange,但是不要routerkey
//direct exchange 消息发送
messageSender.send(MessageExchangeKey.EXCHANGE_DIRECT_TEST, MessageExchangeKey.KEY_DIRECT_TEST, "hello happiren, direct test and there can be a Object"); //direct 消息,该消息可以不需要绑定exchange,但是需要routerKey
return "hello,demo of rabbitmq written by happiren";
}
}
测试:
运行项目,浏览器访问:http://localhost:8080/messageTest 即可通过控制台查看打印的消息。
以下是spring boot完整的rabbitmq demo工程下载地址和github地址:
enjoy @happiren!