• Springboot整合RabbitMQ消息中间件


    1、RabbitMQ概述

    RabbitMQ是shiyongERLANG语言编写的,实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。

    常见的消息中间件:KAFKA、RabbitMQ、ActiveMQ、RocketMQ(可以处理分布式事务)

    1.1、什么是RabbitMQ?

    【1、通过案例理解RabbitMQ】

    你想和远方的好友实现通信,这个时候你给好友写封信,我们将写好的信封装成一个信封,将信放到邮箱中,邮差就会在规定的时间将这封信送到远方好友的手中。

    寄件人是A系统,远方好友是B系统,RabbitMQ就是邮箱,邮差就是信道。A系统和B系统可以通过RabbitMQ实现通信。

    【2、为什么要使用RabbitMQ? 】

    1、RabbitMQ实现了AMQP标准的消息服务器

    2、可靠性,RabbitMQ的持久化支持,保证了消息的稳定性;

    3、RabbitMQ使用了Erlang开发语言,高并发、高可用、集群部署简单等特性;

    【3、RabbitMQ能做什么?】

    1、业务解耦:下订单、扣减库存、生成订单、发红包、发短信、异步操作、日志处理、跨平台通信等。

    2、流量消峰:控制请求量。

    3、路由灵活:RabbitMQ有丰富的Exchange(交换器),通过关键字Routingkey判断消息的具体队列(Queue)。

    1.2、RabbitMQ消息发送原理

    1、生产者生产消息,发送给服务器端的Exchange交换器。

    2、Exchange收到消息,根据用户发送的RoutingKey,将消息转发给匹配的Queue1或Queue2。

    3、Queue1或Queue2收到消息后,将消息发送给订阅者(消费者1或消费者2)。

    4、消费者收到消息,发送ACK给队列确认收到消息。

    5、消费者收到ACK确认消息,然后删除队列中缓存的对应消息。

    dca3fe6b9f3d480ab6fe2611515fe340.png

     

    1.3、RabbitMQ在项目中的应用

    A系统和B系统之间如果不是使用同一架构或者语言编写的,这个时候可以通过RabbitMQ进行通信。

    如A系统可以发送JSON类型的数据,B系统获取数据的时候可以解析JSON,达到跨系统交互。

    662881c4878e448ea967d303cc1c1ac9.png

     

    2、Springboot整合RabbitMQ

    2.1、配置工程包信息

    核心包:spring-cloud-starter-bus-amqp

    35f70826848b4c8eb32fb1ee5330d24f.png

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <parent>
    6. <groupId>org.springframework.bootgroupId>
    7. <artifactId>spring-boot-starter-parentartifactId>
    8. <version>2.7.17version>
    9. <relativePath/>
    10. parent>
    11. <groupId>com.txcgroupId>
    12. <artifactId>springbootrabbitmqdemoartifactId>
    13. <version>0.0.1-SNAPSHOTversion>
    14. <name>springbootrabbitmqdemoname>
    15. <description>springbootrabbitmqdemodescription>
    16. <properties>
    17. <java.version>1.8java.version>
    18. properties>
    19. <dependencies>
    20. <dependency>
    21. <groupId>org.springframework.bootgroupId>
    22. <artifactId>spring-boot-starter-amqpartifactId>
    23. dependency>
    24. <dependency>
    25. <groupId>org.springframework.bootgroupId>
    26. <artifactId>spring-boot-starter-webartifactId>
    27. dependency>
    28. <dependency>
    29. <groupId>org.projectlombokgroupId>
    30. <artifactId>lombokartifactId>
    31. <optional>trueoptional>
    32. dependency>
    33. <dependency>
    34. <groupId>org.springframework.bootgroupId>
    35. <artifactId>spring-boot-starter-testartifactId>
    36. <scope>testscope>
    37. dependency>
    38. <dependency>
    39. <groupId>org.springframework.amqpgroupId>
    40. <artifactId>spring-rabbit-testartifactId>
    41. <scope>testscope>
    42. dependency>
    43. dependencies>
    44. <build>
    45. <plugins>
    46. <plugin>
    47. <groupId>org.springframework.bootgroupId>
    48. <artifactId>spring-boot-maven-pluginartifactId>
    49. <configuration>
    50. <excludes>
    51. <exclude>
    52. <groupId>org.projectlombokgroupId>
    53. <artifactId>lombokartifactId>
    54. exclude>
    55. excludes>
    56. configuration>
    57. plugin>
    58. plugins>
    59. build>
    60. project>

    2.2、在application.yml文件中配置连接信息

    1. spring:
    2.   rabbitmq:
    3.     addresses: localhost #IP地址
    4.     username: guest   #用户名
    5.     password: guest   #密码
    6.     dynamic: true     #默认创建一个AmqpAdmin的Bean 默认:true

    2.3、在工程中创建RabbitMQ消息接收程序

    @RabbitListener(queuesToDeclare = @Queue("myQueue "))作用:

    1、让监听关联到myQueue队列中

    2、queuesToDeclare能够实现当myQueue队列不存在的时候,自动创建

    3、queuesToDeclare:后面的参数需要的是数组类型使用@Queue创建

    1. @Configuration
    2. public class RabbitMQReceive {
    3. @RabbitListener(queuesToDeclare = @Queue("myQueue"))
    4. public void process(String message){
    5. System.out.println("======消费消息====="+message);
    6. }
    7. }

    2.4、在工程中创建RabbitMQ消息发送程序

    创建控制层,模拟向RabbitMQ消息中间件发送消息。

    通过convertAndSend向RabbitMQ发送消息。

    1. @Controller
    2. public class TestRabbitMQController {
    3. @Resource
    4. private AmqpTemplate amqpTemplate;
    5. @RequestMapping("/sendMessageToQueue")
    6. @ResponseBody
    7. public void sendMessageToQueue(){
    8. amqpTemplate.convertAndSend("myQueue","{'code':'200','msg':'你想发的消息。'}");
    9. }
    10. }

    2.5、测试结果

     访问地址:http://localhost:8080/sendMessageToQueue

    836e32d15dc742a1bc931bed12b44ac8.png

    3、创建Exchange(交换器)绑定Queue

    3.1、Exchange交换器的使用场景

    4f748e5d9a2d4405a32d7274aa0f35d8.png

    我们要实现如果是华为的订单就发送到huaweiQueue队列中,如果是联想的订单就发送到lenovoQueue队列中。

    主要就是通过RoutingKey(huaweiKey、lenovoKey)来实现。

    3.2、在工程中创建RabbitMQ接收器

    通过@RabbitListener实现创建huaweiQueue队列和computerExchange交换器,并通过huaweiKey实现队列和交换器绑定。

    在不指定交换器类型的情况下,默认的交换器类型是direct

    1. @RabbitListener(bindings = @QueueBinding(
    2. exchange = @Exchange("computerExchange"),
    3. key = "huaweiKey",
    4. value = @Queue("huaweiQueue")
    5. ))
    6. public void process1(String message){
    7. System.out.println("======消费消息====="+message);
    8. }

    3.3、在工程中创建RabbitmQ消息发送程序

    convertAndSend参数说明:convertAndSend(“交换器名称”,”绑定key”,”需要发送的消息”);

    1. @RequestMapping("/sendMessageToExchange")
    2. @ResponseBody
    3. public void sendMessageToExchange(){
    4. amqpTemplate.convertAndSend("computerExchange","huaweiKey","{'code':'200','msg':'测试Exchange和Queue绑定'}");
    5. }

    3.4、测试结果

    访问地址:http://localhost:8080/sendMessageToExchange

    011d3f11045445a089eb121b8edbc6d6.png

     

     

     

  • 相关阅读:
    强化学习代码实战(3) --- 寻找真我
    越南公司注册要求
    RocketMQ高性能核心原理与源码架构剖析
    linux查找命令使用的正则表达式
    自己写个网盘系列:① 来学习开启这个项目吧
    Jetson nano安装torch和torchvision
    微信支付-前后端分离
    关键主题汇编
    特斯拉、比亚迪等企业为何交付难?装备企业如何应对准交难题?
    计算机毕业设计SSM大学生志愿者管理系统【附源码数据库】
  • 原文地址:https://blog.csdn.net/tangshiyilang/article/details/134219168