Exemple : Application App Engine pour le langage Go

Cet exemple présente une application App Engine écrite en Go, qui fournit une interface Web utilisant Bigtable pour suivre le nombre de visites de votre compte Google. Elle s'exécute localement dans un conteneur Docker ou dans le cloud dans l'environnement flexible d'App Engine. Le code de cette application se trouve dans le dépôt GitHub GoogleCloudPlatform/golang-samples, dans le répertoire bigtable/usercounter.

Présentation de l'exemple de code

Lorsque l'exemple de code est lancé, il crée un client d'administration pour Bigtable. Il utilise ensuite le client pour rechercher dans l'instance Bigtable spécifiée par l'utilisateur une table nommée user-visit-counter, qui comporte une seule famille de colonnes nommée emails. Si nécessaire, il crée la table et la famille de colonnes :

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'exemple de code crée ensuite un seul client Bigtable qui est utilisé pour toutes les lectures et écritures suivantes :

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

Enfin, l'exemple de code ajoute un gestionnaire HTTP à la racine du serveur App Engine. À chaque requête, le gestionnaire invite l'utilisateur à se connecter si nécessaire. Il assure ensuite le suivi de la visite de l'utilisateur en effectuant une opération Increment sur la ligne correspondant à l'adresse e-mail de l'utilisateur :

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

Après avoir incrémenté la ligne, le gestionnaire affiche une page HTML indiquant le nombre total de visites de l'utilisateur actuel.