在編程語言界,谷歌的Golang語言可以說是當下最流行的語言之一,據官方數據全球約有100萬活躍碼農在使用Golang開發。同時雲計算也是目前技術發展最快的一個領域,並且改變了我們的基礎IT架構:大量的網站、應用開始遷移到雲上。為了應對這種趨勢,促進Golang在雲計算領域的繁榮(當然在容器領域 Golang開發的docker是一枝獨秀的),谷歌最近推出了Go Cloud(github地址: google/go-cloud),包括開源庫和一套工具,可以讓每個碼農更輕鬆地使用Golang構建雲應用程序。
功能和特性
Go Cloud為開發人員提供了一組用於訪問對象存儲(比如AWS S3),MySQL數據庫和運行時配置的開放式通用雲API。還提供內置了一個支持日誌記錄、跟蹤和運行狀況檢查的HTTP服務器。截止目前,還主要提供對亞馬遜AWS和Google Cloud Platform支持。谷歌計劃,未來會添加更多的功能以及支持更多雲廠商,谷歌也歡迎各雲廠商根據現有的類庫擴展建立自己適配開發支持。
安裝部署
安裝部署很簡單:
go get github.com/google/go-cloud
go get github.com/google/go-cloud/wire/cmd/wire
實例:
鏈接到GCP並認證:
package main
import (
"context"
"flag"
"log"
"github.com/google/go-cloud/blob"
"github.com/google/go-cloud/blob/gcsblob"
"github.com/google/go-cloud/gcp"
)
func main() {
ctx := context.Background()
var (
b *blob.Bucket
err error
)
switch *cloud {
case "gcp":
b, err = setupGCP(ctx, *bucketName)
case "aws":
b, err = setupAWS(ctx, *bucketName)
default:
log.Fatalf("Failed to recognize cloud. Want gcp or aws, got: %s", *cloud)
}
if err != nil {
log.Fatalf("Failed to setup bucket: %s", err)
}
}
func setupGCP(ctx context.Context, bucket string) (*blob.Bucket, error) {
creds, err := gcp.DefaultCredentials(ctx)
if err != nil {
return nil, err
}
c, err := gcp.NewHTTPClient(gcp.DefaultTransport(), gcp.CredentialsTokenSource(creds))
if err != nil {
return nil, err
}
// The bucket name must be globally unique.
return gcsblob.NewBucket(ctx, bucket, c)
}
鏈接到AWS 並認證:
package main
import (
// ...
// listing only new import statements
"github.com/aws/aws-sdk-go/aws"
"github.com/aws/aws-sdk-go/aws/credentials"
"github.com/aws/aws-sdk-go/aws/session"
"github.com/google/go-cloud/blob/s3blob"
)
// ... main
func setupAWS(ctx context.Context, bucket string) (*blob.Bucket, error) {
c := &aws.Config{
// 可以直接指定ID或者使用AWS_REGION.
Region: aws.String("us-east-2"),
// credentials.NewEnvCredentials 需要兩個變量參數:
// 1. AWS_ACCESS_KEY_ID, 訪問KeyID
// 2. AWS_SECRET_ACCESS_KEY. 密鑰訪問KEY
Credentials: credentials.NewEnvCredentials(),
}
s := session.Must(session.NewSession(c))
return s3blob.NewBucket(ctx, s, bucket)
}
寫bucket存儲
package main
// No new imports.
func main() {
// ...
w, err := b.NewWriter(ctx, file, nil)
if err != nil {
log.Fatalf("Failed to obtain writer: %s", err)
}
_, err = w.Write(data)
if err != nil {
log.Fatalf("Failed to write to bucket: %s", err)
}
if err := w.Close(); err != nil {
log.Fatalf("Failed to close: %s", err)
}
}
更多例子請參考官方文檔。
展望
谷歌通過推出開源的Go Cloud雲基礎開發框架希望幫助開發人員構建可以在任何支持的雲上運行的應用程序,一次開發,各雲皆行!(Write once, run on any cloud ☁️),希望這個框架能夠減輕開發人員的開發工作,避開各家雲廠商繁瑣,雷點四伏的APK和API(尤其是國內各家雲,連文檔都不完善)。
閱讀更多 蟲蟲安全 的文章