RabbitMQ【基本使用】

news2025/2/21 20:11:07

目录

消息队列 

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 父工程依赖搭建

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.jmh</groupId>
  <artifactId>rabbitMq</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <name>rabbitMq Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <modules>
    <module>consumer</module>
    <module>provider</module>
  </modules>

  <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.7</maven.compiler.source>
      <maven.compiler.target>1.7</maven.compiler.target>
      <spring-boot.version>2.4.1</spring-boot.version>
      <spring-cloud.version>2020.0.0</spring-cloud.version>
      <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <optional>true</optional>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>
  </dependencies>

  <dependencyManagement>
    <dependencies>
      <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-dependencies</artifactId>
        <version>${spring-boot.version}</version>
        <type>pom</type>
        <scope>import</scope>
      </dependency>
    </dependencies>
  </dependencyManagement>

</project>

4.2.2 provider子工程(生产者)

  • application.yml文件配置 
server: 
  port: 8080 #服务器端口
spring:
  application:
    name: provider #服务名称
  rabbitmq:
    host: 192.168.119.128 #虚拟机ip
    password: 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 {
    @Bean
    public 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 {
    @Autowired
    private 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: consumer
  rabbitmq:
    host: 192.168.119.128
    password: 1234
    port: 5672
    username: springboot
    virtual-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
    @SneakyThrows
    public 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 {

    @Autowired
    private Sender sender;

    @Test
    @SneakyThrows
    void contextLoads() {
       /* sender.sendFirst();*/
        User user = new User("蒋明辉", "1234");
        ObjectMapper objectMapper=new ObjectMapper();
        sender.sendFirst(objectMapper.writeValueAsString(user));
    }

}

 

  •  效果

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29462.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unity记录

第四课&#xff1a;组件 自定义组件&#xff0c;主要是 编写 脚本 脚本&#xff1a;要求必须 挂载 到游戏物体上&#xff0c;才能使用 主要组件&#xff1a; &#xff08;1&#xff09;gameObject 游戏对象 VS中的显示 总结&#xff1a; //属性 name:名称 tag : 标签名称 ac…

Execution failed for task ‘:app:javaPreCompileDebug‘.

debug运行app到模拟器的时候&#xff0c;一直报错&#xff0c;然后百度了下&#xff0c;给出的答案是&#xff1a; android { defaultConfig { //添加如下配置就OK了 javaCompileOptions { annotationProcessorOptions { includeCompileClasspath true } } } 但是加了之后&am…

[附源码]java毕业设计养老护理综合服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

个人养老金真的要来了,详解人社部、财政部、税务局、银保监会和证监会联合发布的《个人养老金实施办法》(要点概览+示意图+逐条解读)

11月5日&#xff0c;人力资源社会保障部、财政部、国家税务总局、银保监会、证监会联合发布了《个人养老金实施办法》。&#xff08;人社部发〔2022〕70号&#xff09; 11月18日&#xff0c;中国银保监会发布了《商业银行和理财公司个人养老金业务管理暂行办法》。&#xff08;…

将一个硬盘空间分配给另一个硬盘,怎么把一个磁盘的空间给另一个磁盘

用户在管理电脑磁盘分区的时候&#xff0c;为了更好地利用磁盘分区&#xff0c;需要对磁盘分区进行调整&#xff0c;如果涉及到磁盘分区调整&#xff0c;将一个硬盘空间分配给另一个硬盘&#xff1f;那么&#xff0c;在本文中&#xff0c;易我小编将介绍电脑磁盘分区调整的知识…

【Linux】线程池

文章目录1.线程池概念2.线程池的优点3.线程池的应用场景4.线程池的实现5.STL和智能指针和线程安全5.1其他常见锁5.2读写锁1.线程池概念 线程池是一种线程使用模式。 线程过多会带来调度开销&#xff0c;进而影响缓存局部性和整体性能。而线程池维护着多个线 程&#xff0c;等待…

土地覆盖数据集汇总

前言 土地覆盖数据是理解人类活动与全球变化之间复杂相互作用的关键信息来源,在改善生态系统、水文和大气模型的性能方面发挥着关键作用。而土地覆盖变化(LCC)是全球环境变化的起因和结果&#xff0c;影响着全球能量平衡和生物地球化学循环&#xff0c;进而影响气候变化和生态系…

Flutter中GetX系列二--Snackbar基本使用(顶部弹窗)

Snackbar基本使用 第一步&#xff1a;应用程序入口设置 当我们导入依赖后&#xff0c;在应用程序顶层把GetMaterialApp 作为顶层&#xff0c;如下所示 import package:flutter/material.dart; import package:get/get.dart;void main() {runApp(MyApp()); }class MyApp exte…

智慧物流解决方案-最新全套文件

智慧物流解决方案-最新全套文件一、建设背景行业痛点二、建设思路三、建设方案四、获取 - 智慧物流全套最新解决方案合集一、建设背景 随着物流国际化发展以及信息技术的普遍应用&#xff0c;物流管理由手工作业到半自动化、自动化&#xff0c;直至智能化的发展过程。面对现代…

MySQL之索引

引言 数据库作为项目中必不可少且运行速度相对较慢的一环&#xff0c;尤其是在大数据量下保证其更高的性能、更稳定的性能是每个后端程序员必备的技能。MySQL在执行查询语句时&#xff0c;会通过IO扫描磁盘&#xff0c;遍历数据表中的每一条数据&#xff0c;时间复杂度为O(N)&…

【机器学习】EM算法

EM算法 目录一、似然函数与极大似然估计二、Jenson不等式三、数学期望的相关定理四、边缘分布列五、EM算法一、似然函数与极大似然估计 例一 现有一个不透明的罐子&#xff0c;里面装有质地、大小均相同而颜色不同的黑白两种球&#xff08;数目未知&#xff09;。现要求在经过…

MyBatis 增删改查操作

什么是 MyBatis&#xff1f; mybatis 是一款优秀的持久层框架&#xff0c;用于简化 JDBC 开发 MyBatis 本是 Apach 的一个开源项目 iBatis&#xff0c;2021 年这个项目由 apach software foundation 迁移到了 google code&#xff0c;并且改名为 MyBatis。2013 年 11 月迁移到…

[附源码]java毕业设计氧气罐管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

js逆向之反调试之无限debugger解决

js逆向之反调试之无限debugger解决 文章目录 js逆向之反调试之无限debugger解决方案一方案二方案三方案一 右击debugger行数位置,点击add conditional breakpoint… 点击add conditional breakpoint.png 添加false,然后按回撤, 刷新网页,发现成功跳过无限debugger 修改成…

TiDB 6.0 新特性

TiDB 6.0 新特性 Placement Rules in SQL小表缓存内存悲观锁Top SQLTiDB Enterprise Manager(TiEM) Placement Rules in SQL Placement Rules in SQL 之前&#xff1a; 跨地域部署的集群&#xff0c;无法本地访问无法根据业务隔离资源&#xff0c;leader全在一个TiKV节点上…

CTFHub | UA注入

0x00 前言 CTFHub 专注网络安全、信息安全、白帽子技术的在线学习&#xff0c;实训平台。提供优质的赛事及学习服务&#xff0c;拥有完善的题目环境及配套 writeup &#xff0c;降低 CTF 学习入门门槛&#xff0c;快速帮助选手成长&#xff0c;跟随主流比赛潮流。 0x01 题目描述…

新发现,新挑战,技术出海的机遇与挑战丨PingCAP DevCon 2022 出海专场

现在报名活动&#xff0c;有机会获得限定好礼哦&#xff01;&#x1f446; 中国企业出海的格局和挑战正在发生重大改变。回到技术管理者熟悉的技术世界&#xff0c;过去两年的技术环境也发生了巨大的变化&#xff0c;开源软件与云服务的结合成为业界共识的潮流&#xff0c;在多…

linux篇【11】:linux下的线程<后序>

目录 一.线程互斥 1.三个概念 2.互斥 &#xff08;1&#xff09;在执行语句的任何地方&#xff0c;线程可能被切换走 &#xff08;3&#xff09;抢票场景中的问题 &#xff08;4&#xff09;解决方案 3.加锁 &#xff08;1&#xff09;加锁介绍 &#xff08;2&#xf…

C语言百日千题系列之《忘情水题》第一日

目录 绪论 1.最大数位置 2.与指定数字相同的数的个数 3.蓝桥杯2013年第四届真题-核桃的数量 4.求所给范围内水仙花数并排列 5.最大值和最小值的差 6.计算书费 7.角谷猜想 8. 最高的分数 9.年龄与疾病 10.-百钱百鸡问题 绪论 本文是C语言百日千题系列《忘情水题》的第…

BCN衍生物:endo-BCN-PEG4-TAMRA,endo-BCN-PEG4-Palmitic,endo-BCN-PEG4-DSPE的特点分享

凯新生物公司小编分享&#xff1a;endo-BCN-PEG4-TAMRA &#xff0c;endo-BCN-PEG4-Palmitic&#xff0c;endo-BCN-PEG4-DSPE这几种的物理相关数据。 1、endo-BCN-PEG4-TAMRA 四甲基罗丹明&#xff08;TAMRA&#xff09;-叠氮化物是一种化学探针&#xff0c;用于直接在活细胞中…