Java项目:Java脚手架项目的通用组件的封装(七)

文章目录

  • 前言
  • 一、RabbitMQ的封装
    • [1.1 为什么封装RabbitMQ?](#1.1 为什么封装RabbitMQ?)
    • [1.2 在 common 工程下创建 common-rabbitmq 子工程](#1.2 在 common 工程下创建 common-rabbitmq 子工程)
    • [1.3 引入依赖](#1.3 引入依赖)
    • [1.4 创建包目录及 config 包](#1.4 创建包目录及 config 包)
    • [1.5 在 config 包下创建 RabbitMQConfig 类](#1.5 在 config 包下创建 RabbitMQConfig 类)
    • [1.6 在 resources 下创建自动配置](#1.6 在 resources 下创建自动配置)
  • [二、配置 nacos](#二、配置 nacos)
  • 三、验证
    • [3.1 建立生产者(Producer)和消费者(Consumer)](#3.1 建立生产者(Producer)和消费者(Consumer))
    • [3.2 创建 TestRabbitController](#3.2 创建 TestRabbitController)
    • [3.3 使用 apifox 验证](#3.3 使用 apifox 验证)
      • [3.3.1 关闭消费者](#3.3.1 关闭消费者)
      • [3.3.2 继续测试](#3.3.2 继续测试)
      • [3.3.3 打开 RabbitMq 的管理化界面](#3.3.3 打开 RabbitMq 的管理化界面)
      • [3.3.4 打开消费者](#3.3.4 打开消费者)
      • [3.3.5 重启服务](#3.3.5 重启服务)
  • END

鸡汤:
● 咬牙扛过的深夜,反复修改的方案,汗水浸透的衣衫......这些不是负担,是你正在变强大的证据。
● 微光吸引微光,努力照亮努力。你认真生活的模样,本就是照亮世界的光。

前言

封装完 redis 和 二级缓存中间件后,继续封装下一个中间件

一、RabbitMQ的封装

1.1 为什么封装RabbitMQ?

● 系统解耦:服务间通过消息通信,无需直接调用(如 HTTP/RPC)。例如:订单服务发消息后,库存、通知、积分服务各自消费,互不影响。新增/下线服务无需修改生产者代码。
● 异步处理 & 提升响应速度:耗时操作(发邮件、生成报表)转为异步:用户请求秒级返回,后台慢慢处理,用户体验和系统吞吐量双提升。
● 流量削峰:高并发场景(秒杀、促销)中,瞬时流量先存入队列,消费者按能力匀速处理,避免数据库/服务被压垮。
● 扩展性与负载均衡:横向增加消费者实例,RabbitMQ 自动分发消息,轻松应对业务增长。

1.2 在 common 工程下创建 common-rabbitmq 子工程

1.3 引入依赖

pom.xml:

java 复制代码
<?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>
    <parent>
        <groupId>com.my</groupId>
        <artifactId>common</artifactId>
        <version>1.0-SNAPSHOT</version>
    </parent>

    <groupId>com.my</groupId>
    <artifactId>common-rabbitmq</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>17</maven.compiler.source>
        <maven.compiler.target>17</maven.compiler.target>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

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

1.4 创建包目录及 config 包

1.5 在 config 包下创建 RabbitMQConfig 类

需要配置RabbitMQ的消息转换器,不然 RabbitMQ 的默认消息转换器会将数据转为二进制存储,占用的体积很大,还依赖 Serializable 接口,对象也不能自动转换。

RabbitMQConfig :

java 复制代码
package com.my.commonrabbitmq.config;

import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class RabbitMQConfig {

    @Bean("testQueue")
    public Queue queue() {
        return QueueBuilder.durable("testQueue").build();
    }

    @Bean
    public MessageConverter jsonMessageConverter() {
        return new Jackson2JsonMessageConverter();
    }
}

1.6 在 resources 下创建自动配置

最后写一遍

自动配置目录 : META.spring.org.springframework.boot.autoconfigure.AutoConfiguration.imports

二、配置 nacos

跟 redis 一样,想要使用 RabbitMQ 的服务需要配置 RabbitMQ 地址啥的,这里就放在 nacos 里管理了。


三、验证

模板服务引入我们的 common-rabbitmq 依赖

3.1 建立生产者(Producer)和消费者(Consumer)

Producer:

java 复制代码
package com.my.mstemplateservice.rabbit;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class Producer {

    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void sendMessage(Object message) {
        rabbitTemplate.convertAndSend("testQueue",message);
    }
}

Consumer:

java 复制代码
package com.my.mstemplateservice.rabbit;

import com.my.mstemplateservice.domain.MessageDTO;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@RabbitListener(queues = "testQueue")
public class Consumer {

    @RabbitHandler
    public void handleMessage(MessageDTO messageDTO) {
        System.out.println("收到消息为: " + messageDTO);
        System.out.println(MessageDTO.class);
    }
}

3.2 创建 TestRabbitController

TestRabbitController:

java 复制代码
package com.my.mstemplateservice.test;

import com.my.commondomain.domain.vo.R;
import com.my.mstemplateservice.domain.MessageDTO;
import com.my.mstemplateservice.rabbit.Producer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@Slf4j
@RequestMapping("/test/rabbitmq")
public class TestRabbitController {

    @Autowired
    private Producer producer;

    @PostMapping("/send")
    public R<Void> send () {
        MessageDTO messageDTO = new MessageDTO();
        messageDTO.setMessage("Hello World");
        messageDTO.setType("study");
        producer.sendMessage(messageDTO);
        return R.success();
    }
}

3.3 使用 apifox 验证



显示收到消息,验证正确,也可以关闭消费者,看 RabbitMq 的界面化管理工具

3.3.1 关闭消费者

3.3.2 继续测试

3.3.3 打开 RabbitMq 的管理化界面

浏览器打开 http://自己的云服务器外网ip/虚拟机内网ip:15672/

密码:admin 密码:bite@123


存在一条没有消费的消息,说明发送功能正常

3.3.4 打开消费者

3.3.5 重启服务



消息被消费,消费功能也正常


END

封装了 redis、两级缓存(redis + caffeine)、RabbitMQ 常用中间件
常用中间件的封装告一段落!

相关推荐
Aliex_git2 小时前
Gitlab Runner 配置实践
笔记·学习·ci/cd·gitlab
●VON2 小时前
HarmonyOS应用开发实战(基础篇)Day05-《常见布局Row和Column》
学习·华为·harmonyos·鸿蒙·von
xj198603192 小时前
Java进阶-在Ubuntu上部署SpringBoot应用
java·spring boot·ubuntu
Coder_Boy_2 小时前
从单体并发工具类到分布式并发:思想演进与最佳实践(二)
java·spring boot·分布式·微服务·设计模式
Web打印2 小时前
Phpask(php集成环境)之04配置网站
开发语言·前端·php
可涵不会debug2 小时前
时序数据库选型指南:Apache IoTDB深度解析与对比
java·后端·struts
郝学胜-神的一滴2 小时前
深入浅出链表:数据结构中的“珍珠项链“
开发语言·数据结构·程序人生·链表
happyboy19862112 小时前
高职数据安全与管理专业,怎么学习数据安全相关的法律法规?
学习
啊阿狸不会拉杆2 小时前
《机器学习导论》第 18 章-增强学习
人工智能·python·学习·算法·机器学习·智能体·增强学习