一、安装Erlang语言为RabbitMQ搭建运行环境(因为RabbitMQ是Erlang语言开发的)
- Erlang下载地址https://www.erlang.org/downloads
- Erlang 安装,安装步骤很简单一直下一步就可以了,直到安装完成。
- Erlang 环境变量设置,点击左下角Win图标,搜索环境变量->环境变量(N)->系统变量中新建
变量名:ERLANG_HOME
变量值:D:PCerl-23.0 (自己的安装路径)
然后在系统变量中找到Path变量名选中点击编辑,新建内容 %ERLANG_HOME%\bin
- Erlang 查看版本 WIN+R打开运行窗口 输入 erl如果正确就可以看到弹出的Erlang语言版本
二、安装RabbitMQ
- RabbitMQ去官网下载https://www.rabbitmq.com/down... 进入页面点击右侧菜单列表中Install: Windows选项,在下载页面找到Direct Downloads下载项选择下载
- RabbitMQ安装,安装步骤和Erlang一样一直下一步就可以,安装完成后RabbitMQ会在系统开始菜单中添加服务快捷键
三、启动RabbitMQ服务
- RabbitMQ服务启动,找到开始菜单中的RabbitMQ Service - start 如果没有点击展开就可以看到,如果提示没有此服务需要安装服务点击RabbitMQ Service - (re)install安装服务
四、开启RabbitMQweb管理界面
- Win+R 输入cmd打开命令行 cd到RabbitMQ安装目录sbin目录下输入下面指令
rabbitmq-plugins.bat enable rabbitmq_management
- 重启RabbitMQ服务 先停止服务 点击开始菜单中的 RabbitMQ Service - stop 停止完成后 再次启动 RabbitMQ Service - start
- 重启服务后 在浏览器中输入http://127.0.0.1:15672 进入web管理界面 默认账号密码 guest/guest
五、编写代码实现消息发布与消费
每个代码的Package包名,自己根据自己项目情况,自行添加。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Send {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection connection = factory.newConnection();
Channel channel = connection.createChannel()) {
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World1!";
channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
System.out.println(" [x] Sent '" + message + "'");
}
}
}
执行以上代码后,控制台输出如下:
[x] Sent 'Hello World1!'
管理页面结果如下。
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.DeliverCallback;
public class Recv {
private final static String QUEUE_NAME = "hello";
public static void main(String[] argv) 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);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> { });
}
}
执行以上代码,控制台输出如下:
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World1!'
管理页面如下:
MQ的使用可以1,提高并发量,2 解耦
MQ典型应用场景:
- 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
- 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
- 日志处理
- 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。