最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解minio分布式文件存儲

 更新時間:2023年10月07日 10:55:48   作者:小月亮6  
MinIO 是一款基于 Go 語言的高性能、可擴展、云原生支持、操作簡單、開源的分布式對象存儲產(chǎn)品,這篇文章主要介紹了minio分布式文件存儲,需要的朋友可以參考下

基本介紹

什么是  MinIO        

 MinIO 是一款基于 Go 語言的高性能、可擴展、云原生支持、操作簡單、開源的分布式對象存儲產(chǎn)品。基于 Apache License v2.0 開源協(xié)議,雖然輕量,卻擁有著不錯的性能。它兼容亞馬遜S3云存儲服務接口??梢院芎唵蔚暮推渌麘媒Y合使用,例如 NodeJS、Redis、MySQL 等。

官網(wǎng):www.minio.org.cn/

MinIO  特點

  • 高性能:作為高性能對象存儲,在標準硬件條件下它能達到55GB/s的讀、35GG/s的寫速率
  • 可擴容:不同MinIO集群可以組成聯(lián)邦,并形成一個全局的命名空間,并跨越多個數(shù)據(jù)中心
  • 云原生:容器化、基于K8S的編排、多租戶支持
  • Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API??梢允褂肕inio SDK,Minio Client,AWS SDK和AWS CLI訪問Minio服務器。
  • 可對接后端存儲: 除了Minio自己的文件系統(tǒng),還支持DAS、 JBODs、NAS、Google云存儲和Azure Blob存儲。
  • SDK支持: 基于Minio輕量的特點,它得到類似Java、Python或Go等語言的sdk支持
  • Lambda計算: Minio服務器通過其兼容AWS SNS / SQS的事件通知服務觸發(fā)Lambda功能。支持的目標是消息隊列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等數(shù)據(jù)庫。
  • 有操作頁面
  • 功能簡單: 這一設計原則讓MinIO不容易出錯、更快啟動
  • 支持糾刪碼:MinIO使用糾刪碼、Checksum來防止硬件錯誤和靜默數(shù)據(jù)污染。在最高冗余度配置下,即使丟失1/2的磁盤也能恢復數(shù)據(jù)

docker 安裝 minio

下載鏡像(最新版本)

docker pull minio/minio

查看已經(jīng)下載的鏡像

docker images

創(chuàng)建并啟動minIO容器:
這里的 \ 指的是命令還沒有輸入完,還需要繼續(xù)輸入命令,先不要執(zhí)行的意思。
這里的9090端口指的是minio的客戶端端口。雖然設置9090,但是我們在訪問9000的時候,他也會自動跳到9090。
9000端口是minio的服務端端口,我們程序在連接minio的時候,就是通過這個端口來連接的。
-v就是docker run當中的掛載,這里的/usr/local/mydata/minio/data:/data意思就是將容器的/data目錄和宿主機的/mydata/minio/data目錄做映射,這樣我們想要查看容器的文件的時候,就不需要看容器當中的文件了。
注意在執(zhí)行命令的時候,他是會自動在宿主機當中創(chuàng)建目錄的。我們不需要手動創(chuàng)建。
minio所上傳的文件默認都是存儲在容器的data目錄下的!
假如刪除容器了宿主機當中掛載的目錄是不會刪除的。假如沒有使用-v掛載目錄,那他在宿主機的存儲位置的文件會直接刪除的。
宿主機的掛載目錄一定是根目錄,如果是相對路徑會有問題。還有容器當中的目錄也是必須是絕對路徑(根路徑就是帶/的)。
所謂的掛載其實就是將容器目錄和宿主機目錄進行綁定了,操作宿主機目錄,容器目錄也會變化,操作容器目錄,宿主機目錄也會變化。這樣做的目的 可以間接理解為就是數(shù)據(jù)持久化,防止容器誤刪,導致數(shù)據(jù)丟失的情況。
MINIO_ACCESS_KEY:賬號 MINIO_SECRET_KEY:密碼 (正常賬號應該不低于3位,密碼不低于8位,不然容器會啟動不成功)
–console-address 指定客戶端端口
-d --restart=always 代表重啟linux的時候容器自動啟動
–name minio 容器名稱

 docker run -p 9000:9000 -p 9090:9090  --name minio  -d --restart=always  -e "MINIO_ACCESS_KEY=minioadmin"  -e "MINIO_SECRET_KEY=minioadmin"  -v /usr/local/mydata/minio/data:/data  minio/minio server  /data --console-address ":9090" -address ":9000"

springboot集成minio

一、配置yml文件

#yml配置文件增加如下配置
minio:
  endpoint: http://ip:9000
  fileUploadUrl: http://ip:9000
  accessKey: minioadmin (用戶名)
  secretKey: minioadmin (密碼)
  bucketName: file (文件組:桶名)

二、引入pom(8與7的方法不適用,以下使用8.0.3)

        <dependency>
            <groupId>io.minio</groupId>
            <artifactId>minio</artifactId>
            <version>8.0.3</version>
        </dependency>

三、系統(tǒng)加載minio配置

@Data
@Configuration
@ConfigurationProperties(prefix = "minio")
public class MinioConfig {
    private String endpoint;
    private String accessKey;
    private String secretKey;
    private String bucketName;
    @Bean
    public MinioClient minioClient()  {
        MinioClient minioClient = MinioClient.builder()
                .endpoint(endpoint)
                .credentials(accessKey, secretKey)
                .build();
        return minioClient;
    }
}

四、minio工具類(上傳文件,返回訪問鏈接)

package org;
import cn.hutool.core.io.FastByteArrayOutputStream;
import com.alibaba.fastjson.JSONObject;
import io.minio.*;
import io.minio.http.Method;
import io.minio.messages.Bucket;
import io.minio.messages.DeleteError;
import io.minio.messages.DeleteObject;
import io.minio.messages.Item;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;
/**
 * 功能描述 文件服務器工具類
 *
 * @author: 
 * @date: 
 */
@Component
public class MinioUtil {
    @Resource
    private MinioClient minioClient;
    /**
     * 查看存儲bucket是否存在
     * @return boolean
     */
    public Boolean bucketExists(String bucketName) {
        Boolean found;
        try {
            found = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        } catch (Exception e) {
            //e.printStackTrace();
            return false;
        }
        return found;
    }
    /**
     * 創(chuàng)建存儲bucket
     * @return Boolean
     */
    public Boolean makeBucket(String bucketName) {
        try {
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 刪除存儲bucket
     * @return Boolean
     */
    public Boolean removeBucket(String bucketName) {
        try {
            minioClient.removeBucket(RemoveBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 獲取全部bucket
     */
    public List<Bucket> getAllBuckets() {
        try {
            return minioClient.listBuckets();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 文件上傳
     * @param file 文件
     * @return Boolean
     */
    public Boolean upload(String bucketName, String fileName, MultipartFile file, InputStream inputStream) {
        try {
            PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(fileName)
                    .stream(inputStream,file.getSize(),-1).contentType(file.getContentType()).build();
            //文件名稱相同會覆蓋
            minioClient.putObject(objectArgs);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }
    /**
     * 預覽圖片
     * @param fileName
     * @return
     */
    public String preview(String fileName,String bucketName){
        // 查看文件地址
        GetPresignedObjectUrlArgs build = new GetPresignedObjectUrlArgs().builder().bucket(bucketName).object(fileName).method(Method.GET).build();
        try {
            String url = minioClient.getPresignedObjectUrl(build);
            return url;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
    /**
     * 文件下載
     * @param fileName 文件名稱
     * @param res response
     * @return Boolean
     */
    public void download(String fileName,String bucketName, HttpServletResponse res) {
        GetObjectArgs objectArgs = GetObjectArgs.builder().bucket(bucketName)
                .object(fileName).build();
        try (GetObjectResponse response = minioClient.getObject(objectArgs)){
            byte[] buf = new byte[1024];
            int len;
            try (FastByteArrayOutputStream os = new FastByteArrayOutputStream()){
                while ((len=response.read(buf))!=-1){
                    os.write(buf,0,len);
                }
                os.flush();
                byte[] bytes = os.toByteArray();
                res.setCharacterEncoding("utf-8");
                //設置強制下載不打開
                //res.setContentType("application/force-download");
                res.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
                try (ServletOutputStream stream = res.getOutputStream()){
                    stream.write(bytes);
                    stream.flush();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    /**
     * 查看文件對象
     * @return 存儲bucket內(nèi)文件對象信息
     */
    public List<Item> listObjects(String bucketName) {
        Iterable<Result<Item>> results = minioClient.listObjects(
                ListObjectsArgs.builder().bucket(bucketName).build());
        List<Item> items = new ArrayList<>();
        try {
            for (Result<Item> result : results) {
                items.add(result.get());
            }
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
        return items;
    }
    /**
     * 刪除
     * @param fileName
     * @return
     * @throws Exception
     */
    public boolean remove(String fileName,String bucketName){
        try {
            minioClient.removeObject( RemoveObjectArgs.builder().bucket(bucketName).object(fileName).build());
        }catch (Exception e){
            return false;
        }
        return true;
    }
    /**
     * 批量刪除文件對象(沒測試)
     * @param objects 對象名稱集合
     */
    public Iterable<Result<DeleteError>> removeObjects(List<String> objects, String bucketName) {
        List<DeleteObject> dos = objects.stream().map(e -> new DeleteObject(e)).collect(Collectors.toList());
        Iterable<Result<DeleteError>> results = minioClient.removeObjects(RemoveObjectsArgs.builder().bucket(bucketName).objects(dos).build());
        return results;
    }
    //上傳文件,返回路徑
    public Object upload(HashMap<String, Object> paramMap) {
        MultipartFile file=(MultipartFile)paramMap.get("file");
        if (file.isEmpty() || file.getSize() == 0) {
            return "文件為空";
        }
        try {
            if (!this.bucketExists("file")) {
                this.makeBucket("file");
            }
            InputStream inputStream = file.getInputStream();
            String fileName = file.getOriginalFilename();
            String newName = UUID.randomUUID().toString().replaceAll("-", "")
                    + fileName.substring(fileName.lastIndexOf("."));
            this.upload("file", newName,file, inputStream);
            inputStream.close();
            String fileUrl = this.preview(newName,"file");
            String fileUrlNew=fileUrl.substring(0, fileUrl.indexOf("?"));
            JSONObject jsonObject=new JSONObject();
            jsonObject.put("url",fileUrlNew);
            return jsonObject.toJSONString();
        } catch (Exception e) {
            e.printStackTrace();
            return "上傳失敗";
        }
    }
}

項目中實踐

到此這篇關于minio分布式文件存儲的文章就介紹到這了,更多相關minio分布式文件存儲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • 簡單講解Go程序中使用MySQL的方法

    簡單講解Go程序中使用MySQL的方法

    這篇文章主要介紹了Go程序中使用MySQL的方法,需要使用第三方包來進行連接,需要的朋友可以參考下
    2015-10-10
  • 一文詳解Go Http Server原理

    一文詳解Go Http Server原理

    這篇文章主要為大家介紹了Go Http Server原理示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • Go語言設置JSON的默認值操作

    Go語言設置JSON的默認值操作

    這篇文章主要介紹了Go語言設置JSON的默認值操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-12-12
  • golang結構化日志log/slog包之slog.Record的用法簡介

    golang結構化日志log/slog包之slog.Record的用法簡介

    這篇文章主要為大家詳細介紹了golang結構化日志log/slog包中slog.Record結構體的使用方法和需要注意的點,文中的示例代碼講解詳細,需要的可以學習一下
    2023-10-10
  • Golang內(nèi)存泄漏詳解之原因、檢測與修復過程

    Golang內(nèi)存泄漏詳解之原因、檢測與修復過程

    本文詳細介紹了Golang中的內(nèi)存泄漏問題,包括內(nèi)存泄漏的定義、分類、影響以及預防和修復方法,通過使用Golang自帶的性能分析工具和火焰圖工具,可以有效地檢測和定位內(nèi)存泄漏的代碼路徑,合理的代碼設計和定期的代碼審查也是預防內(nèi)存泄漏的關鍵
    2024-12-12
  • Go 面向包新提案透明文件夾必要性分析

    Go 面向包新提案透明文件夾必要性分析

    這篇文章主要為大家介紹了Go 面向包新提案,透明文件夾必要性分析,看看是否合適加進 Go 特性中,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-11-11
  • golang中protobuf的使用詳解

    golang中protobuf的使用詳解

    protobuf是Google公司提出的一種輕便高效的結構化數(shù)據(jù)存儲格式,常用于結構化數(shù)據(jù)的序列化,具有語言無關、平臺無關、可擴展性特性,常用于通訊協(xié)議、服務端數(shù)據(jù)交換場景,下面我們就來看看golang中protobuf的具體使用吧
    2023-10-10
  • Go語言操作數(shù)據(jù)庫及其常規(guī)操作的示例代碼

    Go語言操作數(shù)據(jù)庫及其常規(guī)操作的示例代碼

    這篇文章主要介紹了Go語言操作數(shù)據(jù)庫及其常規(guī)操作的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • go實現(xiàn)圖片拼接與文字書寫的方法實例

    go實現(xiàn)圖片拼接與文字書寫的方法實例

    這篇文章主要給大家介紹了關于go實現(xiàn)圖片拼接與文字書寫的相關資料,文中通過實例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-01-01
  • golang?http請求未釋放造成的錯誤問題

    golang?http請求未釋放造成的錯誤問題

    這篇文章主要介紹了golang?http請求未釋放造成的錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01

最新評論

肥西县| 靖边县| 安平县| 阜阳市| 天长市| 台中县| 陆良县| 车致| 鄂尔多斯市| 睢宁县| 乌拉特后旗| 吉木乃县| 宜良县| 庆元县| 新乡县| 甘洛县| 日土县| 宁德市| 夏津县| 黔西县| 闻喜县| 湖口县| 大余县| 攀枝花市| 旬阳县| 江川县| 辽中县| 淮安市| 天峨县| 黑龙江省| 乐昌市| 博爱县| 西城区| 石林| 滦南县| 新邵县| 孟村| 前郭尔| 祥云县| 岑巩县| 呼图壁县|