您好,登錄后才能下訂單哦!
這篇文章給大家介紹基于Go SDK操作京東云對(duì)象存儲(chǔ)OSS的入門指南是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助
在實(shí)際操作之前,我們先看一下京東云OSS的API接口支持范圍和能力。從對(duì)象存儲(chǔ)的API文檔可以看到,京東云提供兩套接口:
1、兼容S3 API,支持AWS S3接口,兼容大部分重要功能,作為后續(xù)重點(diǎn)開(kāi)發(fā)和優(yōu)化版本。由于并不是完全兼容S3的接口,因此需要重點(diǎn)閱讀兼容接口列表,相關(guān)介紹見(jiàn)
https://docs.jdcloud.com/cn/object-storage-service/compatibility-api-overview
2、舊版OSS API,京東云前期獨(dú)立封裝的restful接口,支持基本的service、bucket、object等操作。該版本目前仍能使用,但后續(xù)不再開(kāi)發(fā)。
很明顯,京東云提供兼容S3的接口,一方面可以快速支持原有基于AWS S3開(kāi)發(fā)的應(yīng)用程序,另一方面幫助客戶的數(shù)據(jù)從AWS S3遷移過(guò)來(lái)。建議您使用兼容S3的接口,而同時(shí)京東云提供了豐富的多種語(yǔ)言版本的SDK,可以根據(jù)您項(xiàng)目開(kāi)發(fā)的需要進(jìn)行不同語(yǔ)言SDK的選擇。
相關(guān)介紹見(jiàn)
https://docs.jdcloud.com/cn/object-storage-service/introduction-3
這里需要注意查看兼容接口列表,對(duì)比京東云OSS和AWS S3接口的兼容情況。譬如Put Bucket接口僅使用通用的請(qǐng)求header,默認(rèn)創(chuàng)建權(quán)限為private的bucket。由于不支持x-amz-acl, x-amz-grant-*等請(qǐng)求頭,無(wú)法使用標(biāo)準(zhǔn)權(quán)限來(lái)設(shè)置ACL(即Canned ACL)。如果需要?jiǎng)?chuàng)建時(shí)指定bucket ACL,需要通過(guò)另外的接口實(shí)現(xiàn),這個(gè)下文會(huì)提及。
兼容接口列表:
https://docs.jdcloud.com/cn/object-storage-service/compatibility-api-overview
下面以Go SDK介紹京東云OSS的基本操作,實(shí)現(xiàn)對(duì)象資源的上傳下載等功能。
1、安裝或更新Go 1.5及以上版本(參考1 - Mac下安裝Go語(yǔ)言環(huán)境配置)。
2、(可選)通過(guò)可視化IDE Atom搭建Go編譯環(huán)境。相比于sublime text或者傳統(tǒng)的vim編輯方式,Atom是更為先進(jìn)的文本代碼編輯器,是由Github打造的編程開(kāi)發(fā)工具,除了界面美觀,還有各種強(qiáng)大的插件。本文以Atom開(kāi)發(fā)環(huán)境作為展示(參考2 – Mac下基于Atom構(gòu)建Go開(kāi)發(fā)環(huán)境)
3、在使用Go SDK發(fā)起請(qǐng)求之前,需提前在京東云用戶中心賬戶管理下的AccessKey管理頁(yè)面申請(qǐng)accesskey和secretKey密鑰對(duì)(簡(jiǎn)稱AK/SK)。這個(gè)秘鑰對(duì)會(huì)在后續(xù)程序初始化使用到。
1、命令行安裝
go get github.com/aws/aws-sdk-go
2、Atom安裝(可選)
菜單【Packages】-> 【Go】-> 【Get Package】,然后輸入github.com/aws/aws-sdk-go,稍等片刻便下載和安裝完成。代碼會(huì)被下載到GOPATH環(huán)境變量中第一個(gè)路徑src目錄中,效果與命令行安裝方法一樣。
在具體編碼之前,建議了解AWS SDK的構(gòu)成,主要包括SDK core和service clients兩個(gè)部分。SDK core適用于所有AWS的服務(wù),service中的client僅適用于對(duì)應(yīng)的service,作為該服務(wù)的客戶端進(jìn)行調(diào)用。
SDK core包括一些通用的類,幫助更容易地構(gòu)造API參數(shù),譬如Config、Logger等。其中,
awserr:進(jìn)程異常的接口,返回進(jìn)程中遇到的異常和錯(cuò)誤,對(duì)應(yīng)錯(cuò)誤碼和信息。
credential:API調(diào)用需要身份認(rèn)證,需要使用京東云的AK/SK進(jìn)行認(rèn)證,并且需要修改默認(rèn)的Config配置項(xiàng)。
endpoints:服務(wù)的調(diào)用入口,有區(qū)域?qū)傩?,需要在Config中配置。
session:提供配置的初始化,可以自定義配置中的參數(shù)進(jìn)行初始化,包括region、endpoints、credential等。
request:提供API請(qǐng)求和重試,可以自定義請(qǐng)求及其處理方法。
創(chuàng)建s3 client的示例
在發(fā)起OSS(S3協(xié)議)的請(qǐng)求之前,需要初始化s3 client,以下為創(chuàng)建client的例子。
1 ak := "your accesskey" 2 sk := "your secretkey" 3 token := "" //Token留空 4 creds := credentials.NewStaticCredentials(ak, sk, token) 5 _,err := creds.Get() 6 7 config := &aws.Config{ 8 Region: aws.String("cn-north-1"), //Bucket所在Region 9 Endpoint: aws.String("s3.cn-north-1.jcloudcs.com"), //Bucket所在Endpoint 10 DisableSSL :aws.Bool(false), 11 Credentials :creds, 12 } 13 client := s3.New(session.New(config))
創(chuàng)建完s3 client之后,就可以對(duì)bucket、object等oss資源進(jìn)行請(qǐng)求操作了。下面分別介紹創(chuàng)建bucket、上傳文件(PutObject、Upload)、分片上傳文件進(jìn)行demo展示。
創(chuàng)建bucket空間
目標(biāo):在京東云華北區(qū)創(chuàng)建一個(gè)名字為go-sdk-sample的bucket,并設(shè)置ACL為公有讀私有寫(public-read)。
示例代碼:
1 package main 2 3 import ( 4 "fmt" 5 "os" 6 "github.com/aws/aws-sdk-go/aws" 7 "github.com/aws/aws-sdk-go/aws/credentials" 8 "github.com/aws/aws-sdk-go/aws/session" 9 "github.com/aws/aws-sdk-go/service/s3" 10 ) 11 12 func main() { 13 bucket := "go-sdk-sample" 14 // Create S3 service client 15 svc := s3.New(newSession()) 16 17 crParams := &s3.CreateBucketInput{ 18 Bucket: aws.String(bucket), 19 } 20 21 _, err := svc.CreateBucket(crParams) 22 23 if err != nil { 24 exitErrorf("Unable to create bucket %q, %v", bucket, err) 25 } 26 27 // Wait until bucket is created before finishing 28 fmt.Printf("Waiting for bucket %q to be created...\n", bucket) 29 30 err = svc.WaitUntilBucketExists(&s3.HeadBucketInput{ 31 Bucket: aws.String(bucket), 32 }) 33 if err != nil { 34 exitErrorf("Error occurred while waiting for bucket to be created, %v", bucket) 35 } 36 37 fmt.Printf("Bucket %q successfully created\n", bucket) 38 39 puParams := &s3.PutBucketAclInput{ 40 Bucket: aws.String(bucket), 41 } 42 puParams.SetACL("public-read") //set bucket ACL 43 44 _, err = svc.PutBucketAcl(puParams) 45 if err != nil { 46 exitErrorf(err.Error()) 47 } 48 fmt.Println("Set", bucket, "ACL to public-read") 49 50} 51 52 func newSession() *session.Session { 53 ak := " your accesskey " 54 sk := " your secretkey " 55 token := "" //Token留空 56 57 creds := credentials.NewStaticCredentials(ak, sk, token) 58 creds.Get() 59 60 config := &aws.Config{ 61 Region: aws.String("cn-north-1"), //Bucket所在Region 62 Endpoint: aws.String("s3.cn-north-1.jcloudcs.com"), //Bucket所在Endpoint 63 DisableSSL: aws.Bool(false), 64 Credentials: creds, 65 } 66 return session.New(config) 67 } 68 69 func exitErrorf(msg string, args ...interface{}) { 70 fmt.Fprintf(os.Stderr, msg+"\n", args...) 71 os.Exit(1) 72 }
示例中可以看出,我們通過(guò)CreatBucket的接口創(chuàng)建bucket,并通過(guò)PutBucketAcl的接口設(shè)置bucket的ACL。目前京東云支持三種訪問(wèn)權(quán)限,包括私有讀寫(private)、公有讀私有寫(public-read)、公有讀寫(public-read-write)。
執(zhí)行結(jié)果:
執(zhí)行成功,控制臺(tái)顯示對(duì)應(yīng)的bucket創(chuàng)建成功。
上傳文件(PutObject)
目標(biāo):把一個(gè)object上傳到bucket中,并加入MD5校驗(yàn)確保數(shù)據(jù)完整性。
示例代碼:
1 package main 2 3 import ( 4 "crypto/md5" 5 "encoding/hex" 6 "fmt" 7 "io" 8 "os" 9 10 "github.com/aws/aws-sdk-go/aws" 11 "github.com/aws/aws-sdk-go/aws/credentials" 12 "github.com/aws/aws-sdk-go/aws/session" 13 "github.com/aws/aws-sdk-go/service/s3" 14) 15 16 func main() { 17 filename := "your file path" //file path 18 19 file, err := os.Open(filename) 20 if err != nil { 21 exitErrorf("Unable to open file %q, %v", err) 22 } 23 defer file.Close() 24 25 md5_file := CreateMd5(filename) 26 27 // Create S3 service client 28 svc := s3.New(newSession()) 29 30 input := &s3.PutObjectInput{ 31 Body: file, 32 Bucket: aws.String("go-sdk-sample"), 33 Key: aws.String(filename), 34 ContentMD5: aws.String(md5_file), //MD5 校驗(yàn)(可選) 35 } 36 37 result, err := svc.PutObject(input) 38 39 if err != nil { 40 exitErrorf("Put Object Error, %v", err) 41 } 42 43 fmt.Println(result) 44 45 } 46 // MD5校驗(yàn) 47 func CreateMd5(filename string) string { 48 49 f, err := os.Open(filename) 50 if err != nil { 51 exitErrorf("Unable to open file %q, %v", err) 52 } 53 defer f.Close() 54 55 md5hash := md5.New() 56 io.Copy(md5hash, f) 57 58 return hex.EncodeToString(md5hash.Sum(nil)) 59 60} 61 62 func newSession() *session.Session { 63 ak := " your accesskey " 64 sk := " your secretkey " 65 token := "" //Token留空 66 67 creds := credentials.NewStaticCredentials(ak, sk, token) 68 creds.Get() 69 70 config := &aws.Config{ 71 Region: aws.String("cn-north-1"), //Bucket所在Region 72 Endpoint: aws.String("s3.cn-north-1.jcloudcs.com"), //Bucket所在Endpoint 73 DisableSSL: aws.Bool(false), 74 Credentials: creds, 75 } 76 return session.New(config) 77 } 78 79 func exitErrorf(msg string, args ...interface{}) { 80 fmt.Fprintf(os.Stderr, msg+"\n", args...) 81 os.Exit(1) 82 }
示例中可以看出,我們通過(guò)PutObject接口上傳本地文件,同時(shí)為了校驗(yàn)數(shù)據(jù)的準(zhǔn)確性,加入了CreateMd5方法生成文件的MD5值,并傳參到ContentMD5中,OSS服務(wù)端會(huì)校驗(yàn)文件,如果為相同值會(huì)返回成功的result,即文件的ETAG值。
執(zhí)行結(jié)果:
可以從控制臺(tái)看到文件已經(jīng)正確上傳,ETag與文件計(jì)算的MD5值相符??梢試L試修改ContentMD5的參數(shù)為其他值,會(huì)返回錯(cuò)誤結(jié)果,這里就不具體展示了。
上傳文件(Uploader)
上面通過(guò)PutObject的方法進(jìn)行文件上傳,那么如果文件比較大,一般通過(guò)分片上傳的方式來(lái)實(shí)現(xiàn)分塊、并發(fā)和重試機(jī)制,確保大,文件的上傳。這里需要用到CreateMultipartUpload、UploadPart、CompletedPart、AbortMultipartUpload等多個(gè)接口來(lái)完成整個(gè)過(guò)程,同時(shí)需要自行實(shí)現(xiàn)重試、并行等邏輯,相對(duì)比較復(fù)雜。S3提供了S3 Upload Manager來(lái)幫助用戶實(shí)現(xiàn)以上邏輯,能夠自動(dòng)判斷文件大小來(lái)選擇單次上傳或分塊上傳的方式來(lái)完成。同時(shí),用戶可以自定義塊大?。≒artSize)、并發(fā)數(shù)(Concurrency)以及最大塊數(shù)量(MaxUploadParts)等參數(shù),滿足不同場(chǎng)景的需要。
示例代碼:
1 package main 2 3 import ( 4 "fmt" 5 "os" 6 7 "github.com/aws/aws-sdk-go/aws" 8 "github.com/aws/aws-sdk-go/aws/credentials" 9 "github.com/aws/aws-sdk-go/aws/session" 10 "github.com/aws/aws-sdk-go/service/s3/s3manager" 11 ) 12 13 func main() { 14 bucket := " go-sdk-sample " //bucket name 15 filename := " your file path " //file url 16 17 file, err := os.Open(filename) 18 if err != nil { 19 exitErrorf("Unable to open file %q, %v", err) 20 } 21 defer file.Close() 22 23 sess := newSession() 24 uploader := s3manager.NewUploader(sess) 25 26 upParams := &s3manager.UploadInput{ 27 Bucket: aws.String(bucket), 28 Key: aws.String(filename), 29 Body: file, 30 } 31 32 // 33 result, err := uploader.Upload(upParams, func(u *s3manager.Uploader) { 34 u.PartSize = 10 * 1024 * 1024 //自定義分塊大小,10M每個(gè)分片 35 u.LeavePartsOnError = true //true,上傳出錯(cuò)會(huì)保留已成功上傳的分塊 36 u.Concurrency = 3 //定義并發(fā)數(shù),即goroutines數(shù)量 37 u.MaxUploadParts = 10000 //定義最大可上傳塊數(shù)量 38 }) 39 40 if err != nil { 41 exitErrorf("Put Object Error, %v", err) 42 } 43 44 fmt.Printf("Successfully uploaded!\n") 45 fmt.Println("File URL: " + result.Location) 46} 47 48 func newSession() *session.Session { 49 ak := " your accesskey " 50 sk := " your secretkey " 51 token := "" //Token留空 52 53 creds := credentials.NewStaticCredentials(ak, sk, token) 54 creds.Get() 55 56 config := &aws.Config{ 57 Region: aws.String("cn-north-1"), //Bucket所在Region 58 Endpoint: aws.String("s3.cn-north-1.jcloudcs.com"), //Bucket所在Endpoint 59 DisableSSL: aws.Bool(false), 60 Credentials: creds, 61 } 62 return session.New(config) 63} 64 65 func exitErrorf(msg string, args ...int,erface{}) { 66 fmt.Fprintf(os.Stderr, msg+"\n", args...) 67 os.Exit(1) 68 }
可以看到,與前面PutObject不同,這里使用s3manager.NewUploader來(lái)構(gòu)造上傳服務(wù),通過(guò)uploader.Upload方法上傳文件。Upload的具體實(shí)現(xiàn)邏輯可以參考源碼:
https://github.com/aws/aws-sdk-go/blob/master/service/s3/s3manager/upload.go
譬如自動(dòng)判斷是否分塊上傳的邏輯如下:
執(zhí)行結(jié)果:
本次上傳的文件大小為16M,比PartSize的10M大,因此會(huì)執(zhí)行分塊上傳。在上傳過(guò)程中,可以在控制臺(tái)-分片管理看到對(duì)應(yīng)正在上傳的分片任務(wù),說(shuō)明正在分片上傳。upload的上傳成功后會(huì)返回文件訪問(wèn)地址location。
至此,我們已經(jīng)把主要的OSS操作示例介紹完畢,其余的操作我們根據(jù)實(shí)際需要繼續(xù)整理,譬如不使用s3manager,直接用MultipartUpload等基礎(chǔ)接口來(lái)實(shí)現(xiàn)分塊上傳,大家可以嘗試一下,我們下回分解。
1、安裝Go
使用brew進(jìn)行安裝,brew是Mac下的一個(gè)包管理工具,類似于CentOS下的 yum,可以很方便地進(jìn)行安裝、卸載和更新各種軟件包。
brew install go
安裝后在終端輸入go version查看安裝的版本,我的顯示go version go1.12.5 darwin/amd64,表示安裝的是v1.12.5版本。
2、配置環(huán)境變量
查看go的環(huán)境變量設(shè)置
go env
1、安裝Atom
https://atom.io/ Atom官網(wǎng),可以直接下載軟件安裝。
2、安裝Go語(yǔ)言環(huán)境(參考1的步驟)
3、安裝go-plus插件
go-plus是Atom上面的一款開(kāi)源的Golang開(kāi)發(fā)環(huán)境插件,項(xiàng)目地址:
https://github.com/joefitzgerald/go-plus
在Atom中的Preference中可以找到install菜單,輸入go-plus。
點(diǎn)擊:install,就會(huì)開(kāi)始安裝go-plus,go-plus插件會(huì)自動(dòng)安裝對(duì)應(yīng)的依賴插件,如果沒(méi)有安裝對(duì)應(yīng)的Golang類庫(kù)可以使用go get安裝。
安裝完我們就可以進(jìn)行編碼,為了方便編譯、測(cè)試和編譯,需要配合terminal使用,可以通過(guò)view-Terminal打開(kāi)終端,不需要另外切換界面。
go-plus有非常多的特性,能夠?qū)崟r(shí)反饋語(yǔ)法錯(cuò)誤和編譯錯(cuò)誤。每保存一個(gè)文件,go-plus就會(huì)在后臺(tái)運(yùn)行你提前配置好的要執(zhí)行的go tools,例如:go vet、 go oracle、go build等等,然后將錯(cuò)誤和警告在編輯器底部顯示出來(lái)。
go-plus同樣能夠在編輯器的對(duì)應(yīng)行上顯示該行的編譯錯(cuò)誤提示和錯(cuò)誤信息,這樣你就能很快的定位哪一行有錯(cuò)。大家可以嘗試一下。
關(guān)于基于Go SDK操作京東云對(duì)象存儲(chǔ)OSS的入門指南是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。