Esempio: applicazione App Engine Go

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

Panoramica dell'esempio di codice

Quando viene lanciato il esempio di codice, viene creato un client amministrativo per Bigtable. Utilizza quindi il client per verificare se nell'istanza Bigtable specificata dall'utente è presente una tabella denominata user-visit-counter con una singola famiglia di colonne denominata emails. Se necessario, crea la tabella e la famiglia di 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 utilizzato per tutte le letture e le scritture successive:

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

Infine, l'esempio di codice aggiunge un gestore HTTP alla radice del server App Engine. A ogni richiesta, l'handler chiede all'utente di accedere, se necessario. Poi monitora la visita dell'utente eseguendo un'operazione Increment sulla riga corrispondente all'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, l'handler mostra una pagina HTML che indica il numero totale di visite dell'utente corrente.