Exemplo: aplicação Go App Engine

Este exemplo é uma aplicação do App Engine, escrita em Go, que fornece uma interface Web que usa o Bigtable para acompanhar o número de visitas da sua Conta Google. É executado localmente num contentor Docker ou na nuvem no ambiente flexível do App Engine. O código desta aplicação encontra-se no repositório do GitHub GoogleCloudPlatform/golang-samples, no diretório bigtable/usercounter.

Vista geral do exemplo de código

Quando o exemplo de código é iniciado, cria um cliente administrativo para o Bigtable. Em seguida, usa o cliente para verificar a instância do Bigtable especificada pelo utilizador para uma tabela denominada user-visit-counter, com uma única família de colunas denominada emails. Se necessário, cria a tabela e a família de colunas:

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

O exemplo de código cria então um único cliente do Bigtable que é usado para todas as leituras e escritas subsequentes:

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

Por fim, o exemplo de código adiciona um controlador HTTP à raiz do servidor do App Engine. Em cada pedido, o controlador pede ao utilizador para iniciar sessão, se necessário. Em seguida, acompanha a visita do utilizador executando uma operação Increment na linha para o endereço de email do utilizador:

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

Após incrementar a linha, o controlador apresenta uma página HTML que mostra o número total de visitas do utilizador atual.