對象存儲-OSS

目錄

對象存儲背景? ? ? ??

阿里云OSS


對象存儲背景? ? ? ??

????????單節點環境下,文件往往存儲在tomcat服務器內,隨著業務需求的增多,單節點已不能滿足需求,項目架構需要擴展到多節點(見下圖),此時文件經過nginx轉發存儲到某一個節點,在分布式架構下對文件的訪問就存在問題(文件存儲到節點A,查看文件請求到節點B訪問不了文件)。

? ? ? ? 在分布式環境下,需要引入集中管理文件的節點服務,改進如下:

? ? ? ? 分布式文件服務解決方案有很多,常見的有:獨立搭建文件服務器,如基于開源FastDFS搭建;引入第三方云儲存方案,如基于阿里云的OSS;相比獨立搭建文件服務器,云存儲方案有諸多優勢:SDK使用簡單、運維成本低、圖形化的管理控制臺、提供強大的文件處理功能、CDN加速、服務擴展簡單等,本文重點講述基于阿里云的OSS方案。

阿里云OSS

? ? ? ? 使用步驟如下:

? ? ? ? 1、【阿里云官網】開通OSS服務

? ? ? ? 2、【阿里云官網】創建Bucket

? ? ? ? 重點關注標簽有:Bucket 名稱、Endpoint,本文新建的Bucket 名稱 =?gingko-sawyer,Endpoint =?oss-cn-beijing.aliyuncs.com

? ? ? ? 3、【阿里云官網】創建并使用RAM賬號進行API訪問或日常運維,請登錄RAM控制臺創建RAM賬號,創建AccessKey,并將AccessKeyId和AccessKeySecret設置到本地電腦環境變量中。

? ? ? ? 4、后臺編寫代碼實現基于阿里云OSS文件上傳及下載

? ? ? ? 4.1、添加aliyun.oss依賴

<dependency><groupId>com.aliyun.oss</groupId><artifactId>aliyun-sdk-oss</artifactId><version>3.17.4</version>
</dependency>

????????4.2、修改配置,增加對oss的支持

server:port: 8080
#aliyun oss config
aliyun:oss:endpoint: oss-cn-beijing.aliyuncs.comregion: cn-beijingbucket-name: gingko-sawyerfoler-prefix: oss/host: https://gingko-sawyer.oss-cn-beijing.aliyuncs.com

? ? ? ? 4.3 文件上傳&下載程序

package com.ginko.aliyunoss.controller;import com.aliyun.oss.*;
import com.aliyun.oss.common.auth.CredentialsProviderFactory;
import com.aliyun.oss.common.auth.EnvironmentVariableCredentialsProvider;
import com.aliyun.oss.common.comm.Protocol;
import com.aliyun.oss.common.comm.SignVersion;
import com.aliyun.oss.model.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.InputStream;@RestController
@RequestMapping("oss")
@Slf4j
public class OSSController {@Value("${aliyun.oss.endpoint}")private String endpoint;@Value("${aliyun.oss.region}")private String region;@Value("${aliyun.oss.bucket-name}")private String bucketName;@Value("${aliyun.oss.foler-prefix}")private String folerPrefix;//上傳到oss中具體的文件夾目錄@Value("${aliyun.oss.host}")private String host;@PostMapping("/upload")public String upload(@RequestParam("file") MultipartFile file) throws Exception {// 創建 ClientBuilderConfiguration 實例,用于配置 OSS 客戶端參數ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();// 設置簽名算法版本為 V4clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);// 設置使用 HTTPS 協議訪問 OSS,保證傳輸安全性clientBuilderConfiguration.setProtocol(Protocol.HTTPS);// 創建 OSS 客戶端實例OSS ossClient = OSSClientBuilder.create()// endpoint.endpoint(this.endpoint)// 從環境變量中獲取訪問憑證(需提前配置 OSS_ACCESS_KEY_ID 和 OSS_ACCESS_KEY_SECRET).credentialsProvider(CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider())// 設置客戶端配置.clientConfiguration(clientBuilderConfiguration)// 設置region.region(this.region).build();try {// 填寫Bucket名稱String bucketName = this.bucketName;// 填寫Object完整路徑,完整路徑中不能包含Bucket名稱,例如exampledir/exampleobject.txt。String objectName = this.folerPrefix + file.getOriginalFilename();InputStream inputStream = file.getInputStream();// 創建PutObjectRequest對象。PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, inputStream);// 創建PutObject請求。PutObjectResult result = ossClient.putObject(putObjectRequest);System.out.println(result);} finally {// 當OSSClient實例不再使用時,調用shutdown方法以釋放資源ossClient.shutdown();}return "success";}@PostMapping("/download")public String download() throws Exception {// Endpoint以華東1(杭州)為例,其它Region請按實際情況填寫。String endpoint = this.endpoint;//從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();// 填寫Bucket名稱,例如examplebucket。String bucketName = this.bucketName;// 填寫不包含Bucket名稱在內的Object完整路徑,例如testfolder/exampleobject.txt。String objectName = this.folerPrefix + "1.png";// 填寫Object下載到本地的完整路徑。String pathName = "D:\\rename.png";// 填寫Bucket所在地域。以華東1(杭州)為例,Region填寫為cn-hangzhou。String region = this.region;// 創建OSSClient實例。// 當OSSClient實例不再使用時,調用shutdown方法以釋放資源。ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration();clientBuilderConfiguration.setSignatureVersion(SignVersion.V4);OSS ossClient = OSSClientBuilder.create().endpoint(endpoint).credentialsProvider(credentialsProvider).clientConfiguration(clientBuilderConfiguration).region(region).build();try {// 下載Object到本地文件,并保存到指定的本地路徑中。如果指定的本地文件存在會覆蓋,不存在則新建。// 如果未指定本地路徑,則下載后的文件默認保存到示例程序所屬項目對應本地路徑中。ObjectMetadata object = ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File(pathName));} catch (OSSException oe) {System.out.println("Caught an OSSException, which means your request made it to OSS, "+ "but was rejected with an error response for some reason.");System.out.println("Error Message:" + oe.getErrorMessage());System.out.println("Error Code:" + oe.getErrorCode());System.out.println("Request ID:" + oe.getRequestId());System.out.println("Host ID:" + oe.getHostId());} catch (ClientException ce) {System.out.println("Caught an ClientException, which means the client encountered "+ "a serious internal problem while trying to communicate with OSS, "+ "such as not being able to access the network.");System.out.println("Error Message:" + ce.getMessage());} finally {if (ossClient != null) {ossClient.shutdown();}}return "success";}
}

? ? ? ? 5、測試,通過postman模擬上傳及下載文件

? ? ? ? 如下圖所示,1.png文件已經被上傳到oss中,rename.png是從oss下載到本地的文件

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/90335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/90335.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/90335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C語言函數的聲明

1定義&#xff1a;在C語言中&#xff0c;函數是一段具有特定功能的獨立代碼塊&#xff0c;它可以接收輸入參數、執行相關操作并返回結果。2為什么需要函數&#xff08;1&#xff09;代碼復用&#xff1a;避免重復編寫相同功能的代碼&#xff0c; &#xff08;2&#xff09;模塊…

AI人工智能名片小程序源碼系統,名片小程序+分銷商城+AI客服,包含完整搭建教程

智能名片核心功能AI人工智能名片小程序的核心功能設計旨在徹底改變傳統商務交流方式&#xff0c;為用戶提供前所未有的智能化體驗。個性化名片展示是系統的基礎功能&#xff0c;用戶可以通過豐富的模板庫和自定義設計工具&#xff0c;創建獨具特色的電子名片。系統提供多種預設…

React 教程:井字棋游戲

React 教程&#xff1a;井字棋游戲 使用 React 實現一個交互式的井字棋游戲&#xff0c;并配上好看的樣式 // 導入必要的CSS樣式和React庫 import "./App.css"; import { useState } from "react";// Square組件 - 表示棋盤上的一個格子 function Square({…

React源碼2 React中的工廠函數:createRoot()

#React V18.2 源碼前置基礎知識&#xff1a;工廠函數工廠函數是一種設計模式&#xff0c;用于動態創建對象或函數實例。其核心思想是通過封裝對象創建的細節&#xff0c;提供統一的接口&#xff0c;從而增強代碼的靈活性和可維護性&#xff0c;有一些核心作用&#xff1a;解耦創…

《UE5_C++多人TPS完整教程》學習筆記42 ——《P43 瞄準(Aiming)》

本文為B站系列教學視頻 《UE5_C多人TPS完整教程》 —— 《P43 瞄準&#xff08;Aiming&#xff09;》 的學習筆記&#xff0c;該系列教學視頻為計算機工程師、程序員、游戲開發者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephen Ulibarri…

SQL Server 臨時表、表變量與WITH語句的用法與區別

引言 在SQL Server數據處理中,臨時表、表變量和WITH語句(CTE)是關鍵的中間結果集管理工具。臨時表適合大數據量操作,表變量優化小數據量場景,而CTE則簡化復雜查詢邏輯。三者選擇需綜合考量數據量級、事務需求及代碼可讀性。本文將深入解析其工作機制,通過實測對比指導場…

【Android】組件及布局介紹

一&#xff1a;代碼分析 1&#xff1a;Android界面開發方式 &#xff08;1&#xff09;JavaView&#xff08;傳統視圖系統&#xff09; 這是 Android 早期的開發方式&#xff0c;用 Java 或 Kotlin 代碼配合 XML 布局文件 來構建界面。&#xff08;簡單了解即可&#xff09; 分…

Android 音視頻 IPC序列化工具-Flattenable

Android Binder與AIDL與Service使用案例及分析-CSDN博客 講講這個類,被用在Android音視頻中,跨進程序列化反序列化用。與Binder驅動有很強的聯系。位于: feameworks/native/utils/Flattenable.h Flattenable, 譯為令人滿意的。可能是作者十分滿意自己的這些作品吧,起了這…

文獻學習|全面繪制和建模水稻調控組景觀揭示了復雜性狀背后的調控架構。

摘要&#xff1a; 解析調控復雜性狀的機制對于推進作物改良至關重要。在此&#xff0c;我們提出了一個全面的水稻&#xff08;Oryza sativa&#xff09;調控組圖譜&#xff0c;涵蓋了來自三個代表性品種的23種不同組織的染色質可及性。我們的研究揭示了117,176個獨特的開放染色…

Linux的壓縮與解壓縮

一、使用tar命令進行打包與解包 1.0、tar命令簡介和常用選項 tar命令是Linux中經常使用的歸檔工具&#xff0c;它的主要功能是【對文件或者目錄進行打包歸檔】&#xff0c;歸檔為一個文件&#xff0c;但是并不進行壓縮&#xff1b;tar命令的歸檔操作效果如下&#xff1a; tar命…

OpenCV+OCR實現弧形文字識別

以下是基于OpenCV與OCR實現弧形文字識別的完整技術方案&#xff0c;結合了圖像預處理、幾何變換與OCR引擎調用等關鍵步驟&#xff0c;并提供優化技巧&#xff1a;&#x1f50d; 一、技術原理弧形文字識別的核心在于??將彎曲文本轉換為水平直線??&#xff0c;便于OCR引擎處理…

【保姆級目標檢測教程】Ubuntu 20.04 部署 YOLOv13 全流程(附訓練/推理代碼)

前言 YOLOv13 是 YOLO 系列的全新一代實時目標檢測框架&#xff0c;在保持極高推理速度的同時顯著提升了檢測精度&#xff0c;廣泛適用于嵌入式部署、工業質檢、智能安防等多種場景。該版本提供了 Nano、Small、Large、X-Large 四種模型規格&#xff0c;用戶可以根據計算資源和…

【大模型】到底什么是Function Calling和MCP,以及和ReAct推理的關系是什么?

文章目錄背景&#xff1a;什么是Agent&#xff1f;背景&#xff1a;為什么需要Function Calling或者MCP&#xff1f;Function Calling和MCP在用戶請求中的整體流程Function Calling&#xff08;函數/工具調用&#xff09;MCP (Model Context Protocol)ReAct (Reasoning and Act…

CANDENCE 17.4 進行元器件緩存更新

在我從立創商城導入CANDENCE元器件后&#xff0c;在ORCAD放置元器件時出現了下面的錯誤解決辦法&#xff1a;1、在左邊找到 Design Cache文件夾&#xff0c;在文件夾上鼠標右擊選擇 Cleanup Cache2、再放置該元器件&#xff0c;不管這個&#xff0c;點擊確定3、這時候成功放上…

深入理解Kafka冪等性:原理、邊界與最佳實踐

一、什么是真正的消息冪等性&#xff1f; 消息系統的冪等性經常被誤解&#xff0c;我們需要明確其精確含義和能力邊界&#xff1a; 1. 正確定義 Kafka冪等性保證的是&#xff1a;在消息傳輸過程中&#xff0c;無論因網絡重試、生產者重啟等故障導致的消息重復發送&#xff0c;B…

【RTSP從零實踐】8、多播傳輸H264碼流的RTSP服務器——最簡單的實現例子(附帶源碼)

&#x1f601;博客主頁&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客內容&#x1f911;&#xff1a;&#x1f36d;嵌入式開發、Linux、C語言、C、數據結構、音視頻&#x1f36d; &#x1f923;本文內容&#x1f923;&a…

【Linux】基礎開發工具(3)

1. 版本控制器Git1.1 Git的簡史Git 的歷史可以追溯到 2005 年1。當時 Linux 內核項目的開發團隊一直使用 BitKeeper 進行版本管理&#xff0c;但由于一位 Linux 開發成員寫了一個連接 BitKeeper 倉庫的外掛&#xff0c;BitMover 公司決定中止 Linux 免費使用 BitKeeper 的授權1…

synchronized 的使用和特性

synchronized 鎖對象 普通方法 synchronized 鎖普通方法時&#xff0c;其鎖的對象是調用該方法的實例 public synchronized void method() { // 方法體 } 靜態方法 靜態方法的鎖對象是所屬的 class&#xff0c;全局只有一個。 public static synchronized void staticMetho…

Gin Web 層集成 Viper 配置文件和 Zap 日志文件指南(下)

在微服務架構中&#xff0c;Gin 常被用作 Web 層框架&#xff0c;而 Viper 用于管理配置文件&#xff0c;Zap 則提供高性能的日志記錄功能。下面將詳細介紹如何在 Gin Web 層集成 Viper 配置文件和 Zap 日志文件。 1. 項目概述 假設我們有一個基于 Go 語言的微服務項目&#…

IoTDB:專為物聯網場景設計的高性能時序數據庫

什么是IoTDB&#xff1f;IoTDB&#xff08;Internet of Things Database&#xff09;是一款開源的時序數據庫管理系統&#xff0c;專為物聯網&#xff08;IoT&#xff09;場景設計&#xff0c;由清華大學軟件學院團隊自研&#xff0c;天謀科技團隊負責維護。它針對物聯網數據的…