Exemplo: aplicativo do App Engine em Go

Este exemplo é um aplicativo do App Engine, escrito em Go, que tem uma interface da Web que usa o Bigtable para rastrear o número de visitas da sua Conta do Google. Ele é executado localmente em um contêiner do Docker ou na nuvem no ambiente flexível do App Engine. O código desse aplicativo está no repositório do GitHub GoogleCloudPlatform/golang-samples, no diretório bigtable/usercounter.

Visão geral do exemplo de código

Quando o exemplo de código é lançado, é criado um cliente administrativo para o Bigtable. Em seguida, ele usa o cliente para verificar a instância do Bigtable especificada pelo usuário de uma tabela chamada user-visit-counter, com um único grupo de colunas chamado emails. A tabela e o grupo de colunas são criados, se necessário:

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 então cria um único cliente do Bigtable que é usado para todas as leituras e gravações subsequentes:

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

Finalmente, o exemplo de código adiciona um gerenciador de HTTP à raiz do servidor do App Engine. Em cada solicitação, o gerenciador solicita que o usuário faça login, se necessário. Em seguida, ele rastreia a visita do usuário executando uma operação Increment na linha do endereço de e-mail do usuário:

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

Depois que a linha for incrementada, será exibida no gerenciador uma página HTML com o número total de visitas do usuário atual.