
在编程语言界,谷歌的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(尤其是国内各家云,连文档都不完善)。
欢迎关注虫虫,给虫虫点赞,虫虫会持续给大家普及相关知识和信息。