目录
RabbitMQ是什么?
常见的消息中间件,及应用场景?
RabbitMQ的应用场景
1、服务解耦
2、流量削峰
3、异步调用
RabbitMQ安装
sprngboot集成RabbitMQ
1.pom依赖
2.配置文件(conf.properties)
3.测试
RabbitMQ是什么?
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。
常见的消息中间件,及应用场景?
Kafka、ActiveMQ、RabbitMQ、RocketMQ
ActiveMq与RabbitMq都基于主从架构并且单机吞吐量每秒万级别,RocketMq和Kafka天然支持分布式并且单机吞吐量为十万级别。ActiveMq有较低概率丢失数据,其他经过配置几乎可以0丢失,
RabbitMq有单机模式,普通集群模式,镜像集群模式,每台机器上存储着全量的数据。
RabbitMQ的应用场景 1、服务解耦
如果一个服务下面有几十甚至几百个对接服务,那么这个服务代码维护起来会比较费力,造成这个现象的原因是耦合度太高了,如果使用rabbitMQ解耦,下游服务如果需要数据,自行从消息服务器订阅消息,不再需要数据时则取消订阅即可。
2、流量削峰
如果一个服务平时访问量不多,偶尔访问量会暴增到单台服务器无法处理,这种情况就可以使用RabbitMQ来进行流量削峰,减轻瞬时压力。
3、异步调用
比如秒杀系统,用户并不关心自己的订单号是否会立即返回,用户只关心自己是否成功抢购,所以对于生成订单号,减少库存等操作我们可以通过异步处理订单将数据写入数据库。
RabbitMQ安装
由于使用docker启动Rabbitmq十分便捷,这里就不再叙述其他方法了。
1、拉取最新版镜像(rabbitmq:management中有管理界面)
docker pull rabbitmq:management
2、关闭,禁用防火墙,重启 docker 系统服务
systemctl stop firewalldsystemctl disable firewalldsystemctl restart docker
3、创建目录
mkdir /etc/rabbitmq
4、创建配置文件,并进入编辑状态
vim /etc/rabbitmq/rabbitmq.conf
5、写入用户名与密码(配置文件及路径一会启动容器用,用户名密码登录时用)
default_user = zlydefault_pass = zly
6、启动Rabbitmq
-d:后台运行容器。--name:指定容器名。-p:指定服务运行的端口(5672:应用访问端口;15672:控制台端口号)。-v:映射目录或文件。-e:指定环境变量
docker run -d --name rabbit -p 5672:5672 -p 15672:15672 -v /etc/rabbitmq/rabbitmq.conf:/etc/rabbitmq/rabbitmq.conf -e RABBITMQ_CONFIG_FILE=/etc/rabbitmq/rabbitmq.conf --restart=always rabbitmq:management
访问15672端口,输入之前设置的用户名与密码就可以访问了(5672是集成到spring中写配置里的)
RabbitMQ工作模式
大家可以点击到官网查看RabbitMQ Tutorials — RabbitMQ
sprngboot集成RabbitMQ 1.pom依赖
2.配置文件(conf.properties)
host需要根据实际情况修改
username和password是前面自己写的
spring.application.name=spirng-boot-rabbitmqspring.rabbitmq.host=192.168.126.128spring.rabbitmq.port=5672spring.rabbitmq.username=zlyspring.rabbitmq.password=zly
3.测试
1.配置类
import org.springframework.amqp.core.Queue;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class RabbitMqConfig { @Bean public Queue Queue1() { return new Queue("zly"); }}
2.接口
import org.springframework.amqp.core.AmqpTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import java.util.Date;@RestControllerpublic class SendController { @Autowired private AmqpTemplate amqpTemplate; @RequestMapping("/send") public String send(){ String content="Date:"+new Date(); amqpTemplate.convertAndSend("zly",content); return content; }}
3.监听
import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.amqp.rabbit.annotation.RabbitHandler;import org.springframework.amqp.rabbit.annotation.RabbitListener;import org.springframework.stereotype.Component;@Component@RabbitListener(queues = "zly")public class Receiver1 { private static final Logger logger = LoggerFactory.getLogger(Receiver1.class); @RabbitHandler public void receiver(String msg){ logger.debug("zly:"+msg); }}
访问接口可以看到消息率在随之变化。