Ejemplo: aplicación de App Engine en Go

Este ejemplo es una aplicación de App Engine escrita en Go que proporciona una interfaz web que usa Bigtable para monitorizar el número de visitas de tu cuenta de Google. Se ejecuta de forma local en un contenedor Docker 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.

Información general sobre el código de ejemplo

Cuando se inicia el código de ejemplo, se crea un cliente administrativo para Bigtable. A continuación, usa el cliente para comprobar si la instancia de Bigtable especificada por el usuario tiene una tabla llamada user-visit-counter con una sola familia de columnas llamada 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()

A continuación, el ejemplo de código crea un único cliente de Bigtable que se usa 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 ejemplo añade un controlador HTTP a la raíz del servidor de App Engine. En cada solicitud, el controlador pide al usuario que inicie sesión si es necesario. A continuación, se hace un seguimiento de la visita del usuario realizando una operación Increment en la fila correspondiente a la dirección de correo 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 incrementar la fila, el controlador muestra una página HTML con el número total de visitas del usuario actual.