RabbitMQ的基本概念
RabbitMQ(rabbit公司开发的message queue)是一种消息中间件,用于处理来自客户端的异步消息。服务端将要发送的消息放入队列池中。接收端可以根据RabbitMQ配置的转发机制接受服务端发来的消息。RabbitMQ依据指定的转发规则进行消息的转发、缓存和持久化操作,主要在多服务期间或单服务器的子系统间进行通信,是分布式系统标准的配置。
上传离线安装包
rabbitmq-install 目录上传到 /root
切换到rabbitmq-install目录
cd rabbitmq-install
安装
rpm -ivh *.rpm
启动rabbitmq服务器
设置服务,开机自动启动
systemctl enable rabbitmq-server
启动服务
systemctl start rabbitmq-server
rabbitmq管理界面
启用管理界面
# 开启管理界面插件
rabbitmq-plugins enable rabbitmq_management
防火墙打开 15672 管理端口
firewall-cmd --zone=public --add-port=15672/tcp --permanent
firewall-cmd --reload
重启RabbitMQ服务
systemctl restart rabbitmq-server
访问
访问服务器的15672端口,例如:
http://192.168.64.140:15672
添加用户
添加用户
rabbitmqctl add_user admin admin
# 新用户设置用户为超级管理员
rabbitmqctl set_user_tags admin administrator
设置访问权限
# 打开客户端连接端口
firewall-cmd --zone=public --add-port=5672/tcp --permanent
firewall-cmd --reload
- 主要端口介绍
4369 – erlang发现口
5672 – client端通信口
15672 – 管理界面ui端口
25672 – server间内部通信口
市场上消息队列的种类:
rabbitmq
activemq(纯java程序,只要支持虚拟机就可支持)
rocketmq(阿里开发的消息队列)
tubemq(腾讯开发的消息队列)
消息队列的使用场景:
1.服务解耦、2.流量削峰、3.异步调用
代码实例:
producer:
public class Producer {
public static void main(String[] args) throws Exception{
//创建连接工厂,并设置连接信息
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost(“192.168.64.140”);
connectionFactory.setPort(5672);
connectionFactory.setUsername(“admin”);
connectionFactory.setPassword(“admin”);
/*
*与rabibitmq服务器建立连接,
* rabbitmq服务器端使用的是nio,会复用tcp连接
* 并开辟多个信道与客户端通信
* 以减轻服务器端建立连接的开销
/
Connection c = connectionFactory.newConnection();
//建立信道
Channel ch = c.createChannel();
/
*声明队列,会在rabbitmq中创建一个队列
* 如果已经创建过该队列,就不能使用其他参数来创建
* 参数含义:
* -queue: 队列名称
* -durable: 队列持久化,true表示RabbitMQ重启后队列仍存在
* -exclusive: 排他,true表示限制仅当前连接可用
* -autoDelete: 当最后一个消费者断开后,是否删除队列
* -arguments: 其他参数
/
ch.queueDeclare(“helloword”,
false, //队列持久化
false, //是否排他
false,//是否自动删除队列
null);//其他参数属性
/
* 发布消息
* 这里把消息向默认交换机发送.
* 默认交换机隐含与所有队列绑定,routing key即为队列名称
*
* 参数含义:
* -exchange: 交换机名称,空串表示默认交换机"(AMQP default)",不能用 null
* -routingKey: 对于默认交换机,路由键就是目标队列名称
* -props: 其他参数,例如头信息
* -body: 消息内容byte[]数组
*/
ch.basicPublish("",//exchange
“helloword”,//routingKey
null,//props
“Hi,徐先生!!!”.getBytes());//body
System.out.println(“消息已发送!!”);
c.close();
}
}
consumer:
public class Consumer {
public static void main(String[] args) throws Exception{
//连接工厂
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost(“192.168.64.140”);
connectionFactory.setPort(5672);
connectionFactory.setUsername(“admin”);
connectionFactory.setPassword(“admin”);
//建立连接和建立信道
Channel channel = connectionFactory.newConnection().createChannel();
//声明队列,如果该队列已经创建过了,则不会重复创建
channel.queueDeclare(“helloword”,//参数依次是:队列名称、是否持久化、
// 是否排他、是否自动删除、其他属性
false,
false,
false,
null);
System.out.println(“等待接收数据!!”);
//收到消息后用来处理消息的回调对象
DeliverCallback deliverCallback = new DeliverCallback() {
@Override
public void handle(String s, Delivery delivery) throws IOException {
byte[] a = delivery.getBody();
String msg = new String(a,“utf-8”);
System.out.println(“收到:”+msg);
}
};
//消费者取消时的回调对象
CancelCallback cancelCallback = new CancelCallback() {
@Override
public void handle(String s) throws IOException {
}
};
//第二个参数是(ack)指服务器发送请求信息到客户端时,会在服务器中存一个回执单,客户端处理完请求返回响应,
//然后会发明回来一个回执单,与服务其中的回执单相比较,相同表明该服务处理完了。
//若为true后,服务器发送请求到客户端,然后服务器会默认请求执行完成,自动删除回执单。
channel.basicConsume("helloword", true, deliverCallback,cancelCallback);
}
}