範例:Go App Engine 應用程式

本範例是一個以 Go 編寫的 App Engine 應用程式,提供使用 Bigtable 追蹤 Google 帳戶造訪次數的網頁介面。本範例會在 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 頁面,列出目前使用者的總造訪次數。