Beispiel: Go App Engine-Anwendung

Dieses Beispiel ist eine in Go geschriebene App Engine-Anwendung, die stellt eine Weboberfläche zur Verfügung, die mithilfe von Bigtable die Anzahl der Besuche von deinem Google-Konto aus. Sie läuft lokal in einem Docker-Container oder in der Cloud in der flexiblen Umgebung von App Engine. Der Code für die Anwendung ist im GitHub-Repository GoogleCloudPlatform/golang-samples im Verzeichnis bigtable/usercounter enthalten.

Überblick über das Codebeispiel

Wenn das Codebeispiel ausgeführt wird, erstellt es einen administrativen Client für Bigtable. Anschließend wird mit dem Client die vom Nutzer angegebene Bigtable-Instanz auf eine Tabelle mit dem Namen user-visit-counter mit einer einzelnen Spaltenfamilie mit dem Namen emails geprüft. Wenn nötig, erstellt es die Tabelle und die Spaltenfamilie.

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()

Das Codebeispiel erstellt dann einen einzelnen Bigtable-Client, der für alle folgenden Lese- und Schreibvorgänge verwendet wird:

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

Schließlich fügt das Codebeispiel zum Stamm des App Engine-Servers einen HTTP-Handler hinzu. Bei jeder Anfrage, leitet der Handler den Nutzer zum Anmelden weiter, falls nötig. Er beobachtet dann die Besuche des Nutzers, da er einen Increment-Vorgang auf die Zeile der E-Mail-Adresse des Nutzers anwendet.

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}
}

Nach der Inkrementierung der Zeile zeigt der Handler eine HTML-Seite mit den gesamten Besuchen des aktuellen Nutzers an.