RabbitMQ和Minio实现头像存储

使用 RabbitMQ 处理用户头像上传任务,同时将用户头像存储在 Minio 中是一个常见的应用场景。该示例将展示如何在 Spring Boot 项目中使用 RabbitMQ 和 Minio 实现此功能。示例包括两个部分:一是将头像上传任务推送到 RabbitMQ 队列中;二是从队列中消费任务并将用户头像上传到 Minio。

首先,请确保你在 Spring Boot 项目中引入以下依赖:

XML 复制代码
<dependencies>
    <!-- Spring Boot Starter AMQP for RabbitMQ -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-amqp</artifactId>
    </dependency>

    <!-- Minio client library -->
    <dependency>
        <groupId>io.minio</groupId>
        <artifactId>minio</artifactId>
        <version>8.5.2</version>
    </dependency>
    
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

1. 配置RabbitMQ和Minio

首先,在 application.properties 文件中配置 RabbitMQ 和 Minio 的连接信息:

propertiesCopy code

bash 复制代码
# RabbitMQ 配置
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest

# Minio 配置
minio.url=http://localhost:9000
minio.accessKey=YOUR_ACCESS_KEY
minio.secretKey=YOUR_SECRET_KEY
minio.bucketName=avatars

2. 头像上传任务数据模型

定义一个数据模型来表示头像上传任务,包括用户 ID 和头像文件内容:

java 复制代码
import java.io.Serializable;

public class AvatarUploadTask implements Serializable {
    private String userId;
    private byte[] avatarData;

    // Getters and setters...
}

3. 推送头像上传任务到 RabbitMQ

在用户信息导入过程中,将头像上传任务推送到 RabbitMQ 队列:

java 复制代码
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AvatarUploadService {

    @Autowired
    private AmqpTemplate amqpTemplate;

    // 将头像上传任务推送到 RabbitMQ 队列
    public void uploadAvatar(String userId, byte[] avatarData) {
        AvatarUploadTask task = new AvatarUploadTask();
        task.setUserId(userId);
        task.setAvatarData(avatarData);

        // 推送到 RabbitMQ 队列
        amqpTemplate.convertAndSend("avatarUploadQueue", task);
    }
}

4. 从 RabbitMQ 队列消费任务并将头像上传到 Minio

创建一个消费者来从 RabbitMQ 队列中接收任务,并将用户头像上传到 Minio:

java 复制代码
import io.minio.MinioClient;
import io.minio.errors.*;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class AvatarUploadConsumer {

    @Autowired
    private MinioClient minioClient;

    @Autowired
    private AvatarUploadService avatarUploadService;

    // 从 RabbitMQ 队列消费任务
    @RabbitListener(queues = "avatarUploadQueue")
    public void consumeAvatarUploadTask(AvatarUploadTask task) {
        try {
            // 将用户头像上传到 Minio
            minioClient.putObject(
                "avatars", // 存储桶名称
                task.getUserId(), // 对象名称(用户 ID)
                task.getAvatarData(), // 头像数据
                "image/jpeg" // MIME 类型
            );
            System.out.println("Avatar uploaded for user: " + task.getUserId());
        } catch (Exception e) {
            e.printStackTrace();
            System.err.println("Failed to upload avatar for user: " + task.getUserId());
        }
    }
}

5. 配置 Minio 客户端

创建一个配置类来初始化 Minio 客户端,并将其作为 Spring Bean:

java 复制代码
import io.minio.MinioClient;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MinioConfig {

    @Value("${minio.url}")
    private String url;

    @Value("${minio.accessKey}")
    private String accessKey;

    @Value("${minio.secretKey}")
    private String secretKey;

    @Bean
    public MinioClient minioClient() {
        return MinioClient.builder()
                .endpoint(url)
                .credentials(accessKey, secretKey)
                .build();
    }
}

通过这些步骤,你可以在 Spring Boot 项目中使用 RabbitMQ 和 Minio 实现用户头像的异步上传。你可以根据具体需求进一步调整代码,以满足特定的业务需求。

相关推荐
齐 飞2 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
九圣残炎11 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge13 分钟前
Netty篇(入门编程)
java·linux·服务器
童先生15 分钟前
Go 项目中实现类似 Java Shiro 的权限控制中间件?
开发语言·go
lulu_gh_yu16 分钟前
数据结构之排序补充
c语言·开发语言·数据结构·c++·学习·算法·排序算法
LunarCod19 分钟前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
Re.不晚40 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会43 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香1 小时前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven