Minio使用教程

Minio

MinIO 是一个高性能的对象存储服务器,用于构建云存储解决方案。它使用Golang编写,专为私有云、公有云和混合云环境设计。它是兼容Amazon S3 API的,并可以作为一个独立的存储后端或与其他流行的开源解决方案(如Kubernetes)集成。

MinIO 允许你存储非结构化数据(如图片、视频、日志文件等)以对象的形式。与传统的文件系统(如NFS)或块存储(如iSCSI)相比,对象存储更易于扩展和管理。MinIO 提供简单的部署选项和易于使用的界面,允许你快速设置和访问存储资源。

Minio部分Api demo集成

1、添加依赖

        <!--minio服务-->

        <dependency>

            <groupId>io.minio</groupId>

            <artifactId>minio</artifactId>

            <version>8.5.13</version>

            <exclusions>

                <exclusion>

                    <artifactId>okhttp</artifactId>

                    <groupId>com.squareup.okhttp3</groupId>

                </exclusion>

            </exclusions>

        </dependency>

 

        <dependency>

            <groupId>com.squareup.okhttp3</groupId>

            <artifactId>okhttp</artifactId>

            <version>4.9.0</version>

        </dependency>

2、配置好对应的服务地址、密钥等

minio:

  endpoint: http://192.168.150.102:9000

  # minio的默认密钥

  accessKey: minio

  secretKey: minio123

3、使用配置类初始化客户端

需要获取配置文件中的属性,将属性注入到客户端中。

/**

* 初始化 MinIO 客户端

*/

@Bean

public MinioClient minioClient() {

  return MinioClient.builder()

    .endpoint(minioPropertiesConfig.getEndpoint())

    .credentials(minioPropertiesConfig.getAccessKey(), minioPropertiesConfig.getSecretKey())

    .build();

}

4、使用Api操作Minio

@RestController

@Slf4j

public class TestMinioController {

    @Resource

    private MinioClient minioClient;

 

    @RequestMapping("/upload")

    public String test() {

        try {

            boolean found =

                   minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());

            if (!found) {

                // Make a new bucket called 'test'.

                minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());

            } else {

                log.error("Bucket 'test' already exists.");

            }

        } catch (Exception e) {

            log.error("error", e);

        }

 

        //获取resource下的文件

        try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("orange.mp4")) {

            if (inputStream != null) {

                //上传文件

                minioClient.putObject(

                        PutObjectArgs.builder()

                                .bucket("test")

                                .object("video/orange.mp4")

                                // .filename("src/main/resources/orange.mp4")

                                //上传到服务器使用PutObjectArgs的这个流获取文件

                                .stream(inputStream, inputStream.available(), -1)

                                .build());

            }

        } catch (Exception e) {

            log.error("上传文件出现异常");

            return "upload fail";

        }

        log.info("upload success");

        return "upload success";

    }

 

    //返回桶列表

    @RequestMapping("/list")

    public String list() {

        try {

            // 列出所有存储桶

            List<Bucket> bucketList = minioClient.listBuckets();

            if (bucketList != null) {

                for (Bucket bucket : bucketList) {

                    System.out.println(bucket.creationDate() + ", " + bucket.name());

                    log.info(bucket.creationDate() + ", " + bucket.name());

                }

            }

        } catch (Exception e) {

            System.out.println("Error occurred: " + e);

        }

        return "success";

    }

 

 

    @RequestMapping("/download")

    public void download(HttpServletResponse response) {

 

        try {

            // 调用statObject()来判断对象是否存在。

            // 如果不存在, statObject()抛出异常,

            // 否则则代表对象存在。

            StatObjectResponse statObjectResponse = minioClient.statObject(

                    StatObjectArgs.builder().bucket("test").object("video/orange.mp4").build());

 

            // 获取"myobject"的输入流。

            // get object given the bucket and object name

            InputStream stream = minioClient.getObject(

                    GetObjectArgs.builder()

                            .bucket("test")

                            .object("video/orange.mp4")

                            .build());

            // 设置响应头

            response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);

            response.setHeader("Content-Disposition", "attachment; filename=orange.mp4");

 

            // 通过输出流将文件内容写入到客户端

            OutputStream out = response.getOutputStream();

            byte[] buffer = new byte[4096];

            int bytesRead;

            while ((bytesRead = stream.read(buffer)) != -1) {

                out.write(buffer, 0, bytesRead);

            }

            out.flush();

            out.close();

            stream.close();

        } catch (MinioException e) {

            // 处理MinIO相关异常

            e.printStackTrace();

        } catch (Exception e) {

            // 处理其他异常

            e.printStackTrace();

        }

    }

 

 

    @RequestMapping("/remove")

    public String remove() {

        String msg = "";

        try {

            List<Bucket> buckets = minioClient.listBuckets();

            for (Bucket bucket : buckets) {

                if (bucket.name().equals("test")) {

                    minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucket.name()).build());

                    System.out.println("delete the bucket:" + bucket.name() + " is success!! ");

                    return "success delete bucket:" + bucket.name();

                }

            }

        } catch (Exception e) {

            msg = e.getMessage();

            e.printStackTrace();

        }

        return "fail delete \n" + msg;

    }

 

    @RequestMapping("/show")

    public ResponseEntity<InputStreamResource> showVideo(@RequestParam String videoName) {

        try {

            // 获取视频文件的InputStream

            InputStream inputStream = minioClient.getObject(

                    GetObjectArgs.builder()

                            .bucket("test")

                            .object("video/" + videoName)

                            .build());

 

            // 设置响应头

            HttpHeaders headers = new HttpHeaders();

            headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);

            headers.setContentDispositionFormData("attachment", videoName);

 

            // 返回响应实体

            return ResponseEntity.ok()

                    .headers(headers)

                    .body(new InputStreamResource(inputStream));

        } catch (Exception e) {

            // 处理异常

            e.printStackTrace();

            return ResponseEntity.status(HttpStatus.FAILED_DEPENDENCY).build();

        }

    }

 

}

Minio部署说明

Docker部署Minio服务

我们选择Docker部署Minio服务,首先确保你的服务器安装了Docker并且切换了镜像源,并且可以正常联网。

使用下面的命令拉取镜像和创建容器并运行:

# 拉取镜像

docker pull minio/minio:RELEASE.2024-10-02T17-50-41Z-cpuv1

# 启动容器

docker run \

--name minio \

-p 9000:9000 \

-p 9001:9001 \

-e "MINIO_ROOT_USER=minio" \

-e "MINIO_ROOT_PASSWORD=minio123" \

-v /home/MinIO/data:/data \

minio/minio:RELEASE.2024-10-02T17-50-41Z-cpuv1 server /data --console-address ":9001"

启动完成后即可访问后台地址http://192.168.150.102:9001/ 进入登陆界面,如图 1所示。

图 1 登陆界面

输入部署时的账户名和密码:minio/minio123即可进入主界面。如图 2所示。

图 2 主界面

此时Minio的服务就部署完成了。可以手动在页面上创建Bucket,然后上传文件使用,也可以使用Minio的SDK在代码中进行操作。

Docker部署Demo后端服务

我们选择Docker部署MinioDemo的后台服务,首先确保你的服务器安装了Docker并且切换了镜像源,并且可以正常联网,使得可以正常使用Dockerfile打包镜像。

下面提供一种部署实现:

1、将必要的配置修改好后打包形成jar包文件,放到服务器 /home/minio-test / 下面,需要新建好没有的文件夹。

2、上传jar包并且重命名为minio-test-1.0.jar,上传jdk8的服务器版本的运行环境包jdk8.tar.gz。

  1. 随后新建对应的Dockerfile文件,填写如下内容:

# 指定基础镜像

FROM centos:7

# 配置环境变量,JDK的安装目录

ENV JAVA_DIR=/usr/local

# 拷贝jdk包

COPY ./jdk8.tar.gz $JAVA_DIR/

COPY ./minio-test-1.0.jar /tmp/app.jar

# 安装JDK

RUN cd $JAVA_DIR \

&& tar -xf ./jdk8.tar.gz \

&& mv ./jdk1.8.0_144 ./java8

# 配置环境变量

ENV JAVA_HOME=$JAVA_DIR/java8

ENV PATH=$PATH:$JAVA_HOME/bin

# 暴露端口

EXPOSE 9005

# 入口,java项目的启动命令

ENTRYPOINT java -jar /tmp/app.jar

4、完成上述工作之后即可使用如下命令进行打包镜像:

docker build -t minio_test:1.0 .

5、打包完成后可以看见Demo程序后台的镜像。

6、镜像打包完成后直接创建容器运行即可:

# 创建并运行容器

docker run --name miniotest -p 9005:9005 -d minio_test:1.0

部分页面部署使用示例

打包过程和启动成功如图 3所示。

图 3 Linux界面

访问demo的上传接口http://192.168.150.102:9005/upload 自动创建test桶并上传jar包中的orange.mp4文件到这个桶中的video文件夹,如图 4 所示。访问http://192.168.150.102:9005/video.html 即可预览刚刚上传的视频,如图 5所示,也可以前往Minio的后台预览也是可以的。

其他Minio的SDK可以前往Minio的官网查看。

图 4 调接口上传jar包封存的文件

图 5 使用demo的预览网页预览文件

posted @ 2024-12-26 19:55  苓茜  阅读(3938)  评论(0)    收藏  举报