专门做商标的网站有哪些,微网站样式,河间申梦网站建设制作,郑州商标设计公司前言
RabbitMQ 是在 AMQP#xff08;Advanced Message Queuing Protocol#xff09; 协议标准基础上完整的#xff0c;可复用的企业消息系统。它遵循 Mozilla Public License 开源协议#xff0c;采用 Erlang 实现的工业级的消息队列(MQ)服务器#xff0c;建立在 Erlang …前言
RabbitMQ 是在 AMQPAdvanced Message Queuing Protocol 协议标准基础上完整的可复用的企业消息系统。它遵循 Mozilla Public License 开源协议采用 Erlang 实现的工业级的消息队列(MQ)服务器建立在 Erlang OTP 平台上因为采用 Erlang 开发所以 RabbitMQ 稳定性和可靠性比较高
其他主流 MQ 产品
ActiveMQApache 出品最流行的能力强劲的开源消息总线基于 JMSJava Message Service规范RocketMQ阿里低延迟、高并发、高可用、高可靠的分布式消息中间件基于 JMS目前由 Apache 基金会维护Kafka分布式分区的多副本的多订阅者的消息发布订阅系统分布式 MQ 系统可以用于搜索日志监控日志访问日志等
本文为 RabbitMQ 入门教程主要将会讲解 RabbitMQ 安装配置Windows相关概念及项目中具体应用 安装
Erlang 官网下载链接Downloads - Erlang/OTP RabbitMQ 服务器必须首先安装 Erlang 运行环境同时安装时需要注意 RabbityMQ 所依赖的 Erlang 版本我们可以查看下方官方版本对应信息
版本对应RabbitMQ Erlang Version Requirements — RabbitMQ
本次使用版本 Erlang OTP 25.3点击跳转下载链接 双击执行 exe 安装程序除了安装路径其他都按照默认即可
然后配置环境变量
ERLANG_HOME D:\Erlang\Erlang\Erlang OTP并且添加 /bin 目录到 Path 环境变量中即添加 %ERLANG_HOME%\bin 到 Path 中
安装配置之后打开 CMD输入 erl 然后回车键会弹出版本信息表示 Erlang 安装成功
RabbitMQ 官方下载页面RabbitMQ Changelog — RabbitMQ 下载链接 RabbitMQ 3.12.0
安装 exe 文件执行安装包同样除了安装路径外其他保持默认
配置环境变量
RABBITMQ_SERVER D:\RabbitMQ\RabbitMQ\rabbitmq_server-3.12.0然后添加 %RABBITMQ_SERVER%\sbin 到 Path 环境变量中
查看所有插件
rabbitmq-plugins list注如果出现问题请参考最后一章 彻底卸载 之后我们需要安装 rabbitmq_management 插件可以使用可视化的方式查看 RabbitMQ 服务器实例的状态以及操控 RabbitMQ 服务器
# 安装插件
rabbitmq-plugins enable rabbitmq_management访问管理界面 http://localhost:15672/ 账号密码guest / guest 前期安装配置完毕下面可以配合官方入门文档学习 官方文档RabbitMQ Tutorials — RabbitMQ 消息队列
定义
消息指的是两个应用间传递的数据。数据的类型有很多种形式可能只包含文本字符串也可能包含嵌入对象。
“消息队列(Message Queue)”是在消息的传输过程中保存消息的容器。在消息队列中通常有生产者和消费者两个角色。生产者只负责发送数据到消息队列谁从消息队列中取出数据处理他不管。消费者只负责从消息队列中取出数据处理他不管这是谁发送的数据 作用
解耦。如图所示。假设有系统 B、C、D 都需要系统 A 的数据于是系统 A 调用三个方法发送数据到 B、C、D。这时系统 D 不需要了那就需要在系统 A 把相关的代码删掉。假设这时有个新的系统 E 需要数据这时系统 A 又要增加调用系统 E 的代码。为了降低这种强耦合就可以使用 MQ系统 A 只需要把数据发送到 MQ其他系统如果需要数据则从 MQ 中获取即可 异步。如图所示。一个客户端请求发送进来系统 A 会调用系统 B、C、D 三个系统同步请求的话响应时间就是系统 A、B、C、D 的总和也就是 800ms。如果使用 MQ系统 A 发送数据到 MQ然后就可以返回响应给客户端不需要再等待系统 B、C、D 的响应可以大大地提高性能。对于一些非必要的业务比如发送短信发送邮件等等就可以采用 MQ 削峰。如图所示。这其实是 MQ 一个很重要的应用。假设系统 A 在某一段时间请求数暴增有 5000 个请求发送过来系统 A 这时就会发送 5000 条 SQL 进入 MySQL 进行执行MySQL 对于如此庞大的请求当然处理不过来MySQL 就会崩溃导致系统瘫痪。如果使用 MQ系统 A 不再是直接发送 SQL 到数据库而是把数据发送到 MQMQ 短时间积压数据是可以接受的然后由消费者每次拉取 2000 条进行处理防止在请求峰值时期大量的请求直接发送到 MySQL 导致系统崩溃 特点
可靠性通过支持消息持久化支持事务支持消费和传输的 ack 等来确保可靠性
路由机制支持主流的订阅消费模式如广播订阅headers 匹配等
扩展性多个 RabbitMQ 节点可以组成一个集群也可以根据实际业务情况动态地扩展集群中节点
高可用性队列可以在集群中的机器上设置镜像使得在部分节点出现问题的情况下队仍然可用
多种协议RabbitMQ 除了原生支持 AMQP 协议还支持 STOMPMQTT 等多种消息中间件协议
多语言客户端RabbitMQ 几乎支持所有常用语言比如 Java、Python、Ruby、PHP、C#、JavaScript 等
管理界面RabbitMQ 提供了易用的用户界面使得用户可以监控和管理消息、集群中的节点等
插件机制RabbitMQ 提供了许多插件以实现从多方面进行扩展当然也可以编写自己的插件
应用
本章将会集成 rabbitmq 到 SpringBoot 中并使用 rabbitmq-provider 生产者和 rabbitmq-consumer消费者 两个项目进行具体讲解, 也可以在父项目中创建这两个模块本文采用父子模块方式
所有代码示例已经上传到 GitHub 仓库
仓库地址ReturnTmp/rabbitmq-demo: rabbitmq 实例代码 (github.com)
生产者
配置
创建子模块 rabbitmq-provider
依赖配置也可以 IDEA 初始化模块直接勾选 !--rabbitmq--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencyapplication.yml
server: port: 8021
spring: application: name: rabbitmq-provider rabbitmq: host: 127.0.0.1 port: 5672 username: root password: 111111 virtual-host: RootHost其中虚拟 host 配置项不是必须的需要自行创建 vhost如果未自行创建默认为 virtual-host: / 注vhost 可以理解为虚拟 broker即 mini-RabbitMQ server其内部均含有独立的 queue、bind、exchange 等最重要的是拥有独立的权限系统可以做到 vhost 范围内的用户控制。当然从 RabbitMQ 全局角度vhost 可以作为不同权限隔离的手段 可以按照如下步骤创建 vhost 然后创建用户管理员 然后我们需要为用户分配权限指定使用我们刚刚创建的 vhost 代码
创建直连交换机配置类 注RabbitMQ 共有四种交换机分别为直连交换机扇形交换机主题交换机首部交换机。这里使用直连交换机演示其他读者可以自行尝试 Configuration
public class DirectRabbitConfig {//队列 起名TestDirectQueueBeanpublic Queue TestDirectQueue() {// durable:是否持久化,默认是false,持久化队列会被存储在磁盘上当消息代理重启时仍然存在暂存队列当前连接有效// exclusive:默认也是false只能被当前创建的连接使用而且当连接关闭后队列即被删除。此参考优先级高于durable// autoDelete:是否自动删除当没有生产者或者消费者使用此队列该队列会自动删除。// return new Queue(TestDirectQueue,true,true,false);//一般设置一下队列的持久化就好,其余两个就是默认falsereturn new Queue(TestDirectQueue, true);}//Direct交换机 起名TestDirectExchangeBeanDirectExchange TestDirectExchange() {// return new DirectExchange(TestDirectExchange,true,true);return new DirectExchange(TestDirectExchange, true, false);}//绑定 将队列和交换机绑定, 并设置用于匹配键TestDirectRoutingBeanBinding bindingDirect() {return BindingBuilder.bind(TestDirectQueue()).to(TestDirectExchange()).with(TestDirectRouting);}BeanDirectExchange lonelyDirectExchange() {return new DirectExchange(lonelyDirectExchange);}}然后写简单的接口进行消息推送可以视情况写为定时任务
RestController
public class SendMessageController {AutowiredRabbitTemplate rabbitTemplate; //使用RabbitTemplate,这提供了接收/发送等等方法GetMapping(/sendDirectMessage)public String sendDirectMessage() {String messageId String.valueOf(UUID.randomUUID());String messageData test message, hello!;String createTime LocalDateTime.now().format(DateTimeFormatter.ofPattern(yyyy-MM-dd HH:mm:ss));MapString, Object map new HashMap();map.put(messageId, messageId);map.put(messageData, messageData);map.put(createTime, createTime);//将消息携带绑定键值TestDirectRouting 发送到交换机TestDirectExchangerabbitTemplate.convertAndSend(TestDirectExchange, TestDirectRouting, map);return ok;}
}启动项目调用接口 http://localhost:8021/sendDirectMessage
查看 RabbitMQ 管理页面查看是否推送成功 消费者
配置
创建子模块 rabbitmq-consumer
依赖配置 !--rabbitmq--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-amqp/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencyapplication.yml
server: port: 8022
spring: application: name: rabbitmq-consumer rabbitmq: host: 127.0.0.1 port: 5672 username: root password: 111111 virtual-host: RootHost代码
创建消息接收监听类
Component
RabbitListener(queues TestDirectQueue)
public class DirectReceiver {RabbitHandlerpublic void process(Map testMessage) {System.out.println(DirectReceiver receive message: testMessage.toString());}
}之后启动项目查看消费者接收情况 序列化
发送接收消息可能出现 Failed to convert message 问题可以通过使用 JSON 序列化传输信息方式解决
生产者
Configuration
public class RabbitMQConfig implements InitializingBean {/*** 自动注入RabbitTemplate模板*/Resourceprivate RabbitTemplate rabbitTemplate;/*** 发送消息JSON序列化*/Overridepublic void afterPropertiesSet() {//使用JSON序列化rabbitTemplate.setMessageConverter(new Jackson2JsonMessageConverter());}
}消费者
Configuration
public class RabbitMQConfig {Beanpublic MessageConverter jsonMessageConverter(ObjectMapper objectMapper) {return new Jackson2JsonMessageConverter(objectMapper);}
}彻底卸载
我们安装中可能出现各种问题一般情况下是 RabbitMQ 和 Erlang 版本不对应需要完全卸载 RabbitMQ 和 Erlang可以按照如下步骤卸载 注博主首次安装使用的是 Erlang 20.3 Rabbit 3.7.15 之后似乎小版本不对应出现问题需要重新卸载安装 1打开 Windows 控制面板双击“程序和功能”。
2在当前安装的程序列表中右键单击 RabbitMQ Server然后单击“卸载”。
3在当前安装的程序列表中右键单击“Erlang OTP”然后单击“卸载”。
4打开 Windows 任务管理器。
5在任务管理器中查找进程 epmd.exe。 如果此进程仍在运行请右键单击该进程然后单击“结束进程”。
6删除 RabbitMQ 和 Erlang 的所有安装目录。
7删除文件 C:\Windows\System32\config\systemprofile.erlang.cookie如果存在。
8转到用户文件夹C:\Users\[username]然后删除文件.erlang.cookie。
9同样在 User 文件夹中转到 AppData \ Roaming \ RabbitMQ。删除 RabbitMQ 文件夹。
10删除注册表 HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv 的子项。
11打开运行 cmd-sc delete RabbitMQ。
12打开运行-regedit 找到 RabbitMQ 节点删掉即可如果存在
参考链接
Windows 下安装 RabbitMQ 服务器及基本配置 - 蓝之风 - 博客园 (cnblogs.com)RabbitMQ Windows 安装、配置、使用 - 小白教程-阿里云开发者社区 (aliyun.com)Windows 如何完全卸载 RabbitMQ 和 Erlang 删除注册表windows 下 Erlang 与 RabbitMQ 重新安装时由于卸载不干净导致各类错误超详细的 RabbitMQ 入门看这篇就够了-阿里云开发者社区 (aliyun.com)RabbitMQ 整合 Spring Boot实现 Hello WorldSpringboot 整合 RabbitMq 用心看完这一篇就够了RabbitMq 核心知识点小结 - 知乎 (zhihu.com)RabbitMQ消费消息坑failed to convert serialized Message content - jiuchengi 本文由博客一文多发平台 OpenWrite 发布