Minio容器化部署并整合SpringBoot

1、启动minio容器

powershell 复制代码
docker run  -p 9000:9000 -p 9090:9090 --name minio  -d --restart=always  -e MINIO_ACCESS_KEY=minio  -e MINIO_SECRET_KEY=minio  -v /usr/local/minio/data:/data  -v /usr/local/minio/config:/root/.minio   minio/minio server /data  --console-address ":9000" --address ":9090"
9000端口 控制台页面使用
9090端口 开发时上传下载使用的端口
MINIO_ACCESS_KEY=minio 控制台登录账号
MINIO_SECRET_KEY=minio 控制台登录密码

2、可视化页面

地址 http://ip+9000

账号 运行容器时的MINIO_ACCESS_KEY

密码 运行容器时的MINIO_SECRET_KEY

2.1 创建bucket


2.2 修改bucket权限策略


2.3 生成上传使用的鉴权账户

这个在整合SpringBoot中会使用到

3、整合SpringBoot

3.1 引入依赖

xml 复制代码
<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.4.3</version>
</dependency>
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.8.1</version>
    <scope>compile</scope>
</dependency>

3.2 增加配置

yaml 复制代码
minio:
     host: http://192.168.31.71:9090
     access-key: admin
     secret-key: admin
     
java 复制代码
@Configuration
public class MinIoConfig {

    @Value(value = "${minio.host}")
    private String host;

    @Value(value = "${minio.access-key}")
    private String accessKey;

    @Value(value = "${minio.secret-key}")
    private String secretKey;

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

3.3 文件操作

java 复制代码
public interface MinIoUploadService {
    boolean uploadFileToMinIo(String bucket,String fileName,MultipartFile file);
    boolean createBucket(String bucketName);
}
java 复制代码
@Slf4j
@Service
public class MinIoUploadServiceImpl implements MinIoUploadService {

    @Autowired
    private MinioClient minioClient;



    /**
     * 上传到minio
     * @param bucket
     * @param fileName
     * @param inputStream
     * @throws Exception
     */
    @Override
    public boolean uploadFileToMinIo(String bucket,String fileName,InputStream inputStream) {
        try {
            PutObjectArgs putObjectArgs = PutObjectArgs.builder()
                    .object(fileName)//文件名
                    .bucket(bucket)//桶名词  与minio创建的名词一致
                    //   fileInputStream.available() 表示一直有内容就会上传  -1 表示将所有的相关文件的内容都上传
                    .stream(inputStream, inputStream.available(), -1) //文件流
                    .build();
            minioClient.putObject(putObjectArgs);
            return true;
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return false;
    }
 	/**
     * 创建bucket
     * @param bucketName
     * @return
     */
    @Override
    public boolean createBucket(String bucketName){
        try {
            BucketExistsArgs bucket = BucketExistsArgs.builder().bucket(bucketName).build();
            if (!minioClient.bucketExists(bucket)) {
                MakeBucketArgs make = MakeBucketArgs.builder().bucket(bucketName).build();
                minioClient.makeBucket(make);
            }
            return true;
        }catch (Exception e){
            log.error(e.getMessage(),e);
        }
        return false;
    }
}
java 复制代码
@Slf4j
@Api(tags = "文件上传控制层")
@RestController
@RequestMapping("/upload")
public class UploadFileController {


    @Autowired
    private MinIoUploadService minIoUploadService;

    @PostMapping("/uploadFile")
    public Result uploadFile(@RequestBody MultipartFile file){
        minIoUploadService.uploadFileToMinIo("data", UUID.randomUUID().toString(),file);
        return Result.success();
    }

}

4、问题梳理

4.1 OkHttp 依赖问题

Unsupported OkHttp library found. Must use okhttp >= 4.8.1

解决方法

引入版本在4.8.1以上的okhttp依赖

xml 复制代码
<dependency>
    <groupId>com.squareup.okhttp3</groupId>
    <artifactId>okhttp</artifactId>
    <version>4.8.1</version>
    <scope>compile</scope>
</dependency>

4.2 访问不通Minio问题

io.minio.errors.InvalidResponseException: Non-XML response from server. Response code: 403

S3 API Request made to Console port. S3 Requests should be sent to API port.

解决方法

首先排查一下连接的地址以及账号密码,这里的地址主要是看一下端口号,搭建minio时会暴露两个端口,一个是操作页面的端口,一个是上传文件的端口,例如本文是通过docker搭建的,暴露了两个端口 9000和9090,其中9000是页面访问使用的,9090是我们文件上传使用的

其次排查一下账号密码,这里的账号密码不是指登录页面使用的,而是登陆后在Service Accounts中创建的

相关推荐
极客先躯28 分钟前
高级java每日一道面试题-2024年10月3日-分布式篇-分布式系统中的容错策略都有哪些?
java·分布式·版本控制·共识算法·超时重试·心跳检测·容错策略
夜月行者1 小时前
如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue
java·后端·ssm
程序猿小D1 小时前
第二百六十七节 JPA教程 - JPA查询AND条件示例
java·开发语言·前端·数据库·windows·python·jpa
Yvemil71 小时前
RabbitMQ 入门到精通指南
开发语言·后端·ruby
sdg_advance1 小时前
Spring Cloud之OpenFeign的具体实践
后端·spring cloud·openfeign
潘多编程1 小时前
Java中的状态机实现:使用Spring State Machine管理复杂状态流转
java·开发语言·spring
_阿伟_1 小时前
SpringMVC
java·spring
代码在改了2 小时前
springboot厨房达人美食分享平台(源码+文档+调试+答疑)
java·spring boot
猿java2 小时前
使用 Kafka面临的挑战
java·后端·kafka
碳苯2 小时前
【rCore OS 开源操作系统】Rust 枚举与模式匹配
开发语言·人工智能·后端·rust·操作系统·os