Esempio: applicazione Go App Engine

Questo esempio è un'applicazione App Engine, scritta in Go, che fornisce un'interfaccia web che utilizza Bigtable per monitorare il numero di visite provenienti dal tuo Account Google. Viene eseguita localmente in un container Docker o nel cloud nell'ambiente flessibile di App Engine. Il codice per questa applicazione si trova nel repository GitHub GoogleCloudPlatform/golang-samples, nella directory bigtable/usercounter.

Panoramica dell'esempio di codice

Quando viene lanciato, l'esempio di codice crea un client amministrativo per Bigtable. Quindi utilizza il client per controllare l'istanza Bigtable specificata dall'utente per una tabella denominata user-visit-counter, con una singola famiglia di colonne denominata emails. Se necessario, crea la famiglia di tabelle e colonne:

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

L'esempio di codice crea quindi un singolo client Bigtable che viene utilizzato per tutte le letture e scritture successive:

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

Infine, nell'esempio di codice viene aggiunto un gestore HTTP alla directory radice del server App Engine. A ogni richiesta, il gestore chiede all'utente di accedere, se necessario. Quindi, monitora la visita dell'utente eseguendo un'operazione Increment sulla riga dell'indirizzo email dell'utente:

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

Dopo aver incrementato la riga, il gestore visualizza una pagina HTML che mostra il numero totale di visite dell'utente corrente.