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>
View Code

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

结果如下:

 

 

 

posted @ 2021-12-06 16:55  r1-12king  阅读(129)  评论(0编辑  收藏  举报