学习目录
文章目录
1.RabbitMQ简介
RabbitMQ是采用(Erlang)语言实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库(来自百度百科)
2.什么是消息中间件
消息中间件是指用利用高效可靠的消息传递机制进行与平台无关的数据交流,基于数据通信来进行分布式系统的集成,通过提供消息传递和消息排队模型,它可以在分布式系统下扩展进程间的通信,它的传递方式有两种,点对点(P2P) ,发布(Pub)/订阅(Sub)模式。
点对点模式:基于队列,生产者发送消息到队列,消费者从队列中接受到消息,队列的存在使得消息的异步传输成为可能。
发布订阅模式:发布订阅定义了一个向内容节点发布和订阅信息,这个内容节点叫主题(topic),我们可以理解为是消息传递的中介,发布者将消息发布到主题上,订阅者从主题中订阅消息,主题使得发布者和订阅者不接触的情况下进行传输消息两者保持独立,还可以在一对多的广播时采用此模式。
3.消息中间件作用
作用:解耦,存储,扩展性,削峰,可恢复性,顺序保证,缓冲,异步通信。
4.RabbitMQ起源
1983的时候,有个印度哥们Vivek Ranadive就设想了一种通用软件总线,采用发布订阅的模式,像主板上的总线一样供其他相应程序接入。随后它创办了一家公司 “Teknekron”,世界上第一个现代消息队列软件The Information Bus(TIB),后来这家公司变成了目前依旧是收费EAI中间件的重要厂商Tibco,TIB受到了企业的欢迎,Teknekron的业务发展引起了当时最牛气的IT公司IBM的注意,于是他们一开始研发了自己消息队列软件,于是才有了后来的wesphere mq,后来微软也加入了战团,但是。只至接近2000年的时候,互联网时代已经初见曙光,地球上的应用程序得到了极大地丰富,对于程序之间互联互通的需求越来越强烈,但是各大IT列强们还是牢牢建立着各种技术壁垒,保证自己的商业利益,消息中间件依旧是大型企业能够用的起及用得到的高级玩意。但是时代的洪流不可逆转,有壁垒就有打破壁垒的后来者,2001年sun发布了jms技术,试图在各大厂商的层面上再包装一层统一java的规范。java程序只需要针对jms api编程就可以了,不需要关注使用了什么样的消息中间件,但是jms仅仅适用于java。2004年AMQP(高级消息队列协议)诞生了,才是真正促进了消息队列的繁荣发展,任何人都可以针对AMQP的标准进行编码,并和实现了AMQP的中间件供应商进行通信。有了好的协议指导,互联网分布式应用的迅猛发展才是消息中间件一飞冲天的最大动力,程序应用的互联互通,发布订阅,最大契合了消息中间件的最初的设计初衷。除了刚才介绍过的收费中间件,开源消息中间件的层出不穷,常见比较流行的有ActiveMQ RabbitMQ、ZeroMq 、Kafak、阿里的RocketMQ,在当今世界的互联网应用中消息队列中间件基本上成为标配(详细介绍)
5.RabbitMQ安装(Centos7)
我采用Centos系统下安装RabbitMQ,其他系统大家自行百度。
RabbitMQ是使用Erlang语言开发的,我们先来安装下Erlang环境,再来安装RabbitMQ。
下面命令大家记得进入root用户来执行
1:下载erlang solution wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm 2:安装erlang rpm -Uvh erlang-solutions-1.0-1.noarch.rpm yum install epel-release yum install erlang 3:下载rabbit wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm 4:安装rabbit yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm 5:开启远程访问(非必须) vi /etc/rabbitmq/rabbitmq.config [{rabbit, [{loopback_users, []}]}]. 6:开启web端管理访问(配合上面使用) rabbitmq-plugins enable rabbitmq_management 7:安装消息延迟插件 cd /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.6/plugins wget https://dl.bintray.com/rabbitmq/community-plugins/rabbitmq_delayed_message_exchange-0.0.1.ez rabbitmq-plugins enable rabbitmq_delayed_message_exchange 8:放行端口 打开15672端口 firewall-cmd --add-port=15672/tcp --permanent 打开5672端口 firewall-cmd --add-port=5672/tcp --permanent 9:启动 完成后启动服务: service rabbitmq-server start 可以查看服务状态: service rabbitmq-server status rabbitmq-plugins enable rabbitmq_management 访问rabbitmq curl http://localhost:15672
6.Hello World
我们先简单的写一个生产者传递消息("Hello world"),消费者接收的案例。
maven项目导入依赖,不是maven项目下载jar包:点我下载
<!-- rabbitmq --> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.4.3</version> </dependency>
生产者代码
public class RabbitmqProducer { /** * @EXCHANGE_NAME 交换机名称 * @ROUTING_KEY 路由键 * @QUERY_NAME 队列名称 * @IP_ADDRESS Rabbitmq地址 * @PORT 端口号 * @USERNAME 用户名 * @PASSWORD 密码 * */ private static final String EXCHANGE_NAME = "exchange_demo"; private static final String ROUTING_KEY = "routingkey_demo"; private static final String QUEUE_NAME = "xiaojiang_query"; private static final String IP_ADDRESS = "192.168.2.112"; private static final int PORT = 15672; private static final String USERNAME = "root"; private static final String PASSWORD = "xiaojiang"; @RequestMapping(name = "/producer") public static void createProducer() throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost(IP_ADDRESS); factory.setPort(PORT); factory.setUsername(USERNAME); factory.setPassword(PASSWORD); // 创建连接 Connection connection = factory.newConnection(); // 创建信道 Channel channel = connection.createChannel(); // 创建一个类型为"direct",持久化的,非自动删除的交换器 channel.exchangeDeclare(EXCHANGE_NAME,"direct",true,false,null); // 创建一个持久化,非排他的,非自动删除的队列 channel.queueDeclare(QUEUE_NAME,true,false,false,null); // 将交换机与队列通过路由键绑定(队列名称,交换机名称,路由键名) channel.queueBind(QUEUE_NAME,EXCHANGE_NAME,ROUTING_KEY); // 发送一条持久化消息 如 Hello XiaoJiang String message = "Hello XiaoJiang"; // 生产者发送消息(交换名称,路由键名称,消息属性(持久),消息内容) channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes()); // 关闭信道 channel.close(); // 关闭连接 connection.close(); } }
消费者代码
public class RabbitmqConsumer { private static final String QUEUE_NAME = "xiaojiang_query"; //队列名称 private static final String IP_ADDRESS = "192.168.2.112"; //rabbimq地址 private static final int PORT = 15672; //端口 @RequestMapping(name = "/consumer") public static void createConsumer() throws IOException, TimeoutException, InterruptedException { Address[] addresses = new Address[]{new Address(IP_ADDRESS,PORT)}; ConnectionFactory factory = new ConnectionFactory(); factory.setUsername("root"); factory.setPassword("xiaojiang"); Connection connection = factory.newConnection();//创建连接 final Channel channel = connection.createChannel();//创建信道 channel.basicQos(64); Consumer consumer = 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 :" + message); try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } channel.basicAck(envelope.getDeliveryTag(),false); } }; channel.basicConsume(QUEUE_NAME, true, consumer); TimeUnit.SECONDS.sleep(5); channel.close(); connection.close(); } }
最后附上成功图
文章持续更新,喜欢就点个赞呗。
这篇文章就先写到这里了,谢谢大家的观看。