一、前言
上一篇【分布式消息中间件 - 概述】中,咱们次要介绍了音讯队列(Message Queue,简称MQ)的利用场景和基本原理。MQ是对音讯队列(文章中也叫消息中间件)的统称。业界支流的消息中间件次要有:RabbitMQ、ActiveMQ、Kafka、RocketMQ等。为不便学习,本大节次要通过RabbitMQ作为音讯队列入门级介绍。
二、大纲
- RabbitMQ 原理介绍
- RabbitMQ 装置配置
- RabbitMQ 入门程序
三、内容
1、RabbitMQ原理介绍
官网:https://www.rabbitmq.com/
RabbitMQ是一个Erlang语言开发的基于AMQP协定的开源实现。次要用来暂存并转发**音讯**(Message)。就像一个快递点,能够寄快递,也能够取快递。
其具体特点包含:
- 反对多种语言
- 反对多种协定
- 反对集群部署
- 反对插件扩大
- 高可用性
- ......
其整体架构如图所示:
根底概念:
Message(音讯):由音讯头和音讯体形成 (快递单)
Publisher(音讯生产者):发送音讯到交换器 (发快递)
Exchanger(交换器):接管生产者发送的音讯并路由给服务器队列(发到哪)
Binding(绑定):连贯交换器和音讯队列的路由规定(物流路线)
Queue(音讯队列):音讯容器,用于音讯贮存和转发给消费者(快递代理点)
Connection(网路连贯):如建设一个TCP连贯(打联系电话)
Channel(信道):多路复用的虚构TCP连贯。缩小操作系统TCP的建设和销毁 (快递小哥打你电话)
Consumer(音讯消费者):从队列中获取音讯的客户端应用程序(取快递)
我想,把这个音讯生产和生产的过程比作生存实例 ( 快递 ) 会更容易了解。官网上的介绍绝对简略。而对于开发者来说,能够将它了解为由三局部组成:(请读者认真研读图中标记红色的局部)
2、RabbitMQ装置和配置
(1)材料获取
因为RabbitMQ是基于Erlang语言开发的,因而须要先装置Erlang。为方便使用,(贴心)作者已整顿:
Erlang:
链接:https://pan.baidu.com/s/1a3K8hX0AwqKA0npr2nUttg
提取码:9swp
RabbitMq:
链接:https://pan.baidu.com/s/1Jbtj96GaJaGQb0kj2QDXSQ
提取码:1rkv
(2)装置步骤
- Erlang装置和配置
双击运行otp_win64_23.0.exe文件,
装置时特地留神:装置门路最好不要采纳默认门路,**不要带空格!!!**
- RabbitMQServer装置和配置
同上,这里不再赘述。
- 环境变量配置
RabbitMQ的环境配置具体步骤,读者请参考
转载 :https://www.cnblogs.com/lijiasnong/p/8984493.html
3、RabbitMQ的入门程序
咱们应用Java语言做Demo,模仿音讯队列的两端MsgProducer(音讯生产者)异步发送音讯和MsgConsumer(音讯消费者)接管音讯。
- 新建maven工程
- 增加依赖
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId></dependency>
- 音讯生产者 MsgProducer
package com.example.rabbitmq.mqdemo;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;public class MsgProducer { //音讯队列命名 public static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ //创立连贯工厂 ConnectionFactory factory = new ConnectionFactory(); //设置rabbit mq地址,这里用本机 factory.setHost("localhost"); //创立到代理服务器的连贯 Connection connection = factory.newConnection(); //创立信道 Channel channel = connection.createChannel(); //与音讯队列对接 channel.queueDeclare(QUEUE_NAME,false,false,false,null); //定义公布音讯内容 String msg = "Hello World!"; //公布音讯 channel.basicPublish("",QUEUE_NAME,null,msg.getBytes()); System.out.println(" [x] MsgProducer Send ----------'" + msg + "'"); //敞开资源 // connection.close(); // channel.close(); }}>
- 音讯消费者 MsgConsumer
package com.example.rabbitmq.mqdemo;import com.rabbitmq.client.Channel;import com.rabbitmq.client.Connection;import com.rabbitmq.client.ConnectionFactory;import com.rabbitmq.client.DeliverCallback;public class MsgConsumer { public static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws Exception{ ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); //服务器将队列中异步地向咱们发送音讯,DeliverCallback子类异步回调和缓存音讯 DeliverCallback deliverCallback = (consumerTag, delivery) -> { //接管服务端音讯 String message = new String(delivery.getBody(), "UTF-8"); System.out.println(" [x] MsgConsumer Received ========='" + message + "'"); }; channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { }); }}
- 运行后果
至此,Rabbit初体验根本实现!
【小结】
1、从原理上了解RabbitMQ的作用,重点 P-Q-C 模型了解 异步 的概念;
2、学会利用官网学习新技能
【序幕】
自己职场小白,文章中不免呈现了解不到位或谬误的中央,还望大佬们批评指正。也欢送你评论,留言,点赞!