消息队列中间件
消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削峰等问题。
中间件最标准的用法是生产者生产消息传送到队列,消费者从队列中拿取消息并处理,生产者不用关心是谁来消费,消费者不用关心谁在生产消息,从而达到解耦的目的。在分布式的系统中,消息队列也会被用在很多其它的方面,比如:分布式事务的支持,RPC 的调用等等。
使用较多的消息队列有 ActiveMQ(安全),RabbitMQ,ZeroMQ,Kafka(大数据),MetaMQ,RocketMQ。
AMQP高级消息队列协议
AMQP,即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。AMQP 的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
RabbitMQ
RabbitMQ 是一个开源的 AMQP 实现,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP 等,支持 AJAX。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。RabbitMQ 主要是为了实现系统之间的双向解耦而实现的。当生产者大量产生数据时,消费者无法快速消费,那么需要一个中间层。保存这个数据。
RabbitMQ的优势
可靠性(Reliablity):使用了一些机制来保证可靠性,比如持久化、传输确认、发布确认。
灵活的路由(Flexible Routing):在消息进入队列之前,通过Exchange来路由消息。对于典型的路由功能,Rabbit已经提供了一些内置的Exchange来实现。针对更复杂的路由功能,可以将多个Exchange绑定在一起,也通过插件机制实现自己的Exchange。
消息集群(Clustering):多个RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
高可用(Highly Avaliable Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
多种协议(Multi-protocol):支持多种消息队列协议,如STOMP、MQTT等。
多种语言客户端(Many Clients):几乎支持所有常用语言,比如Java、.NET、Ruby等。
管理界面(Management UI):提供了易用的用户界面,使得用户可以监控和管理消息Broker的许多方面。
跟踪机制(Tracing):如果消息异常,RabbitMQ提供了消息的跟踪机制,使用者可以找出发生了什么。
插件机制(Plugin System):提供了许多插件,来从多方面进行扩展,也可以编辑自己的插件。
RabbitMQ安装(docker)
查询RabbitMQ镜像
[root@localhost ~]# docker search rabbitmqNAME DESCRIPTION STARS OFFICIAL AUTOMATEDrabbitmq RabbitMQ is an open source multi-protocol me… 4798 [OK]bitnami/rabbitmq Bitnami Docker Image for RabbitMQ 100 [OK]bitnami/rabbitmq-exporter 2circleci/rabbitmq This image is for internal use 0circleci/rabbitmq-delayed https://github.com/circleci/rabbitmq-delayed… 1

拉取镜像
[root@localhost ~]# docker pull rabbitmqUsing default tag: latestlatest: Pulling from library/rabbitmq7b1a6ab2e44d: Pull complete37f453d83d8f: Pull completee64e769bc4fd: Pull completec288a913222f: Pull complete12addf9c8bf9: Pull completeeaeb088e057d: Pull completeb63d48599313: Pull complete05c99d3d2a57: Pull complete43665bfbc3f9: Pull completeDigest: sha256:884146137011519524d506a12687127f3d2c7c37c2cc11206dc72c59bedea5e2Status: Downloaded newer image for rabbitmq:latestdocker.io/library/rabbitmq:latest
创建运行rabbitmq容器
docker run -it \--name rabbitmq \-v /etc/localtime:/etc/localtime \-v /usr/local/software/mq/data:/var/lib/rabbitmq \-e RABBITMQ_DEFAULT_USER=admin \-e RABBITMQ_DEFAULT_PASS=123 \--network wn_docker_net \--ip 172.18.12.20 \-p 15672:15672 \-p 5672:5672 \-d rabbitmq

查看运行日志
[root@localhost ~]# docker logs rabbitmq2023-06-17 02:35:10.091757+00:00 [info] <0.222.0> Feature flags: list of feature flags found:2023-06-17 02:35:10.107600+00:00 [info] <0.222.0> Feature flags: [ ] implicit_default_bindings2023-06-17 02:35:10.107642+00:00 [info] <0.222.0> Feature flags: [ ] maintenance_mode_status2023-06-17 02:35:10.107661+00:00 [info] <0.222.0> Feature flags: [ ] quorum_queue2023-06-17 02:35:10.107675+00:00 [info] <0.222.0> Feature flags: [ ] stream_queue2023-06-17 02:35:10.107749+00:00 [info] <0.222.0> Feature flags: [ ] user_limits2023-06-17 02:35:10.107764+00:00 [info] <0.222.0> Feature flags: [ ] virtual_host_metadata2023-06-17 02:35:10.107778+00:00 [info] <0.222.0> Feature flags: feature flag states written to disk: yes::## ## RabbitMQ 3.9.11## ############ Copyright (c) 2007-2021 VMware, Inc. or its affiliates.###### ############ Licensed under the MPL 2.0. Website: https://rabbitmq.comErlang: 24.2 [jit]TLS Library: OpenSSL - OpenSSL 1.1.1m 14 Dec 2021Doc guides: https://rabbitmq.com/documentation.htmlSupport: https://rabbitmq.com/contact.htmlTutorials: https://rabbitmq.com/getstarted.htmlMonitoring: https://rabbitmq.com/monitoring.html
启动管理插件
进入rabbitmq容器
[root@localhost ~]# docker exec -it rabbitmq bash
启动插件
root@6d2342d51b11:/# rabbitmq-plugins enable rabbitmq_managementEnabling plugins on node rabbit@6d2342d51b11:rabbitmq_managementThe following plugins have been configured:rabbitmq_managementrabbitmq_management_agentrabbitmq_prometheusrabbitmq_web_dispatchApplying plugin configuration to rabbit@6d2342d51b11...The following plugins have been enabled:rabbitmq_managementstarted 1 plugins.
浏览器测试

RabbitMQ hello
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>
配置
spring:rabbitmq:host: 192.168.20.65username: adminpassword: 123port: 5672
生产者
java对象
rabbitTemplate.convertAndSend("hello_queue",bookType);

@Configurationpublic class RabbitmqConfig {@Beanpublic MessageConverter messageConverter(){return new Jackson2JsonMessageConverter();}@Beanpublic RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory){RabbitTemplate rabbitTemplate = new RabbitTemplate();rabbitTemplate.setConnectionFactory(connectionFactory);rabbitTemplate.setMessageConverter(messageConverter());return rabbitTemplate;}}











