MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。

优点
时效性较强,可以立即得到结果
问题
微服务间基于Feign的调用就属于同步方式,存在一些问题。
异步调用常见实现就是事件驱动模式
优点:
缺点:
下载
docker pull rabbitmq:3-management
运行
docker run -e RABBITMQ_DEFAULT_USER=hzy -e RABBITMQ_DEFAULT_PASS=123456 --name mq --hostname mq1 -p 15672:15672 -p 5672:5672 -d rabbitmq:3-management
控制台

运行原理和结构
channel: 操作MQ的工具
exchange:路由消息到队列中
queue:缓存消息
virtual host:虚拟主机,是对queue、exchange等资源的逻辑分组,用来隔离和管理多租户环境
创建连接
- ConnectionFactory factory = new ConnectionFactory();
- // 设置连接参数
- factory.setHost("127.0.0.1");
- factory.setPort(5672);
- factory.setVirtualHost("/");
- factory.setUsername("admin");
- factory.setPassword("admin");
-
-
- Connection connection=factory.newConnection();
- Channel channel=connection.createChannel();
-
- String queueName="test001";
- channel.queueDeclare(queueName,false,false,false,null);
生产者
- // 发送信息
- String message="hello,rabbitmq";
- channel.basicPublish("", queueName, null, message.getBytes());
- System.out.println("send message is:"+message);
- // 关闭资源
- channel.close();
- connection.close();
消费者
- channel.basicConsume(queueName,true,new DefaultConsumer(channel){
- @Override
- public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException{
- String message=new String(body,"UTF-8");
- System.out.println("收到消息:"+message);
- }
- });
发布订阅(Publish、Subscribe),又根据交换机类型不同分为三种:
是基于最基础的消息队列模型来实现的,只包括三个角色:
publisher:消息发布者,将消息发送到队列queue
queue:消息队列,负责接受并缓存消息
consumer:订阅队列,处理队列中的消息