RabbitMQ学习笔记一-- rabbitMq的安装和使用
1、相关概念
1.1 什么是MQ
MQ(message queue),从字面意思上看,本质是个队列,FIFO 先入先出,只不过队列中存放的内容是 message 而已,是一种跨进程的通信机制,用于上下游传递消息。在互联网架构中,MQ 是一种非常常见的上下游“逻辑解耦+物理解耦”的消息通信服务。使用了 MQ 之后,消息发送上游只需要依赖 MQ,不用依赖其他服务。
1.2 MQ的作用
- 流量消峰
- 应用解耦
- 异步处理
1.3 RabbitMQ
AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ是一个开源的AMQP实现。由于 erlang 语言的高并发特性,性能较好;吞吐量到万级,MQ 功能比较完备,健壮、稳定、易 用、跨平台、支持多种语言,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX 文档齐全;开源提供的管理界面非常棒,用起来很好用,社区活跃度高;更新频率相当高,但是缺点是商业版需要收费,学习成本较高。
2、RabbitMQ的安装
使用之前,需要先安装rabbitmq,由于我使用的mac平台,这里以mac平台为例,进行安装,其他平台类似
2.1 mac 平台安装
在Mac平台上,建议使用brew命令进行安装,参考安装homebrew
安装命令
安装 brew install rabbitmq ## 进入安装目录 cd /usr/local/Cellar/rabbitmq/3.9.10 启动服务 ./sbin/rabbitmq-server
2.1 ubuntu(linux)平台安装
a)安装erlang
RabbitMQ服务端代码是使用并发式语言Erlang编写的,安装Rabbit MQ的前提是安装Erlang。
1 sudo apt-get install erlang-nox
如果在安装软件的时候出现了Package has no installation candidate的问题
请先执行
1 sudo apt-get upgrade
在执行上述命令
b)安装rabbitmq-server
1 sudo apt-get install rabbitmq-server
2.2 服务常用命令
启动rabbit服务:service rabbitmq-server start 停止rabbit服务:service rabbitmq-server stop 后台启动:rabbitmq-server -detached 运行状态:rabbitmqctl status
2.3 开启 web 管理插件
开启rabbit网页控制台
进入rabbit安装目录:
1 cd /usr/lib/rabbitmq
查看已经安装的插件:
1 rabbitmq-plugins list
开启网页版控制台:
1 sudo rabbitmq-plugins enable rabbitmq_management
重启rabbitmq服务
输入网页访问地址
登录: http://localhost:15672/
用户名和密码:guest,guest
2.4 RabbitMQ登录提示User can only log in via localhost的解决方案(添加新的RabbitMQ帐号)
RabbitMQ默认只有一个guest帐号,guest帐号只能在RabbitMQ安装服务器上登录,在其它服务器用guest登录提示User can only log in via localhost。
这个情况的最佳解决办法是添加一个新的帐号
1 #第一步:添加 admin 用户并设置密码 2 rabbitmqctl add_user admin 123456 3 #第二步:添加 admin 用户为administrator角色 4 rabbitmqctl set_user_tags admin administrator 5 #第三步:设置 admin 用户的权限,指定允许访问的vhost以及write/read 6 rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" 7 #第四步:查看vhost(/)允许哪些用户访问 8 rabbitmqctl list_permissions -p / 9 #第五步:查看用户列表 10 rabbitmqctl list_users
3、简单使用
3.1 配置
使用springboot initializr创建一个项目,版本为:
- springboot版本为
2.2.1.RELEASE
- rabbitmq 版本为
3.9.10
pom.xml的文件配置为
1 <parent> 2 <groupId>org.springframework.boot</groupId> 3 <artifactId>spring-boot-starter-parent</artifactId> 4 <version>2.3.12.RELEASE</version> 5 <relativePath/> <!-- lookup parent from repository --> 6 </parent> 7 <description>Demo project for Spring Boot</description> 8 <properties> 9 <java.version>1.8</java.version> 10 </properties> 11 <dependencies> 12 <dependency> 13 <groupId>org.springframework.boot</groupId> 14 <artifactId>spring-boot-starter-amqp</artifactId> 15 </dependency> 16 <dependency> 17 <groupId>org.springframework.boot</groupId> 18 <artifactId>spring-boot-starter-web</artifactId> 19 </dependency> 20 <dependency> 21 <groupId>com.alibaba</groupId> 22 <artifactId>fastjson</artifactId> 23 <version>1.2.47</version> 24 </dependency> 25 <dependency> 26 <groupId>org.projectlombok</groupId> 27 <artifactId>lombok</artifactId> 28 </dependency> 29 <!--swagger--> 30 <dependency> 31 <groupId>io.springfox</groupId> 32 <artifactId>springfox-swagger2</artifactId> 33 <version>2.9.2</version> 34 </dependency> 35 <dependency> 36 <groupId>io.springfox</groupId> 37 <artifactId>springfox-swagger-ui</artifactId> 38 <version>2.9.2</version> 39 </dependency> 40 <!--RabbitMQ 测试依赖--> 41 <dependency> 42 <groupId>org.springframework.amqp</groupId> 43 <artifactId>spring-rabbit-test</artifactId> 44 <scope>test</scope> 45 </dependency> 46 <dependency> 47 <groupId>org.springframework.boot</groupId> 48 <artifactId>spring-boot-starter</artifactId> 49 </dependency> 50 <dependency> 51 <groupId>org.springframework.boot</groupId> 52 <artifactId>spring-boot-starter-test</artifactId> 53 <scope>test</scope> 54 <exclusions> 55 <exclusion> 56 <groupId>org.junit.vintage</groupId> 57 <artifactId>junit-vintage-engine</artifactId> 58 </exclusion> 59 </exclusions> 60 </dependency> 61 </dependencies>
application.properties中加上
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
server.port=8082
3.2 基本使用
接下来我们看一个hello world
版本的rabbitmq的使用姿势,一个简单发布消息、消费消息
3.2.1 发布消息
消息发布,我们主要借助AmqpTemplate
来实现
1 @Component 2 public class PublishDemo { 3 @Autowired 4 private AmqpTemplate amqpTemplate; 5 6 public String publish2mq(String ans) { 7 String msg = "hello world = " + ans; 8 System.out.println("publish: " + msg); 9 amqpTemplate.convertAndSend(BasicEntity.EXCHANGE, BasicEntity.ROUTING, msg); 10 return msg; 11 } 12 }
其中
1 public class BasicEntity { 2 public final static String EXCHANGE = "topic.e"; 3 public final static String ROUTING = "r"; 4 public final static String QUEUE = "topic.a"; 5 }
3.2.2 消费消息
消费消息,需要指定Queue,通过routingKey绑定exchange,如下
1 @Service 2 public class ConsumerDemo { 3 @RabbitListener(bindings = @QueueBinding(value = @Queue(value = BasicEntity.QUEUE, durable = "false", autoDelete = "true"), 4 exchange = @Exchange(value = BasicEntity.EXCHANGE, ignoreDeclarationExceptions = "true", 5 type = ExchangeTypes.TOPIC), key = BasicEntity.ROUTING)) 6 public void consumer(String msg) { 7 System.out.println("consumer msg: " + msg); 8 } 9 }
3.2.3 测试demo
写一个简单的rest接口,用于接收参数,发布消息到mq,并被ConsumerDemo
消费
@RestController @RequestMapping("test") public class TestController { @Autowired private PublishDemo publishDemo; @GetMapping("sendMsg/{message}") public String publish(@PathVariable String message) { return publishDemo.publish2mq(message); } }
在控制台输入:
localhost:8082/test/sendMsg/haha
结果如下: