Go Cloud項目開源發(fā)布:Go語言將成為云端應用開發(fā)的首選語言?(go語言開發(fā)云平臺)
作者 | The Go Blog
編輯 | 張嬋 – 高效開發(fā)運維公眾號
Go 語言團隊發(fā)布了一個新的開源項目 Go Cloud,用于開發(fā)具有可移植性的云端應用程序。
7 月 24 日,Go 語言團隊發(fā)布了一個新的開源項目 Go Cloud。Go Cloud 是一個可在開放云平臺上進行開發(fā)的庫和工具集,旨在讓 Go 語言成為開發(fā)構建可移植云端應用程序的首選語言。
1 為什么瞄準具有可移植性的云端編程?為什么是現(xiàn)在?
谷歌的 Go 語言是當今發(fā)展最快的編程語言之一,在全球擁有約 100 萬的活躍開發(fā)人員。Go 語言為包括 Kubernetes,Istio 和 Docker 在內的許多關鍵云基礎架構項目提供支持,并憑借其高效性,內置并發(fā)性和低延遲受到很多云端開發(fā)人員的喜愛。
Go 語言團隊從合作伙伴當中了解到,很多公司都對跨云的可遷移性有共同的需求,他們想要在多云或混合云環(huán)境中部署健壯的應用程序,并希望無需對代碼進行大量更改就能在不同的云服務之間遷移工作負載。
為實現(xiàn)這一目標,一些團隊嘗試將應用程序與特定云服務的 API 分離,以生成更簡單,更可移植的代碼。然而,功能的快速迭代需求必將犧牲長期的可移植性。因此,云中運行的大多數 Go 應用程序都與其初始云服務緊密耦合。
現(xiàn)在,團隊可以使用 Go Cloud(一組開放的通用云端 API)編寫更簡單,可移植的云端應用程序。Go Cloud 使團隊能夠實現(xiàn)其功能開發(fā)目標,同時能保持在多云和混合云架構中遷移的靈活性。
2 Go Cloud 是什么
Go 語言團隊識別了云端應用程序使用的通用服務,并創(chuàng)建了可跨云進行應用的通用 API。Go Cloud 采用 blob 存儲,可訪問 MySQL 數據庫,可進行運行時配置,還有一個具有內置日志記錄,跟蹤和運行狀況檢查的 HTTP 服務器。Go Cloud 目前提供對 Google Cloud Platform(GCP)和 Amazon Web Services(AWS)的支持。后期 Go 團隊計劃與其他云服務和 Go 語言社區(qū)合作,盡快為其他云廠商添加支持。
Go Cloud 旨在為各種云中最常用的服務提供中立于廠商的 API,這樣可以輕松地將 Go 應用程序進行跨云遷移。Go Cloud 還為其他編寫跨云的庫的開源項目奠定了基礎。來自社區(qū)各級各類開發(fā)人員的反饋將決定 Go Cloud 中未來 API 的優(yōu)先級。
3 如何使用 Go Cloud
Go Cloud 的核心是一組進行便攜云端編程的通用 API 集合。 我們來看一個使用 blob 存儲的例子。你可以使用 * blob.Bucket 這個通用類型將文件從本地磁盤復制到云服務中。 首先使用附帶的 s3blob 包打開一個 S3 bucket:
// setupBucket opens an AWS bucket. func setupBucket(ctx context.Context) (*blob.Bucket, error) { // Obtain AWS credentials. sess, err := session.NewSession(&aws.Config{ Region: aws.String("us-east-2"), }) if err != nil { return nil, err } // Open a handle to s3://go-cloud-bucket. return s3blob.OpenBucket(ctx, sess, "go-cloud-bucket") }
一旦程序有了* blob.Bucket,就可以創(chuàng)建一個可以實現(xiàn) io.Writer 的 blob.Writer。 然后這個程序程序可以使用 * blob.Writer 將數據寫入 bucket,確保 Close 不會報告錯誤。
ctx := context.Background b, err := setupBucket(ctx) if err != nil { log.Fatalf("Failed to open bucket: %v", err) } data, err := ioutil.ReadFile("gopher.png") if err != nil { log.Fatalf("Failed to read file: %v", err) } w, err := b.NewWriter(ctx, "gopher.png", nil) if err != nil { log.Fatalf("Failed to obtain writer: %v", err) } _, err = w.Write(data) if err != nil { log.Fatalf("Failed to write to bucket: %v", err) } if err := w.Close; err != nil { log.Fatalf("Failed to close: %v", err) }
注意:使用 Bbucket 的邏輯不適用于AWS S3。通過更改用于打開 * blob.Bucket 的功能,Go Cloud 可以交換云端存儲。這樣應用程序可以使用 gcsblob.OpenBucket 構建一個 * blob.Bucket,不更改復制文件的代碼就能使用 Google Cloud Storage:
// setupBucket opens a GCS bucket. func setupBucket(ctx context.Context) (*blob.Bucket, error) { // Open GCS bucket. 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 } // Open a handle to gs://go-cloud-bucket. return gcsblob.OpenBucket(ctx, "go-cloud-bucket", c) }
雖然訪問不同云服務中的 bucket 需要不同的步驟,但應用程序使用的結果類型是一樣的:* blob.Bucket。這將應用程序代碼與特定云服務的代碼隔離開來。為了提高與現(xiàn)有 Go 庫的互操作性,Go Cloud 利用了 io.Writer,io.Reader 和 * sql.DB 等已建立的接口。
4 如何開始
官方教程地址:
https://github.com/google/go-cloud/tree/master/samples/tutorial
可按照此教程進行操作并嘗試自行構建應用程序。如果你已經在使用 AWS 或 GCP,可以嘗試遷移現(xiàn)有的應用程序的一部分來嘗試使用 Go Cloud。如果你使用的是其他云服務或本地服務,則可以通過實現(xiàn)驅動程序接口(如 driver.Bucket)來擴展 Go Cloud 進行支持。
Go Cloud 開源地址:
https://github.com/google/go-cloud