FastDFS收藏起來,現(xiàn)在開始用Minio吧

一、Minio介紹
MinIO是全球領先的對象存儲先鋒,目前在全世界有數(shù)百萬的用戶。
高性能?,在標準硬件上,讀/寫速度上高達183GB/秒和171GB/秒,擁有更高的吞吐量和更低的延遲
可擴展性?,為對象存儲帶來了簡單的縮放模型,通過添加更多集群可以擴展空間
簡單?,極簡主義是MinIO的指導性設計原則,即可在幾分鐘內(nèi)安裝和配置
與Amazon S3兼容?,亞馬遜云的?S3 API(接口協(xié)議)是在全球范圍內(nèi)達到共識的對象存儲的協(xié)議,是全世界內(nèi)大家都認可的標準
數(shù)據(jù)安全?,使用糾刪碼來保護數(shù)據(jù)免受硬件故障和無聲數(shù)據(jù)損壞
糾刪碼
??糾刪碼是一種恢復丟失和損壞數(shù)據(jù)的數(shù)學算法, Minio默認采用?Reed-Solomon code將數(shù)據(jù)拆分成N/2個數(shù)據(jù)塊和N/2個奇偶校驗塊。這就意味著如果是16塊盤,一個對象會被分成8個數(shù)據(jù)塊、8個奇偶校驗塊,你可以丟失任意8塊盤(不管其是存放的數(shù)據(jù)塊還是校驗塊),你仍可以從剩下的盤中的數(shù)據(jù)進行恢復。
http://docs.minio.org.cn/docs/master/java-client-quickstart-guide
Minio和FastDFS的對比
安裝難度
文檔
性能
容器化支持
SDK支持
二、Minio安裝
??為了快速搞定Minio的部署工作。我們通過Docker-Compose來一鍵快速部署操作
1.安裝DockerCompose
??安裝DockerCompose的前提是先安裝一個Docker環(huán)境,如果還沒安裝的參考波哥的博客地址:https://blog.csdn.net/qq_38526573/category_9619681.html
??Compose 是用于定義和運行多容器 Docker 應用程序的工具。通過 Compose,您可以使用 YML 文件來配置應用程序需要的所有服務。然后,使用一個命令,就可以從 YML 文件配置中創(chuàng)建并啟動所有服務。
一鍵啟動所有的服務
DockerCompose的使用步驟
創(chuàng)建對應的DockerFile文件
創(chuàng)建yml文件,在yml文件中編排我們的服務
通過?docker-compose up命令 一鍵運行我們的容器
官網(wǎng)地址:https://docs.docker.com/compose
下載地址:
curl -L https://get.daocloud.io/docker/compose/releases/download/1.25.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
修改文件夾權(quán)限
chmod +x /usr/local/bin/docker-compose
建立軟連接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
檢查是否安裝成功
docker-compose --version
2.安裝Minio集群
官方推薦?docker-compose.yaml:
稍加修改,內(nèi)容如下:
version: '3.7'# 所有容器通用的設置和配置x-minio-common: &minio-common
?image: minio/minio
?command: server --console-address ":9001" http://minio{1...4}/data
?expose:
? ?- "9000"
?# environment:
? ?# MINIO_ROOT_USER: minioadmin
? ?# MINIO_ROOT_PASSWORD: minioadmin
?healthcheck:
? ?test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
? ?interval: 30s
? ?timeout: 20s
? ?retries: 3# 啟動4個docker容器運行minio服務器實例# 使用nginx反向代理9000端口,負載均衡, 你可以通過9001、9002、9003、9004端口訪問它們的web consoleservices:
?minio1:
? ?<<: *minio-common
? ?hostname: minio1
? ?ports:
? ? ?- "9001:9001"
? ?volumes:
? ? ?- ./data/data1:/data
?minio2:
? ?<<: *minio-common
? ?hostname: minio2
? ?ports:
? ? ?- "9002:9001"
? ?volumes:
? ? ?- ./data/data2:/data
?minio3:
? ?<<: *minio-common
? ?hostname: minio3
? ?ports:
? ? ?- "9003:9001"
? ?volumes:
? ? ?- ./data/data3:/data
?minio4:
? ?<<: *minio-common
? ?hostname: minio4
? ?ports:
? ? ?- "9004:9001"
? ?volumes:
? ? ?- ./data/data4:/data
?nginx:
? ?image: nginx:1.19.2-alpine
? ?hostname: nginx
? ?volumes:
? ? ?- ./config/nginx.conf:/etc/nginx/nginx.conf:ro
? ?ports:
? ? ?- "9000:9000"
? ?depends_on:
? ? ?- minio1
? ? ?- minio2
? ? ?- minio3
? ? ?- minio4
接著新建文件夾?config,新建配置?nginx.conf
user ?nginx;worker_processes ?auto;error_log ?/var/log/nginx/error.log warn;pid ? ? ? ?/var/run/nginx.pid;events { ? ?worker_connections ?4096;
}http { ? ?include ? ? ? /etc/nginx/mime.types; ? ?default_type ?application/octet-stream; ? ?log_format ?main ?'$remote_addr - $remote_user [$time_local] "$request" '
? ? ? ? ? ? ? ? ? ? ?'$status $body_bytes_sent "$http_referer" '
? ? ? ? ? ? ? ? ? ? ?'"$http_user_agent" "$http_x_forwarded_for"'; ? ?access_log ?/var/log/nginx/access.log ?main; ? ?sendfile ? ? ? ?on; ? ?keepalive_timeout ?65; ? ?# include /etc/nginx/conf.d/*.conf;
? ?upstream minio { ? ? ? ?server minio1:9000; ? ? ? ?server minio2:9000; ? ? ? ?server minio3:9000; ? ? ? ?server minio4:9000;
? ?} ? ?server { ? ? ? ?listen ? ? ? 9000; ? ? ? ?listen ?[::]:9000; ? ? ? ?server_name ?localhost; ? ? ? ?# To allow special characters in headers
? ? ? ?ignore_invalid_headers off; ? ? ? ?# Allow any size file to be uploaded.
? ? ? ?# Set to a value such as 1000m; to restrict file size to a specific value
? ? ? ?client_max_body_size 0; ? ? ? ?# To disable buffering
? ? ? ?proxy_buffering off; ? ? ? ?location / { ? ? ? ? ? ?proxy_set_header Host $http_host; ? ? ? ? ? ?proxy_set_header X-Real-IP $remote_addr; ? ? ? ? ? ?proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; ? ? ? ? ? ?proxy_set_header X-Forwarded-Proto $scheme; ? ? ? ? ? ?proxy_connect_timeout 300; ? ? ? ? ? ?# Default is HTTP/1, keepalive is only enabled in HTTP/1.1
? ? ? ? ? ?proxy_http_version 1.1; ? ? ? ? ? ?proxy_set_header Connection ""; ? ? ? ? ? ?chunked_transfer_encoding off; ? ? ? ? ? ?proxy_pass http://minio;
? ? ? ?}
? ?}
}
然后執(zhí)行對應的命令
docker-compose up -d

image.png
訪問控制臺:http://192.168.56.100:9000

image.png
賬號密碼為:minioadmin

image.png
三、Minio客戶端
??然后我們可以創(chuàng)建一個Java項目來操作文件上傳下載操作。
1.Bucket
??Bucket是桶的意思。我們創(chuàng)建一個Bucket

image.png

image.png
我們還可以直接上傳圖片文件等

image.png

image.png
2.用戶管理
??針對客戶端的操作,我們需要維護相關的賬號來管理。

image.png
直接點擊創(chuàng)建相關的用戶即可

image.png
用戶創(chuàng)建完成后我們就可以通過客戶端工具來操作了。
3. Java項目
??然后我們來看看如何在Java項目中來操作了。
首先添加必要的依賴
<dependency>
? ? ? ? ? ?<groupId>io.minio</groupId>
? ? ? ? ? ?<artifactId>minio</artifactId>
? ? ? ? ? ?<version>7.0.2</version>
? ? ? ?</dependency>
? ? ? ?<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
? ? ? ?<dependency>
? ? ? ? ? ?<groupId>commons-io</groupId>
? ? ? ? ? ?<artifactId>commons-io</artifactId>
? ? ? ? ? ?<version>2.8.0</version>
? ? ? ?</dependency>
然后通過相關的API操作即可
? ?private String endpoint = "http://192.168.56.100:9000"; ? ?private String accessKey = "dpb"; ? ?private String secretKey = "12345678"; ? ?
? ?void contextLoads() throws Exception{ ? ? ? ?// 1.使用MinIo服務的URL,端口 賬號和密碼 創(chuàng)建一個 MinIoClient對象
? ? ? ?MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey); ? ? ? ?boolean isExists = minioClient.bucketExists("test"); ? ? ? ?if(isExists){
? ? ? ? ? ?System.out.println("已經(jīng)存在了 test 這個 Bucket");
? ? ? ?}else{
? ? ? ? ? ?minioClient.makeBucket("test");
? ? ? ?} ? ? ? ?// 存儲文件到 存儲桶中
? ? ? ?minioClient.putObject("test","/group1/UserMapper.xml","d:/UserMapper.xml",null);
? ? ? ?System.out.println("文件上傳成功..."); ? ? ? ?// 下載文件
? ? ? ?InputStream in = minioClient.getObject("test", "/group1/UserMapper.xml");
? ? ? ?List<String> strings = IOUtils.readLines(in, "UTF-8");
? ? ? ?strings.stream().forEach(s -> System.out.println(s));
? ?}
執(zhí)行后成功:

image.png

image.png
搞定
4.獲取圖片地址
??如果上傳的是普通文件我們可以獲取對應的字節(jié)流來操作,但是如果我們需要獲取的是圖片。只要訪問就可以了,這時我們可以通過對應的API來獲取圖片的URL地址就可以了

image.png
但是在訪問的時候缺提示訪問不了

image.png
原因是我們需要設置下Bucket的策略

image.png

image.png
訪問就可以了
