Ejemplo: aplicación Go App Engine

Este ejemplo es una aplicación de App Engine, escrita en Go, que ofrece una interfaz web que usa Bigtable para hacer un seguimiento de la cantidad de las visitas de tu Cuenta de Google. Se ejecuta en un contenedor de Docker local o en la nube, en el entorno flexible de App Engine. El código de esta aplicación se encuentra en el repositorio de GitHub GoogleCloudPlatform/golang-samples, en el directorio bigtable/usercounter.

Descripción general del código de muestra

Cuando se inicia el código de muestra, se crea un cliente administrativo para Bigtable. Luego, usa el cliente a fin de comprobar la instancia de Bigtable especificada por el usuario para una tabla llamada user-visit-counter, con una sola familia de columnas denominada emails. Si es necesario, crea la tabla y la familia de columnas:

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

Luego, el código de muestra crea un solo cliente de Bigtable que se use para todas las lecturas y escrituras posteriores:

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

Por último, el código de muestra agrega un controlador HTTP a la raíz del servidor de App Engine. En cada solicitud, el controlador le pide al usuario que acceda a su cuenta si es necesario. Luego, realiza un seguimiento de la visita del usuario mediante una operación Increment en la fila de la dirección de correo electrónico del usuario:

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

Después de aumentar la fila, el controlador muestra una página HTML en la que aparece la cantidad total de visitas del usuario actual.