RabbitMQ【基本使用】
创始人
2024-02-09 23:32:45
0

目录

消息队列 

1. Message queue 释义 

1.1 问题思考 ?

1.2 存在问题

1.3 优化方案

1.4 案例分析

1.5 带来的好处

1.6 消息队列特点

1.7 Email邮件案例分析 

2. 消息队列相关 

2.1 AMQP

3. Docker安装部署RabbitMQ

4. springboot连接配置

4.1 RabbitMQ 配置账号 

4.2 springboot项目搭建 

4.2.1 父工程依赖搭建

4.2.2 provider子工程(生产者)

4.2.3 consumer子工程(消费者)

4.2.4 完成自定义数据发送


消息队列 

1. Message queue 释义 

服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信) 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端,称为延迟消息通讯(异步通信) 

1.1 问题思考 ?

假设我们在淘宝下了一笔订单后,淘宝后台需要做这些事情:

        1. 消息通知系统:通知商家,你有一笔新的订单,请及时发货

        2. 推荐系统:更新用户画像,重新给用户推荐他可能感兴趣的商品

        3. 会员系统:更新用户的积分和等级信息 

createOrder(...) {// 完成订单服务doCreateOrder(...);// 调用其他服务接口sendMsg(...);updateUserInterestedGoods(...);updateMemberCreditInfo(...);
}

 

1.2 存在问题

  • 过度耦合:如果后面创建订单时,需要触发新的动作,那就得去改代码,在原有的创建订单函数末 尾,再追加一行代码
  • 缺少缓冲:如果创建订单时,会员系统恰好处于非常忙碌或者宕机的状态,那这时更新会员信息就会失败,我们需要一个地方,来暂时存放无法被消费的消息

1.3 优化方案

我们需要一个消息中间件,来实现解耦和缓冲的功能 

 

 

1.4 案例分析

小红希望小明多读书,常寻找好书给小明看,之前的方式是这样:小红问小明什么时候有空,把书给小明送去,并亲眼监督小明读完书才走.久而久之,两人都觉得麻烦. 后来的方式改成了:小红对小明说「我放到书架上的书你都要看」,然后小红每次发现不错的书都放到书架上,小明则看到书架上有书就拿下来看.

书架就是一个消息队列,小红是生产者,小明是消费者. 

1.5 带来的好处

        1. 小红想给小明书的时候,不必问小明什么时候有空,亲手把书交给他了,小红只把书放到书架上就行了.这样小红小明的时间都更自由.

        2. 小红相信小明的读书自觉和读书能力,不必亲眼观察小明的读书过程,小红只要做一个放书的动作,很节省时间.

        3. 当明天有另一个爱读书的小伙伴小强加入,小红仍旧只需要把书放到书架上,小明和小强从书架上取书即可

        4. 书架上的书放在那里,小明阅读速度快就早点看完,阅读速度慢就晚点看完,没关系,比起小红把书递给小明并监督小明读完的方式,小明的压力会小一些.

1.6 消息队列特点

1. 解耦:每个成员不必受其他成员影响,可以更独立自主,只通过一个简单的容器来联系.

2. 提速:小红选只要做一个放书的动作,为自己节省了大量时间.

3. 广播:小红只需要劳动一次,就可以让多个小伙伴有书可读,这大大地节省了她的时间,也让新的小伙伴的加入成本很低.

4. 错峰与流控:小红给书的频率不稳定,如果今明两天连给了五本,之后隔三个月才又给一本,那小明只要在三个月内从书架上陆续取走五本书读完就行了,压力就不那么大了. 

1.7 Email邮件案例分析 

有大量用户注册你的软件,再高并发情况下注册请求开始出现一些问题.

例如邮件接口承受不住,或是分析信息时的大量计算使cpu满载,这将会出现虽然用户数据记录很快的添加到数据库中了,但是却卡在发邮件或分析信息时的情况.

导致请求的响应时间大幅增长,甚至出现超时,这就有点不划算了.面对这种情况一般也是将这些操作放入消息队列(生产者消费者模型),消息队列慢慢的进行处理,同时可以很快的完成注册请 求,不会影响用户使用其他功能. 

 

2. 消息队列相关 

2.1 AMQP

一个提供统一消息服务的应用层标准高级消息队列协议,是一个通用的应用层协议 消息发送与接受的双方遵守这个协议可以实现异步通讯.这个协议约定了消息的格式和工作方式. 

 技术选型

 

RabbitMQ 

 

RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言. 

 

Server(Broker):接收客户端连接,实现AMQP协议的消息队列和路由功能的进程.

Virtual Host:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue.

Exchange:交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue.

ExchangeType:交换机类型决定了路由消息行为,RabbitMQ中有三种类型Exchange,分别是fanout、direct、topic.

Message Queue:消息队列,用于存储还未被消费者消费的消息.

Message:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等.body是真正需要发送的数据内 容.

BindingKey:绑定关键字,将一个特定的Exchange和一个特定的Queue绑定起来. 

 

3. Docker安装部署RabbitMQ

1. 拉取 RabbitMQ 镜像 

docker pull rabbitmq:management

注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面

2. 创建容器 

docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
-v /home/rabbitmq:/var/lib/rabbitmq \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management

 --hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)

-e:指定环境变量:

RABBITMQ_DEFAULT_VHOST:默认虚拟机名

RABBITMQ_DEFAULT_USER:默认的用户名

RABBITMQ_DEFAULT_PASS:默认用户名的密码

3. 容器启动后,可以通过 docker logs 容器 查看日志

docker logs my-rabbitmq

4. 进入管理后台

http://ip:15672

 

 

4. springboot连接配置

4.1 RabbitMQ 配置账号 

 

 

切记需要授权 

 

 

4.2 springboot项目搭建 

rabbitMQ (父工程maven工程搭建即可)- consumer(子工程:springboot项目搭建)消费者- provider(publisher)(子工程:springboot项目搭建)生产者

 4.2.1 父工程依赖搭建

4.0.0com.jmhrabbitMq1.0-SNAPSHOTpomrabbitMq Maven Webapphttp://www.example.comconsumerproviderUTF-81.81.8UTF-81.71.72.4.12020.0.02021.1junitjunit4.11testorg.springframework.bootspring-boot-starter-weborg.projectlomboklomboktrueorg.springframework.bootspring-boot-starter-testtestorg.springframework.bootspring-boot-starter-amqporg.springframework.bootspring-boot-dependencies${spring-boot.version}pomimport

4.2.2 provider子工程(生产者)

  • application.yml文件配置 
server: port: 8080 #服务器端口
spring:application:name: provider #服务名称rabbitmq:host: 192.168.119.128 #虚拟机ippassword: 1234 rabbitmq管理页面密码port: 5672 # 端口username: springboot #rabbitmq管理页面账户名virtual-host: my_vhost #服务名 授权的
  •  RabbitConfig
package com.jmh.provider.config;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
@SuppressWarnings("all")
public class RabbitConfig {@Beanpublic Queue firstQueue() {return new Queue("firstQueue");}
}
  •  Sender
package com.jmh.provider.utils;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;/*** @author 蒋明辉* @data 2022/11/23 19:12*/
@Component
@SuppressWarnings("all")
public class Sender {@Autowiredprivate AmqpTemplate rabbitTemplate;public void sendFirst() {rabbitTemplate.convertAndSend("firstQueue", "Hello World");}public void sendFirst(String json) {rabbitTemplate.convertAndSend("firstQueue", json);}
}
  •  User
package com.jmh.provider.model;import lombok.*;import java.io.Serializable;/*** @author 蒋明辉* @data 2022/11/23 20:23*/
@SuppressWarnings("all")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {private String username;private String userpwd;
}

4.2.3 consumer子工程(消费者)

  • application.yml文件配置 
server:port: 8081
spring:application:name: consumerrabbitmq:host: 192.168.119.128password: 1234port: 5672username: springbootvirtual-host: my_vhost
  •  User
package com.jmh.consumer.model;import lombok.*;import java.io.Serializable;/*** @author 蒋明辉* @data 2022/11/23 20:23*/
@SuppressWarnings("all")
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@ToString
public class User implements Serializable {private String username;private String userpwd;
}
  •  Receiver
package com.jmh.consumer.utils;import com.fasterxml.jackson.databind.ObjectMapper;
import com.jmh.consumer.model.User;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue")
public class Receiver {@RabbitHandler@SneakyThrowspublic void process(String json) {log.warn("接收到:" + json);ObjectMapper objectMapper=new ObjectMapper();log.warn("接收到:" + objectMapper.readValue(json, User.class));}
}

4.2.4 完成自定义数据发送

  •  启动consumer子工程服务(消费者)

 

  •  调用provider子工程测试方法(生产者)
package com.jmh.provider;import com.fasterxml.jackson.databind.ObjectMapper;
import com.jmh.provider.model.User;
import com.jmh.provider.utils.Sender;
import lombok.SneakyThrows;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class ProviderApplicationTests {@Autowiredprivate Sender sender;@Test@SneakyThrowsvoid contextLoads() {/* sender.sendFirst();*/User user = new User("蒋明辉", "1234");ObjectMapper objectMapper=new ObjectMapper();sender.sendFirst(objectMapper.writeValueAsString(user));}}

 

  •  效果

 

 

相关内容

热门资讯

网络大学生bbs经典高校名言... 网络大学生bbs经典高校名言语录摘抄  1.自从两个妓 女自称是某名牌大学的毕业生后,我现在一般都自...
中学学生操行评语 中学学生操行评语15篇  在学习、工作、生活中,大家对评语都不陌生吧,评语可以对被评价者进行有针对性...
毕业寄语简短 精选毕业寄语简短  那年的夏天,我们都正青春年少,即将分别的我们有淡淡的愁绪,更多的是对未来渺茫生活...
名侦探柯南经典语录大全   《名侦探柯南》是根据日本漫画家青山刚昌创作的侦探漫画《名侦探柯南》改编的同名推理动画作品系列。下...
押韵的经典语录社会 导语:时光听着一段旋律,熟悉在心里的记忆,阳光烘干一片阴雨,温暖在晴朗的笑容里,目光琉璃一行小诗,晶...
大一新生寄语 大一新生寄语5篇  在平日的学习、工作和生活里,大家都不可避免地会接触到寄语吧,寄语是指寄托希望和美...
毕业感言:值得我们珍惜 毕业感言:值得我们珍惜  每年凤凰花开时,就是一个小学生飞向另一段旅程,开始青少年生活的时候,毕业感...
与老外的聊天技巧 与老外的聊天技巧  西方人为了彼此融洽相处,维护国家良好形象,特别重视生活教育和人际关系。尤其平时说...
代嫁弃妃 安知晓 小说语录   方流苏:有的人,适合相伴一生,有的人,适合怀念一生,这都是幸福  ——安知晓《代嫁弃妃》  风南...
安意如《陌上花开》唯美语录   爱情用来遗忘,感情用来摧毁,忠诚用来背叛,在时之洪流中起落,人心常常经不住世事熬煮。一切都存在变...
幼儿园暑假工作安排公文 幼儿园暑假工作安排公文  尊敬的家长朋友们:  转眼间,本学期即将结束,衷心的'感谢您一直以来对幼儿...
感谢家长的话语 感谢家长的话语感谢家长的话语1.坐在电脑前敲打着键盘,出一张“两位数加减一位数、整十数”的口算练习。...
第一学期中班幼儿评语 第一学期中班幼儿评语(精选15篇)  在平平淡淡的日常中,大家都写过评语吧,评语的内容包括被考评者的...
王小波的经典语录100句   王小波的小说既继承了年代对爱情与革命权力关系的思考,具有强烈启蒙意味,也顺应了年代世俗化潮流。接...
经典祝愿高考成功寄语 经典祝愿高考成功寄语(通用90句)  六月参加高考,准备还得趁早,心态一定摆正,付出必有回报,毕竟熬...
电影的观后感 电影的观后感  在观看完一部作品以后,能够给我们不少启示,这时候最关键的观后感不能忘了。但是观后感有...
利益关系经典语录 利益关系经典语录  在日常的学习、工作、生活中,大家都知道一些经典的语录吧,语录是指一个人的说话记录...
哆啦a梦语录 哆啦a梦语录  01、骗人有风险,说谎要谨慎。  02、日子就像偷跑的小孩,无声地溜走。  03、知...
感人的情书经典语录   在很多超感人的情书中,是有一些情书经典语录起到关键作用。小编今天收集了超感人情书经典语录,希望得...
高中生毕业寄语 高中生毕业寄语4篇  在日常的学习、工作、生活中,大家总免不了要接触或使用寄语吧,寄语是所传的、寄托...