示例:Go App Engine 应用

本示例是一个使用 Go 编写的 App Engine 应用, 它提供了一个使用 Bigtable 跟踪 次访问。该应用在 Docker 容器中本地运行,或者在云端的 App Engine 柔性环境中运行。此应用的代码位于 GitHub 代码库 GoogleCloudPlatform/golang-samplesbigtable/usercounter 目录中。

代码示例概览

代码示例启动后,它会为 Bigtable 创建一个管理客户端。然后,它会使用该客户端查看用户指定的 Bigtable 实例,查找名为 user-visit-counter 的表,该表包含一个名为 emails 的列族。如有必要,它会创建表和列族:

adminClient, err := bigtable.NewAdminClient(ctx, project, instance)
if err != nil {
	log.Fatalf("Unable to create a table admin client. %v", err)
}
tables, err := adminClient.Tables(ctx)
if err != nil {
	log.Fatalf("Unable to fetch table list. %v", err)
}
if !sliceContains(tables, tableName) {
	if err := adminClient.CreateTable(ctx, tableName); err != nil {
		log.Fatalf("Unable to create table: %v. %v", tableName, err)
	}
}
tblInfo, err := adminClient.TableInfo(ctx, tableName)
if err != nil {
	log.Fatalf("Unable to read info for table: %v. %v", tableName, err)
}
if !sliceContains(tblInfo.Families, familyName) {
	if err := adminClient.CreateColumnFamily(ctx, tableName, familyName); err != nil {
		log.Fatalf("Unable to create column family: %v. %v", familyName, err)
	}
}
adminClient.Close()

然后,代码示例会创建一个 Bigtable 客户端,该客户端将用于所有后续的读取和写入操作:

client, err = bigtable.NewClient(ctx, project, instance)
if err != nil {
	log.Fatalf("Unable to create data operations client. %v", err)
}

最后,代码示例会将一个 HTTP 处理程序添加到 App Engine 服务器的根目录。在处理每个请求时,该处理程序会在必要时提示用户登录。然后,它会对用户的电子邮件地址行执行 Increment 操作,以便跟踪用户的访问次数:

tbl := client.Open(tableName)
rmw := bigtable.NewReadModifyWrite()
rmw.Increment(familyName, u.Email, 1)
row, err := tbl.ApplyReadModifyWrite(ctx, u.Email, rmw)
if err != nil {
	return &appError{err, "Error applying ReadModifyWrite to row: " + u.Email, http.StatusInternalServerError}
}

对电子邮件地址行执行递增操作后,该处理程序将显示一个 HTML 页面,上面有当前用户的访问总数。