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 del esempio di codice

Quando viene avviato, il esempio di codice crea un client amministrativo per Bigtable. Il client viene quindi utilizzato 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 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()

Il esempio di codice crea quindi un singolo client Bigtable che viene utilizzato per tutte le operazioni di lettura e scrittura 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, il gestore chiede all'utente di accedere, se necessario. Successivamente, tiene traccia della visita dell'utente eseguendo un'operazione Increment sulla riga per l'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.