当前位置: 首页 > news >正文

RabbitMQ安装和使用

简介

RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一个Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成。所有主要的编程语言均有与代理接口通讯的客户端库。RabbitMQ由Rabbit科技有限公司开发,并提供对其的支持。起初,Rabbit科技是LSHIFT和CohesiveFT在2007年成立的合资企业,2010年4月被VMware旗下的SpringSource收购。RabbitMQ在2013年5月成为GoPivotal的一部分。

AMQP:高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。RabbitMQ是一个开源的AMQP实现,服务端用erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS,支持AJAX等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现较好。

特性

1、可靠性(Reliability)
rabbitmq使用一些机制来保证可靠性,如持久化、传输确认、发布确认。

2、灵活的路由(Flexible Routing)
在消息进入队列之前,是通过Exchange来路由信息的。对于典型的路由功能,rabbitmq已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也可以通过插件机制实现自己的Exchange。

3、消息集群(Clustering)
多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker(服务)。

4、高可用(Highly Available)
队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用,也就是具有可伸缩性。

5、多种协议(Multi-protocol)
rabbitmq支持多种消息队列协议,如STOMP、MQIT等。

6、多语言客户端(Many Clients)
rabbitmq几乎支持所有的常用语言,如Java、.net、Ruby、Python等。

7、管理界面(Mangement UI)
rabbitmq提供了一个易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。

8、跟踪机制(Tracing)
如果消息异常,rabbitmq提供了消息跟踪机制,使用者可以找出发生了什么。

9、插件机制(Plugin System)
rabbitmq提供了许多插件来从多方面进行扩展,使用者也可以编写自己的插件。

消息队列 

Message queue 释义

服务之间最常见的通信方式是直接调用彼此来通信 , 消息从一端发出后立即就可以达到另一端 , 称为即时消息通讯 ( 同步通信 )
消息从某一端发出后 , 首先进入一个容器进行临时存储 , 当达到某种条件后 , 再由这个容器发送给另一端 , 称为延迟消息通讯 ( 异步通信 )
假设我们在淘宝下了一笔订单后 , 淘宝后台需要做这些事情:
1. 消息通知系统:通知商家 , 你有一笔新的订单 , 请及时发货
2. 推荐系统:更新用户画像 , 重新给用户推荐他可能感兴趣的商品
3. 会员系统:更新用户的积分和等级信息
createOrder(...){//完成订单服务doCreateOrder(...);//调用其他服务接口sendMsg(...);updateUserInterestedGoods(...);updateMemberCreditInfo(...);
}

存在问题:

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

优化方案:

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

案例分析:

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

 带来的好处

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

2. 小红相信小明的读书自觉和读书能力 , 不必亲眼观察小明的读书过程 , 小红只要做一个放书的动作 , 很节省时间 .
3. 当明天有另一个爱读书的小伙伴小强加入 , 小红仍旧只需要把书放到书架上 , 小明和小强从书架上取书即可
4. 书架上的书放在那里 , 小明阅读速度快就早点看完 , 阅读速度慢就晚点看完 , 没关系 , 比起小红把书递给小明并监督小明读完的方式 , 小明的压力会小一些 .
消息队列特点
1. 解耦 : 每个成员不必受其他成员影响 , 可以更独立自主 , 只通过一个简单的容器来联系 .
2. 提速 : 小红选只要做一个放书的动作 , 为自己节省了大量时间 .
3. 广播 : 小红只需要劳动一次 , 就可以让多个小伙伴有书可读 , 这大大地节省了她的时间 , 也让新的小伙伴的加入成本很低 .
4. 错峰与流控 : 小红给书的频率不稳定 , 如果今明两天连给了五本 , 之后隔三个月才又给一本 , 那小明只要在三个月内从书架上陆续取走五本书读完就行了 , 压力就不那么大了 .

 消息队列相关

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 绑定起来 .

Docker安装部署RabbitMQ

 拉取镜像

docker pull rabbitmq:management
注意:获取镜像的时候要获取 management 版本的 , 不要获取 last 版本的 ,management 版本的才带有管理界面
创建一个容器
docker run -itd \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \rabbitmq:management
--hostname :主机名 (RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据 , 默认为主机名 )
-e :指定环境变量 :
RABBITMQ_DEFAULT_VHOST :默认虚拟机名
RABBITMQ_DEFAULT_USER :默认的用户名
RABBITMQ_DEFAULT_PASS :默认用户名的密码
注:记得开放端口
firewall-cmd --zone=public --add-port=5672/tcp --add-port=15672/tcp --permanent
进入管理后台

创建一个用户赋予权限

赋予访问虚拟机的权限

spring连接配置 

准备工作

先搭建一个空项目作为我们的父项目,再创建两个子项目,分别为生产者和消费者,并且勾选我们所需要的依赖

修改yml配置文件

生产者:

server:port: 8888
spring:rabbitmq:host: 192.168.169.131password: 123456port: 5672username: springvirtual-host: my_vhost

消费者;

 

server:port: 9999
spring:rabbitmq:host: 192.168.169.131password: 123456port: 5672username: springvirtual-host: my_vhost

在生产者编写一个config类

package com.example.publisher;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");}@Beanpublic Queue secondQueue(){return new Queue("secondQueue");}
}

再编写一个控制类

package com.example.publisher;import com.fasterxml.jackson.databind.ObjectMapper;
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;@RestController
@SuppressWarnings("all")
public class TestController {@Autowiredprivate AmqpTemplate template;@Autowiredprivate ObjectMapper objectMapper;@RequestMapping("/send1")public String send1(){template.convertAndSend("firstQueue","hello world");return "😒";}@RequestMapping("/send2")public String send2 () throws Exception{User yhx=new User("yhx","520");String json = objectMapper.writeValueAsString(yhx);template.convertAndSend("secondQueue",yhx);return "😒";}
}

然后在消费者编写一个Receiver

package com.example.consumer;import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues="firstQueue")
public class Receiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void process(String json) throws Exception{Object user = objectMapper.readValue(json, User.class);log.warn("接收到:" + user);}
}

再编写一个User完成自定义数据发送

package com.example.publisher;import lombok.*;import java.io.Serializable;@SuppressWarnings("all")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {private String username;private String userpwd;
}

在网页上访问一下

我们可以发现RabbitMQ管理页面上也有

 

相关文章:

RabbitMQ安装和使用

简介 RabbitMQ是一套开源(MPL)的消息队列服务软件,是由LShift提供的一个Advanced Message Queuing Protocol (AMQP) 的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成。所有主要的编程语言均有与代理接口通讯的客户端库…...

使用pyechart创建折线图

import json from pyecharts.charts import Line from pyecharts import options# 首先使用文件打开数据 f_us open(Desktop/python/Project/数据可视化/美国.txt,r,encoding"UTF-8") f_rb open(Desktop/python/Project/数据可视化/日本.txt,r,encoding"UTF-8…...

Vue3+Ts:使用i18n实现国际化与全局动态下拉框框切换语言

Vue3Ts&#xff1a;使用i18n实现国际化与全局动态下拉框框切换语言 一、下载依赖&#xff1a;二、创建ts文件并配置main.ts三&#xff0c;如何使用1.在<template>中使用2.在setup中使用 四、全局下拉框动态切换 一、下载依赖&#xff1a; npm install vue-i18nnex二、创…...

多目标优化中常用的差分进化算法DE【2】

# 多目标优化中常用的进化算法 1、链接一 2、链接二 #后续继续补充多目标的差分进化算法MODE的应用 此链接介绍很详细&#xff0c;此处用来分享学习&#xff0c;后续有问题会继续进行补充。 如果你觉得不错&#xff0c;佛系随缘打赏&#xff0c;感谢&#xff0c;你的支持是…...

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase&#xff0c;到如今 3 个核心业务应用 OceanBase&#xff0c;国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案&#xff0c;选择升级至 OceanBase&#xff1f;杭州游卡网络技术有限公司&#xff08;…...

LightDB - oracle_fdw 过滤条件下推增强【24.1】

LightDB - oracle_fdw 过滤条件下推增强【24.1】 1. 字符串比较下推1.1 示例 2. 隐式转换下推2.1 示例 3. nvl 和trim 下推3.1 示例 LightDB 在24.1版本对oracle_fdw 的where下推进行了增强&#xff0c;新增对如下两种情况进行下推&#xff1a; 字符串比较下推&#xff0c;如 …...

【计算机网络】HTTP协议以及简单的HTTP服务器实现

文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总…...

04 SpringBoot整合Druid/MyBatis/事务/AOP+打包项目

整合Druid 项目结构&#xff1a; 引入依赖&#xff1a; <?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:schemaL…...

C++程序编译时的_GLIBCXX_USE_CXX11_ABI参数的值选择,适配昇腾Transformer推理加速库与LLM推理模型库

目录 2024/1/19日更新确定已安装G编译测试程序获取宏值安装对应的Transformer LLM推理模型库和Transformer推理加速库小结 2024/1/19日更新 具体使用cxx11abi0 还是cxx11abi1 可通过python命令查询 import torch torch.compiled_with_cxx11_abi()若返回True 则使用 cxx11abi1…...

什么是站群服务器?

网站群服务器是管理多个网站的强大工具&#xff0c;可以帮助站长轻松管理和维护多个网站&#xff0c;提高网站运营效率。在本文中&#xff0c;我们将讨论站点组服务器的优势&#xff0c;以及为什么它是网站管理员不可或缺的工具。 介绍站群服务器 网站群服务器是一个集中管理…...

《WebKit 技术内幕》之四(3): 资源加载和网络栈

3. 网络栈 3.1 WebKit的网络设施 WebKit的资源加载其实是交由各个移植来实现的&#xff0c;所以WebCore其实并没有什么特别的基础设施&#xff0c;每个移植的网络实现是非常不一样的。 从WebKit的代码结构中可以看出&#xff0c;网络部分代码的确比较少的&#xff0c;它们都在…...

vue3-模板引用

//1.调用ref函数 -> ref对象 const h1Ref ref(null) const comRef ref(null) //组件挂载完毕之后才能获取 onMounted(()>{console.log(h1Ref.value);console.log(comRef.value); })<div class"father"><!-- 通过ref标识绑定ref对象 --><h2 re…...

聚类模型评估指标

聚类模型评估指标-轮廓系数 计算样本i到同簇其它样本到平均距离ai&#xff0c;ai越小&#xff0c;说明样本i越应该被聚类到该簇&#xff08;将ai称为样本i到簇内不相似度&#xff09;&#xff1b;计算样本i到其它某簇Cj的所有样本的平均距离bij&#xff0c;称为样本i与簇Cj的…...

测试 ASP.NET Core 中间件

正常情况下&#xff0c;中间件会在主程序入口统一进行实例化&#xff0c;这样如果想单独测试某一个中间件就很不方便&#xff0c;为了能测试单个中间件&#xff0c;可以使用 TestServer 单独测试。 这样便可以&#xff1a; 实例化只包含需要测试的组件的应用管道。发送自定义请…...

智能小程序小部件(Widget)媒体组件属性说明和示例代码汇总

camera 基础库 2.2.0 开始支持, 低版本需做兼容处理。 系统相机。相关 API&#xff1a;ty.createCameraContext。这是基于异层渲染的原生组件, 请注意原生组件使用限制。 属性说明 属性名类型默认值必填说明modestringnormal否应用模式&#xff0c;只在初始化时有效&#xff…...

enum的比较

enum的比较 使用enum定义的枚举类是一种引用类型。 前面我们讲到&#xff0c;引用类型比较&#xff0c;要使用equals()方法&#xff0c;如果使用比较&#xff0c;它比较的是两个引用类型的变量是否是同一个对象。 因此&#xff0c;引用类型比较&#xff0c;要始终使用equals…...

网工每日一练(1月15日)

1.某计算机系统由下图所示的部件构成&#xff0c;假定每个部件的千小时可靠度为R&#xff0c;则该系统的千小时的可靠度为 ( D ) 。 2.以下IP地址中&#xff0c;属于网络 201.110.12.224/28 的主机IP是&#xff08; B &#xff09;。 A.201.110.12.224 B.201.110.12.238 C.20…...

henauOJ 1113: 计算x的n次方

题目描述 给定x和n&#xff0c;计算出x^n。 0<x<10,0<n<9; 要求定义一个函数:int pow1(int x,int n);//返回x^n。 本题只允许提交函数及其内容&#xff0c;提交多余内容会编译错误 C/C函数原型 int pow1(int x,int n); Java函数原型 public static int pow1(int…...

64.Spring事件监听的核心机制是什么?

Spring事件监听的核心机制是什么? spring的事件监听有三个部分组成 事件(ApplicationEvent) 负责对应相应监听器 事件源发生某事件是特定事件监听器被触发的原因监听器(ApplicationListener) 对应于观察者模式中的观察者。监听器监听特定事件,并在内部定义了事件发生后的响应…...

《C++大学教程》3.12Account类

题目&#xff1a; (Account类)创建一个名为Account 的类&#xff0c;银行可以使用它表示客户的银行账户。这个类应该包括一个类型为int 的数据成员&#xff0c;表示账户余额。【注意:在后续章节中&#xff0c;将使用称为浮点值的包含小数点的数(例如2.75)表示美元数。】 这个…...

【工作记录】基于springboot3+springsecurity实现多种方式登录及鉴权(二)

前言 上篇文章介绍了基于springboot3+springsecurity实现的基于模拟数据的用户多种方式登录及鉴权的流程和代码实现,本文我们继续完善。 主要完善的点 主要通过如下几个点来完成优化和完善: 用户信息获取通过查询mysql数据库实现token生成方式使用jwt用户信息存储及读取使用…...

CSS笔记III

选择器 结构伪类选择器 作用&#xff1a;根据元素的结构关系查找元素 选择器说明E:first-child查找第一个E元素E:last-child查找最后一个E元素E:nth-child(N)查找第N个E元素(第一个元素N值为1) nth-child(公式) 作用是可以根据元素的结构关系查找多个元素 偶数标签&#x…...

Bit.Store 加密卡集成主流 BRC20通证,助力 BTC 生态流动性

...

openssl3.2 - 官方demo学习 - mac - siphash.c

文章目录 openssl3.2 - 官方demo学习 - mac - siphash.c概述笔记END openssl3.2 - 官方demo学习 - mac - siphash.c 概述 MAC算法为 SIPHASH, 设置参数(C-rounds, D-rounds, 也可以不设置, 有默认值) 用key初始化MAC算法, 算明文的MAC值 笔记 /*! \file siphash.c \note op…...

(六)深入理解Bluez协议栈之“GATT Client Profile”

前言: 本章节我们继续介绍GATT Client Profile的实现,参考的程序是tools\btgatt-client.c,需要注意的一点,在./configure时,需要添加 --enable-test --enable-testing才会编译该c文件,编译完成后,生成的可执行程序为btgatt-client。本文主要以btgatt-client运行时可能会…...

SVO编译

文章目录 软件版本错误编译运行轨迹路径保存运行TUM数据集 附录针对svo slam的/svo/pose_imu转为tum格式代码 软件版本 ubuntu 20 rosnoeticSVO SLAM虚拟机 windows 11 错误 常见的git clone问题可以使用DevSidecar解决&#xff0c;在 加速服务-基本设置-绑定IP 设置为0.0.0…...

探索未知:最新发布的顶级浏览器,为你带来前所未有的浏览体验

目录 学习目标&#xff1a; 学习内容&#xff1a; 学习时间&#xff1a; 学习产出&#xff1a; 基本功能和操作方法&#xff1a; 如何打开和关闭浏览器 如何新建和关闭标签页 前进、后退、刷新页面等导航操作 使用地址栏和搜索栏进行访问和搜索 管理浏览器的历史记录 高级功能&…...

EasyX图形化学习(三)

1.帧率&#xff1a; 即每秒钟界面刷新次数&#xff0c;下面以60帧为例&#xff1a; 1.数据类型 clock_t&#xff1a; 用来保存时间的数据类型。 2.clock( ) 函数&#xff1a; 用于返回程序运行的时间,无需参数。 3.例子&#xff1a; 先定义所需帧率&#xff1a; const …...

git-生成证书、公钥、私钥、error setting certificate verify locations解决方法

解决方法 方法1-配置证书、公钥、私钥打开Git Bash设置名称和邮箱执行&#xff0c;~/.ssh执行&#xff0c;ssh-keygen -t rsa -C "这是你的邮箱"&#xff0c;如图&#xff1a;进入文件夹可以看到用记事本之类的软件打开id_rsa.pub文件&#xff0c;并且复制全部内容。…...

论文笔记(四十)Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds

Goal-Auxiliary Actor-Critic for 6D Robotic Grasping with Point Clouds 文章概括摘要1. 介绍2. 相关工作3. 学习 6D 抓握政策3.1 背景3.2 从点云抓取 6D 策略3.3 联合运动和抓握规划器的演示3.4 行为克隆和 DAGGER3.5 目标--辅助 DDPG3.6 对未知物体进行微调的后视目标 4. 实…...